华大HC32F460的BOOT和IAP说明

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

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

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

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

HC32F460评估板
图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上位机程序

 

 

 

猜你喜欢

转载自blog.csdn.net/jjp969988159/article/details/114976562