之前的项目一直使用IAP跳转到APP很顺利,新项目需要实现APP跳转到IAP,一开始想的挺简单的,就直接在APP里把地址跳到IAP就行,结果发现是可以执行到IAP的main函数,然后就卡死了。卡死的位置在
startup文件的第273行。感觉是中断向量表有问题, 因为在APP中是做了中断向量表偏移的,
于是在IAP的开始,也加上了SCB->VTOR = FLASH_BASE; 认为这样就能把中断表给偏移回来,结果没什么变化, 然后在APP里跳转IAP之前,禁止总中断,清各种的中断标志,结果还是照旧。
最后没办法,在APP里,跳转前先软复位,然后在main第一行跳转到IAP才行了。感觉还是中断表哪里没搞对,待以后继续研究。
int nAPPToIAPFlag =0; //重要,必须要赋值,不然软重启后之前赋值了1也会再次清理成0, 具体原因可查看 ARM的RO ZI 区的定义。
if(升级文件下载完毕)
{
nAPPToIAPFlag = 1;
System_SoftReset(); //升级成功后,延时3秒重启
}
int main(void)
{
int i;
if(nAPPToIAPFlag == 1){
nAPPToIAPFlag = 0;
iap_load_app(0x8000000);
}
/*****************************2021-8-21补充***********************************************/
发现了跳到 startup文件的第273行 .B这里的原因, 是IAP程序中有开启定时器3,虽然跳转时关闭了定时器但没清中断标志,APP中有使用到这个定时器3,因使用的查询方式,偷懒未定义中断入口函数, ENABLE TIM3后, TIM3找不到中断入口。导致跳到.B