今年MCU价格暴涨,打算入坑国产MCU,最近趁着有空加工了一块华大的HC32F460评估板。成品板见图1。拿到新控制器,首先要做的就是编写底层BOOT程序,有了BOOT程序即可随时更新APP不被调试器束缚,特别对于物联网应用有远程接口就可轻松实现远程APP更新,极大的简化了升级工作量。目前经过试验发现HC32F460的APP跳转有2大坑。

1、FLASH和中断向量偏移后生成的BIN文件大小不对,烧录后无法正常跳转到APP。

2、跳转到APP后触发中断会死机。

下面针对这两个问题记录实验过程并给出解决方案。

图1 自制HC32F460评估板

相比于STM32,HC32F460的IAP和APP跳转是有些不同之处的。STM32下在使用IAR开发环境引导APP时,只需要修改ICF文件中的地址偏移(包括中断向量偏移和FLASH地址偏移)以及SystemInit函数中的SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET即可。这样编译后的BIN文件可以直接加载。但是HC32F460却有些特殊。见官方用户手册中《初始化配置》一节。如图2

图2 初始化配置说明

所以在IDE的链接过程中是额外增加了一部分内容到FLASH地址400H-41fH的。故而在APP中会产生一段空代码段,导致偏移后的BIN文件特别大。例如博主设定的FLASH地址偏移是0x12000,但是编译后的BIN文件却又110KB,实际的有效代码段是31KB。使用UltraEdit打开BIN文件后发现文件中0x12000地址前填充了大量的空白字符。而且使用BOOT程序将BIN文件烧写到FLASH后也不能正常启动。HC32F460地址偏移后的ICF链接文件如图3所示:

图3 HC32F460地址和中断偏移设置

解决方案(问题1):看来仅更改ICF文件是不行的,经检查发现真实的程序区需要从地址0x11c00处才开始,见图4。所以博主直接将0x11c00前的区域数据全部删除。得到的有效APP大小大约31KB。使用BOOT程序烧录并跳转后程序开始运行。

图4 有效程序区

解决方案(问题2):虽然这时APP已经可以正常运行但是在发送串口数据APP进入中断时却发生了另一个问题,MCU居然死机。后经查询相关资料发现,原来在跳转APP之前需要将BOOT程序中已经注册的在使用的中断函数解除注册。具体的方法是调用enIrqResign函数。为方便起见博主直接将所有的中断全部解除注册(解除注册是在BOOT程序中,可能在APP中初始时也可以,各位可以自行测试)。

 void BOOT_JumpToApp(void){uint32_t JumpAddr;pBootFun pFun2App;uint32_t Cnt;//禁止中断////__disable_interrupt();//__disable_irq();//跳转前释放中断///*enIrqResign(Int000_IRQn);enIrqResign(Int001_IRQn);enIrqResign(Int002_IRQn);enIrqResign(Int003_IRQn);enIrqResign(Int004_IRQn);*/for(Cnt = 0; Cnt < Int143_IRQn; Cnt++){enIrqResign(Cnt);}//if (((*(__IO uint32_t*)APP_START_ADDR) & 0x2FFE0000 ) == 0x20000000)//{JumpAddr = *(__IO uint32_t*) (APP_START_ADDR + 4);pFun2App = (pBootFun)JumpAddr;__set_MSP(*(__IO uint32_t*) APP_START_ADDR);pFun2App();//}}

至此,HC32F460系列的BOOT引导程序和APP程序编写测试完成。博主自定义的HC32F460-FLASH分配表下表所示,BOOT程序串口更新用上位机如图5所示:

0 0 Sector0 8*8=64KB的BOOT
8192 2000 Sector1
16384 4000 Sector2
24576 6000 Sector3
32768 8000 Sector4
40960 A000 Sector5
49152 C000 Sector6
57344 E000 Sector7
65536 10000 Sector8 8KB的参数区域
73728 12000 Sector9 26*8=208KB的APP区域
81920 14000 Sector10
90112 16000 Sector11
98304 18000 Sector12
106496 1A000 Sector13
114688 1C000 Sector14
122880 1E000 Sector15
131072 20000 Sector16
139264 22000 Sector17
147456 24000 Sector18
155648 26000 Sector19
163840 28000 Sector20
172032 2A000 Sector21
180224 2C000 Sector22
188416 2E000 Sector23
196608 30000 Sector24
204800 32000 Sector25
212992 34000 Sector26
221184 36000 Sector27
229376 38000 Sector28
237568 3A000 Sector29
245760 3C000 Sector30
253952 3E000 Sector31
262144 40000 Sector32
270336 42000 Sector33
278528 44000 Sector34
286720 46000 Sector35 8KB 保留
294912 48000 Sector36 26*8=208KB的IAP区域
303104 4A000 Sector37
311296 4C000 Sector38
319488 4E000 Sector39
327680 50000 Sector40
335872 52000 Sector41
344064 54000 Sector42
352256 56000 Sector43
360448 58000 Sector44
368640 5A000 Sector45
376832 5C000 Sector46
385024 5E000 Sector47
393216 60000 Sector48
401408 62000 Sector49
409600 64000 Sector50
417792 66000 Sector51
425984 68000 Sector52
434176 6A000 Sector53
442368 6C000 Sector54
450560 6E000 Sector55
458752 70000 Sector56
466944 72000 Sector57
475136 74000 Sector58
483328 76000 Sector59
491520 78000 Sector60
499712 7A000 Sector61
507904 7C000 Sector62
516096 7E000 Sector63 8KB 保留

图5 BOOT上位机程序

华大HC32F460的BOOT和IAP说明相关推荐

  1. 华大HC32F460 SPI 驱动 ST7735S LCD显示器

    华大HC32F460 SPI 驱动 ST7735S LCD显示器 前言: STM32改HC32F460 换芯片后发现SPI硬件驱动不了屏了,这个小问题搞了很久,最后用逻辑分析仪,分析时序,然后解决了, ...

  2. 华大HC32F460串口空闲中断+DMA收发配置,记录一下自己遇到的坑

    华大HC32F460串口空闲中断+DMA收发配置,记录一下自己遇到的坑 华大HC32F460串口空闲中断+DMA收发配置,记录一下自己遇到的坑 注:个人笔记,如有错误,还望谅解. STM32 在STM ...

  3. 华大HC32F460芯片

    华大半导体有限公司(简称华大半导体)是中国电子信息产业集团有限公司(CEC)整合旗下集成电路企业而组建的专业子集团,成立于2014年5月8日.华大半导体涵盖设计.制造.封装.测试.EDA等领域,是拥有 ...

  4. 华大HC32F460时钟简介

    最近在学习华大的HC32F460单片机,学习单片机就不得不说说单片机的运行时钟,华大这款单片机的时钟有很多的时钟总线,外设都是挂载在时钟线上运行的, HC32F460的时钟其实就是片内时钟和片外时钟两 ...

  5. 华大HC32F460系列填坑之USART

    问题:使用F460官方串口例程,将波特率设置为9600失败. 原因:通过仿真,发现设置波特率返回的错误信息是ErrorInvalidParameter(误差无效参数).分析华大提供的设置波特率函数,发 ...

  6. 华大HC32F460 SDIO TF卡实验

    目录 1.实验目标 2.实验准备 3.硬件原理 4.驱动代码 5.主流程图 6.实验过程 7.实验扩展 1.实验目标 本实验使用SDIOC一线式读取SD卡相关信息并打印到USB-UART,同时将SD卡 ...

  7. 华大HC32F460 内存使用注意事项(内存bug)

    最近调试HC32F460出现各种奇怪问题,程序不断的从不同位置崩溃,比如增加了堆栈大小(注意,是增加,而且是增加的足够大),修改了一些无关代码,增加了一个啥都不做的线程,等等都会导致程序各种异常,而且 ...

  8. 稀微离线编程器应用笔记:华大HC32F460烧录

    目录 配置烧录文件 烧录演示 配置烧录文件 打开上位机R-Flash-Pro,上位机下载地址:http://www.rx-prog.com/download. 在引导界面选择对应厂商进入主界面,亦或选 ...

  9. 华大HC32F460 MPU6050实验

    1.实验目标 本实验主要通过LCD显示MPU6050温度及坐标. 2.实验准备 硬件搭建:ZW-HC32F460-BZ标准版开发板1套 软件搭建:MDK5.22 3.硬件原理 MPU6050的IIC引 ...

最新文章

  1. 计算机网络实验报告建立校园网,计算机网络实验报告
  2. POJ 3616 Milking Time
  3. post多个参数_如何使用Arjun v1.3挖掘HTTP参数
  4. 雪城大学信息安全讲义 六、输入校验
  5. 自动定位失败_自动化测试01
  6. 测试用例文档_如何设计测试用例
  7. JAVA 同步方法和同步代码块的区别是什么?
  8. PDF怎么转换成PPT?用迅读PDF大师,轻松解决教案问题
  9. simulink入门
  10. iGoogle自定义
  11. Flash按钮操作(画面暂停与播放)
  12. echarts地图设置边界线颜色显示不全
  13. 第十一届蓝桥杯 b组
  14. “毒液” 高危漏洞背后的技术较量
  15. 局部静态变量和全局静态变量
  16. 嵌入式 ssl协议详解
  17. 函数分离常数法 oracle,函数值域之《分离常数法》正确打开方式
  18. Java+MySQL基于Springboot口腔牙科诊所管理系统#毕业设计
  19. 4G无线辐照度传感器说明书
  20. 深度学习之GPU显存与利用率 浅析小结

热门文章

  1. Android : Broadcast
  2. JQuery使用教程
  3. twig ajax异常,php – AJAX调用如何使用TWIG
  4. tp5框架实现推送消息到企业微信机器人(从需求分析、方案设计、研发阐述)
  5. web前端期末大作业 html+css家乡旅游主题网页设计---湖南 登录或注册表单
  6. 模块pygame介绍以及库的下载
  7. 山西思诺腾讯云架构工程师TCA认证如何考取
  8. java创建简单的学生类_Java创建一个学生类步骤代码分享
  9. 求大神讨论:工科男如何找到自己的爱情
  10. C盘扩容,不需要相邻盘清空