如何做APP跳转到IAP的程序?

2019-07-21 04:23发布

想做一个从APP到IAP无缝跳转进行程序升级的程序,刚做了一个,发现能从APP程序转到IAP,但不能正常运行,不知道是不是堆栈没有做好,一从APP跳转到IAP,能执行一小段IAP和程序,然后就死机了,因为没法用Debug调试,不知道问题错在哪里,请各位指点迷津。
下面是跳转代码:
#define FLASH_IAP_ADDR                0x08000000          //IAP程序起始地址(存放在片内FLASH)
void app_load_iap(u32 iapxaddr)
{
        if(((*(vu32*)iapxaddr)&0x2FFE0000) == 0x20000000)        //检查栈顶地址是否合法
        {
                jumptoiap = (iapfun)*(vu32*)(iapxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)
                MSR_MSP(*(vu32*)iapxaddr);                                        //初始化IAP堆栈指针(IAP代码区的第一个字用于存放栈顶地址)
                jumptoiap();                                                        //跳转到IAP
        }
}

void IAP_Command(void )
{
        app_load_iap(FLASH_IAP_ADDR);
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
SUM
2019-07-21 17:10

我也遇到这个问题,用地址跳转回iap卡死在iap_load_app(FLASH_IAP_ADDR);但是用 NVIC_SystemReset();复位跳回iap是可以的,但是我就在想,假如我做了两个app程序,需要来回跳转的话,那不是每次都要切换回来iap,再跳到另一个app,不能直接从app1跳到app2???
void app_to_isp(void)
{
          u32 temp=0;
          printf("app --> isp strat ");
          printf("清除固件刷新标志位 ");
    iap_clear_flag_s();
          temp=iap_read_flag_s(APP_CONFIG_ADDR);
          printf("%x ",temp);
          printf("app --> isp over ");
//          HAL_UART_DeInit(&UART1_Handler);
//          NVIC_SystemReset();
          SCB->VTOR = FLASH_BASE | 0x0000;//设置偏移量
    iap_load_app(FLASH_IAP_ADDR);//跳转到iap的复位向量地址
}

一周热门 更多>