IAP: 0x8000000 0x10000 flash
APP:0x8010000 0x70000 flash
IAP:
定时跳转
if(IAP_JUMP_APP_Count > 30)
{
IAP_JUMP_APP_Count = 0;
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}
APP:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x10000);
__enable_irq();
if(APP2IAP_Flag == 1)
{
APP2IAP_Flag = 0;
clr_screen();
dis_word(7,80,"Bootloader",0);
delay_ms(100);
__disable_irq();
Sys_Soft_Reset();
//iap_load_app(FLASH_IAP_ADDR);//执行FLASH IAP代码
}
遇到问题:
1.IAP定时3s跳到APP,第一次烧录IAP,不会跳转,程序一直为IAP时,串口烧录APP,自动跳转至APP;
2.跳转至APP后,串口发送指令跳回IAP,烧录APP会引起死机;
3.死机原因:在APP中有CAN、定时器等中断,__disable_irq();关闭后,在IAP中又有__enable_irq(),导致没有相应的中断服务函数;
4.为解决上述问题,在跳转之前软件复位系统Sys_Soft_Reset();。
其他方法,即__disable_irq()后在IAP不调用__enable_irq(),会导致串口中断也无法进入,该方法不可取;
5.在APP中不调用__disable_irq(),逐个关闭中断(CAN TIM等),麻烦。