最近由于工作需要,在调试STM32的bootloader,中间遇到了很多问题。
之前没有接触过BootLoader,跟着原子哥的IAP来学习的Bootlader原理。写了裸机程序来进行调试,过程还算比较顺利。最后在更新APP(基于RT-Thread的程序)时出现了问题,一直调试了好几天。
裸机bootloader跳转裸机的APP程序没有问题,跳转自身也没有问题。通过JLINK直接读取整个芯片,把APP程序的第二个字(reset_handler的地址)直接写入到0x08000004(默认的reset_handler地址)的位置也可以正常运行APP程序。在网上看了很多网友的问题,但是和我的不太一样,均做了测试进行验证,没有得到解决。最后参考了
https://www.cnblogs.com/rootming/p/10854297.html
这篇文章,对所有中断进行了关闭和清零操作之后,顺利解决。
下面贴出问题代码和正确代码。
缺少中断代码
void iap_load_app(uint32_t appxaddr)
{
if (((*(vu32 *)appxaddr) & 0x2FFE0000) == 0x20000000)
{
jump2app = (iapfun)*(vu32 *)(appxaddr + 4);
MSR_MSP(*(vu32 *)appxaddr);
jump2app();
}
}
已经添加中断代码,正常运行
void iap_load_app(uint32_t appxaddr)
{
if (((*(vu32 *)appxaddr) & 0x2FFE0000) == 0x20000000)
{
jump2app = (iapfun)*(vu32 *)(appxaddr + 4);
MSR_MSP(*(vu32 *)appxaddr);
for (int i = 0; i < 8; i++)
{
NVIC->ICER[i] = 0xFFFFFFFF;
NVIC->ICPR[i] = 0xFFFFFFFF;
}
HAL_RCC_DeInit();
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
jump2app();
}
}
感谢网友的分享!!!