一、问题描述
bootloader跳转到APP时,app执行完初始化程序后死机?
二、分析问题
第一步,执行app时死机死到哪里?通过DEBUG调试发现死到hardfault_handler()函数中,硬件错误,导致硬件错误的原因一般都是中断异常引起的。
第二步,找到问题,然后分析什么原因导致硬件错误?一般bootloader跳转到APP时要关闭app中用到的中断,那么查看系统中用到的中断:串口中断、滴答定时器中断,所以,跳转之前要关闭这两个中断:_disable_irq()和systick。
三、解决问题
关闭中断之后,跳转执行app正常。
void iap_load_app(u32 appxaddr)//
{
SysTick->CTRL = 0X00;//禁止SysTick
SysTick->LOAD = 0;
SysTick->VAL = 0;
__disable_irq();
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
四,结论
1.bootloader跳转到app之前要关闭app中用到的中断,不然就会出现硬件错误导致死机;
2.对app的内部机制要比较了解,比如:用到哪些中断、外设,这样遇到问题才能更好分析,不要停留在会用层面,一定要了解透彻,这样无论遇到什么问题,都能有一个正确的分析思路。