IAP(In Application Programming)
,指用户程序在运行过程时能对用户Flash区域进行烧写,目的是为了用户可以方便地通过用户自己预留的通信接口,对用户产品中的固件程序进行更新升级。本方案中采用后台式DFU双区升级模式进行用户APP程序的升级。DFU(DeviceFirmwareUpdate)也就是设备固件升级的意思。
跳转出现问题:
1.IAP跳APP,app跳回IAP时出现串口中断无用?
判断为中断遗失,无法触发接收中断导致,在APP程序跳转时无清除中断标志,将跳转函数移出中断回调函数解决。
IAP起始地址:0x0
APP起始地址:0x44000
IAP跳转APP:
void jump_to_app(void)
{
pfun __jump;
__set_PRIMASK(1); //关闭总中断
SCB->VTOR =APP_START_ADDR; //中断向量重新映射
__set_PRIMASK(0); //开启总中断
if(((*(volatile uint32_t*)APP_START_ADDR) & 0x2FFD0000 ) == 0x20000000) /* 栈顶地址:0x20000000 ~ 0x20002000 */
{
__jump = (pfun)(*(volatile uint32_t*)(APP_START_ADDR + 4)); /* 用户代码区第二个字为复位向量 */
__set_MSP(*(volatile uint32_t*)(APP_START_ADDR)); /* 初始化APP堆栈指针,用户代码区的第一个字为栈顶地址 */
__jump(); /* 跳转到应用代码 */
}
else
{
printf("栈顶地址不合法!\r\n");
}
}
APP跳转IAP:
void jump_to_iap(void)
{
pfun __jump;
__set_PRIMASK(1); //关闭总中断
for(int i=0;i<8;i++)
{
NVIC->ICER[i] =0xffffffff;
}
SCB->VTOR =IAP_START_ADDR; //中断向量重新映射
__set_PRIMASK(0); //开启总中断
__set_CONTROL(0);
if(((*(volatile uint32_t*)IAP_START_ADDR) & 0x2FFD8000 ) == 0x20000000) /* 栈顶地址:0x20000000 ~ 0x20002000 */
{
__jump = (pfun)(*(volatile uint32_t*)(IAP_START_ADDR + 4)); /* 用户代码区第二个字为复位向量 */
__set_MSP(*(volatile uint32_t*)(IAP_START_ADDR)); /* 初始化APP堆栈指针,用户代码区的第一个字为栈顶地址 */
__jump(); /* 跳转到应用代码 */
}
else
{
printf("栈顶地址不合法!\r\n");
}
}