M4FP 芯片 IAP程序和APP程序互相跳转

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");
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43673603/article/details/128714357
今日推荐