在STM32的OTA调试过程中,出现了APP2拷贝到APP1后,跳转到APP1无法执行的问题。
调试时发现的现象,顺序
1、keil烧录Bootloader,烧录APP1,烧录APP2
2、跳转到APP1执行正常,跳转到APP2执行正常
3、执行APP2拷贝到APP1
4、跳转到APP1执行失败
5、重新通过KEIL烧录APP2到APP2区域
6、跳转到APP1执行成功
以上是调试现象,通过调试发现
1、通过调试发现,APP2拷贝到APP1后,两个区域数据是完全一致的,那么拷贝过程错误排除
2、通过现象2发现,跳转到APP1执行正常,跳转到APP2执行正常,跳转功能错误排除
3、通过现象5和6发现,APP1执行正常的前提是重新通过KEIL烧录APP2到APP2区域,那么问题就出在这了。
问题解析:
我在网上找参考资料时,Bootloader和APP1都是直接通过KEIL烧录到MCU的,区别在于Bootloader的keil的设置中,ROM起始地址是0x08000000,APP1起始地址是0x08010000,那么我在编译APP2时,自然就把APP2的ROM起始地址设为0x08040000了,这样问题就出现了。
APP2拷贝到APP1区域后,通过调试发现memory区域的数据,0x08010000开头的数据都是0x08040000,这导致程序执行首先去0x08040000寻找了,但是0x08040000已经被我擦除了,所以肯定无法执行了,然后当我通过KEIL再次下载到APP2区域后,那么再跳转到APP1后,自然就能执行了
所以解决的方法是调试时,APP2的固件keil编译时依旧rom设置为0x08010000,但是固件通过STM32 ST-LINK Utility下载到0x08040000中,这样整个问题就解决了。