如何做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条回答
divdir
1楼-- · 2019-07-21 08:22
看了一下这个贴子http://www.openedv.com/forum.php ... 3&highlight=APP,用软复位,100%靠谱,问题解决
niqingqing
2楼-- · 2019-07-21 12:48
我之前是用的NXP的板子,程序上电时在IAP中运行,检测是否需要更新,之后跳转到APP执行,需要再次更新时发送命令进行软复位,之后程序又跳转到IAP中检测更新!
divdir
3楼-- · 2019-07-21 15:07
我现在的做法是上电时程序从IAP直接跳转到APP,当接收到升级固件命令时再从APP跳转到IAP。用原子的代码,从IAP跳到APP是百分百没问题的,现在的问题是从APP跳到IAP时程序死机,求解
divdir
4楼-- · 2019-07-21 15:54
 精彩回答 2  元偷偷看……
SUM
5楼-- · 2019-07-21 16:55
我也遇到这个问题
SUM
6楼-- · 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的复位向量地址
}

一周热门 更多>