OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4004|回复: 6

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

[复制链接]

10

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2017-3-2
在线时间
39 小时
发表于 2018-1-24 14:25:50 | 显示全部楼层 |阅读模式
1金钱
想做一个从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);
}


最佳答案

查看完整内容[请看2#楼]

看了一下这个贴子http://www.openedv.com/forum.php?mod=viewthread&tid=234153&highlight=APP,用软复位,100%靠谱,问题解决
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2017-3-2
在线时间
39 小时
 楼主| 发表于 2018-1-24 14:25:51 | 显示全部楼层
看了一下这个贴子http://www.openedv.com/forum.php ... 3&highlight=APP,用软复位,100%靠谱,问题解决
回复

使用道具 举报

15

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2016-5-20
在线时间
171 小时
发表于 2018-1-24 15:09:37 | 显示全部楼层
我之前是用的NXP的板子,程序上电时在IAP中运行,检测是否需要更新,之后跳转到APP执行,需要再次更新时发送命令进行软复位,之后程序又跳转到IAP中检测更新!
回复

使用道具 举报

10

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2017-3-2
在线时间
39 小时
 楼主| 发表于 2018-1-24 15:16:46 | 显示全部楼层
我现在的做法是上电时程序从IAP直接跳转到APP,当接收到升级固件命令时再从APP跳转到IAP。用原子的代码,从IAP跳到APP是百分百没问题的,现在的问题是从APP跳到IAP时程序死机,求解
回复

使用道具 举报

10

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2017-3-2
在线时间
39 小时
 楼主| 发表于 2018-1-24 15:36:54 | 显示全部楼层
用软复位就行,不需要地址跳转!
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-12-10
在线时间
2 小时
发表于 2019-3-14 10:45:57 | 显示全部楼层
我也遇到这个问题
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-12-10
在线时间
2 小时
发表于 2019-3-14 10:49:55 | 显示全部楼层

我也遇到这个问题,用地址跳转回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\r\n");
          printf("清除固件刷新标志位\r\n");
    iap_clear_flag_s();
          temp=iap_read_flag_s(APP_CONFIG_ADDR);
          printf("%x\r\n",temp);
          printf("app --> isp over\r\n");
//          HAL_UART_DeInit(&UART1_Handler);
//          NVIC_SystemReset();
          SCB->VTOR = FLASH_BASE | 0x0000;//设置偏移量
    iap_load_app(FLASH_IAP_ADDR);//跳转到iap的复位向量地址
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 01:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表