第一次在HAL库上做IAP,不太熟悉库结构,被坑了一早上…
MCU上做了一个shell,实现了goto命令跳转到APP区执行(只是为了开发时方便)。跳转到APP前和以前一样清理了所有初始化过的外设,也对中断进行了处理,然后修改指针、执行跳转。
app.bin 中SP、PC如下所示:
shell打印结果:
跳转前从串口打印出来的消息显示地址和栈都是正确的,硬件仿真的时候也能看到寄存器被正确设置,但跳转后也确实死机了!
很迷茫,刚开始以为有中断没关完,反复查了几次却没发现有问题的地方。APP那边的程序也试过,正常可以跑,就是BootLoader一跳转过去就死机。
之后在跳转前又把时钟源改成内部时钟,然后再跳转,还是死机!
无可奈何之下再一次从头翻源码,.s 文件调用SystemInit()后调用main(),main()内部又调用HAL_Init(),此时,怀疑HAL内是不是还做了什么别的事情,之后在跳转前调用了一次 HAL_DeInit()
好家伙,终于可以跳过去了!