例子是用CAN来传输的,仅为了验证IAP的跳转,在此处记录一些遇到的问题及处理方式,中间也借鉴了很多网上各路大神的处理方式。
1.跳转进HardFault_Handler:
跳转前加上这俩句很重要
__disable_irq();
__disable_fault_irq();
2.Cube IDE生成和KEIL生成的BIN文件栈顶数据不一样:
if (((*(__IO uint32_t*)ADDR_FLASH_SECTOR_2) & 0x2FF00000 ) == 0x20000000)
判断栈顶数据是否合格,IDE中F4芯片APP生成的BIN文件其栈顶数据与Keil生成的栈顶数据不同,所以使用0x2FF00000来判断栈顶数据。使用0x2FFE0000不兼容KEIL和IDE(栈顶数据0x20020000),测试发现KEIL编译的APP可以使用。
3.Cube IDE生成的APP文件跳转无法执行而KEIL生成的可以:
可能是APP的Main函数入口地址不对,IDE生成的文件也需要像KEIL一样进行内存偏移,因为我的IAP内存占用<32KB,所以在APP中需将其Flash地址进行行地址偏移再生成BIN文件;由于F4是块擦除,用的前俩个块是16KB,为了防止地址冲突APP存在了第3块内存往后。
1)例如在STM32F407VETX_FLASH.Id更改如下:
2)system_stm32f4xx.c更改如下
4.不要在CAN接收邮箱回调中进行跳转,跳了会卡死,亲测。
5.自己写的传输BIN文件的软件记住一定要确定是否发送的数据是正确的,我写的发送程序没注意逻辑里面少发了几个,没发全,导致程序跳转不执行。