你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F1的IAP程序,APP1和APP2两个应用程序交替更新的问题

[复制链接]
ren0zhe 提问时间:2017-5-5 17:03 /
1、MCU:stm32f103vct6
2、升级所用端口: 串口
3、FLASH分配
bootloader                                0x8000000 开始

#define APP1_START_ADDR     0x8010000
#define APP1_END_ADDR         0x8020000     //APP1 64k

#define APP2_START_ADDR     0x8021000
#define APP2_END_ADDR         0x8031000     //APP2 64k

APP程序中偏移地址设置,是根据APP的位置设定的:
       如果运行APP1位置的程序,偏移地址就是  0x8010000,
       如果运行APP2位置的程序,便宜地址就是  0x8021000


现象:
1、通过串口更新固件,都往APP1位置更新,测试多次,完全正常


2、更新固件,目前运行APP1程序,更新新固件到APP2位置;如果目前运行APP2位置程序,更新新固件到APP1位置
      用同一个固件,交替升级到APP1 和 APP2 的位置,是没问题的


     问题来了:用两个不同的固件,交替升级到APP1 和 APP2的位置,一次升级成功后,下一次升级完成,程序不停重启
                      在此情况下重复三次都是相同现象,在第四次就可以进入到APP程序中运行了

请问各位IAP过程中,使用两个APP升级,需要注意哪些地方呢? 谢谢
   



收藏 2 评论28 发布时间:2017-5-5 17:03

举报

28个回答
ren0zhe 最优答案 回答时间:2017-5-8 15:22:53
QQ截图20170508144608.png QQ截图20170508144837.png
这是两个相同的程序,设置IROM1的起始地址分别为 0x8010000 和 0x8021000,
生成的bin文件的复位地址分别为  08 01 11 55 和 08 02 21 55,这个地址的差值更好为0x11000,
和IROM的地址差刚好吻合,这个肯定不是巧合

然后我就按照下面办法生成bin文件:
1.  bin1更新时需置于 0x8010000开始的地址,生成bin文件时,设置向量表偏移0x10000,KEIL设置IROM1:0x8010000
2.  bin2更新时需置于 0x8021000开始的地址,生成bin文件时,设置向量表偏移0x21000,KEIL设置IROM1:0x8021000
也就是说,不同置于不同flash地址的程序的bin文件单独生成,地址做好匹配


固件升级测试10次,是没问题的


然后我把bin1升级到APP2的位置,把bin2升级到APP1的位置,然后就不行了,bootloader执行到跳转之后就没有然后了


但是,不太可能每次固件升级还得记录固件的位置啊,这样太不智能,太麻烦了,

~~~~~~~~~~~~~~~~~~~~~~~~~~~  分割线   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这里就真的不知道如何处理了,因为bin文件可能位于不同的位置,bin文件里面带的地址该如何处理呢?
ren0zhe 回答时间:2017-5-10 09:55:29
hjl2832 发表于 2017-5-10 09:12
keil编译时,总是只能默认一个地址启动,要做不同的地址启动,要将不同的复位地址对应不同的中断向量表,这 ...

好吧,谢谢,我也战略放弃了,现在就是APP2做一个定死的出厂固件,APP1一直升级,这样算是妥协点吧
ren0zhe 回答时间:2017-5-9 10:41:58
waiman-156411 发表于 2017-5-9 09:51
你这个问题,我之前已经遇到过,不单单是固件复位地址的问题,还有中断向量表的位置也要改,所以同一个BIN ...

你这个问题,我之前已经遇到过,不单单是固件复位地址的问题,还有中断向量表的位置也要改,所以同一个BIN文件,想不改地址,直接放在两个不同Flash地址执行是不可能的。

但你可以尝试这样操作,开发只生成一个BIN文件,然后自己写一个小软件,每次更新不同区域的APP,直接修改BIN文件里的复位地址和中断向量表偏移地址就行了。


“直接修改BIN文件里的复位地址和中断向量表偏移地址”  ,请问这个具体是修改哪里呢?


我对比了下,用keil修改IROM1那里的起始地址后生成的两个bin文件如下:
QQ截图20170509103341.png
地址不同的很多啊,我试着把  APP1位置的bin文件里的地址按照APP2位置的bin的地址修改,还是不能用的
七哥 回答时间:2017-5-8 10:19:03
没用过IAP。
上电后从bootloader运行系统程序,通过标志来选择从APP1,还是从APP2运行应用程序。那么这个标志放在什么位置?因为内部Flash是按页来擦写的,不能以字节擦写。那么个人建议,把这个标志,放在Flash空间的最后面页,或者特定的页。更新APP时,同时也把这个标志更新。
或者在bootloader代码区的最后一页,只放这个标志位。方便擦写。

评分

参与人数 1ST金币 +5 收起 理由
zero99 + 5

查看全部评分

无薪税绵 回答时间:2017-5-8 12:22:05
会不会是进入了什么错误中断死循环了,看门狗复位。
最好能加个串口输出看看是什么问题。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

斜阳 回答时间:2017-5-8 14:14:54
两个APP交叉升级和升级单个APP的区别不大。APP1和APP2相同与不同更没啥区别。我觉得是你APP2升级出问题了。当两个APP相同的时候,错误被掩盖了

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

cldym 回答时间:2017-5-8 14:31:07
会不会是进入了什么错误中断死循环了,看门狗复位。

评分

参与人数 1ST金币 -5 收起 理由
zero99 -5 回答抄袭

查看全部评分

ren0zhe 回答时间:2017-5-8 14:31:26
toofree 发表于 2017-5-8 10:19
没用过IAP。
上电后从bootloader运行系统程序,通过标志来选择从APP1,还是从APP2运行应用程序。那么这个标 ...

这个标志肯定没问题,我是放在EEPROM里面
ren0zhe 回答时间:2017-5-8 14:34:22
无薪税绵 发表于 2017-5-8 12:22
会不会是进入了什么错误中断死循环了,看门狗复位。
最好能加个串口输出看看是什么问题。 ...

加了串口打印,没加看门狗,错误的话感觉不会有,现在发现的问题是,生成的bin文件的问题,在keil那里设置偏移 10000 和偏移 21000,生成的bin文件不同,特别是 复位地址那里不同,个人感觉是这个地址错误的问题
ren0zhe 回答时间:2017-5-8 14:36:43
斜阳__ 发表于 2017-5-8 14:14
两个APP交叉升级和升级单个APP的区别不大。APP1和APP2相同与不同更没啥区别。我觉得是你APP2升级出问题了。 ...

对,bin相同时错误被掩盖了,今天调试感觉像是 复位地址的问题,我用同一个工程,在keil那里设置IROM1的起始地址为0x8010000 和 0x8021000 ,生成的bin文件不同,特别是 复位地址那里不同
yklstudent 回答时间:2017-5-8 15:30:10
用HEX文件啊,里面带起始地址,该放哪里就放置到哪里
ren0zhe 回答时间:2017-5-8 15:34:30
yklstudent-1794 发表于 2017-5-8 15:30
用HEX文件啊,里面带起始地址,该放哪里就放置到哪里

额,首先IAP,应该没人用hex吧,j-flash下载用hex方便;其次,每次编译都重新写地址,太麻烦,还得记录地址,现在想实现的是,固件更新到一个目前程序不用的地址上面,不管特意根据位置再生成bin文件
zbber 回答时间:2017-5-8 21:19:32
两个APP交叉升级和升级单个APP的区别不大
chifen 回答时间:2017-5-8 22:37:54
IAP做下载 第一个是偏移地址,就是从哪运行,第二是中断向量就是 中断入口同时要改,  如果你是两个 相同的IAP ,那偏移和中断向量地址你是怎么处理的 ,
还有一个 第一次运行的入口地址你想怎么实现跳转你想进的IAP地址呢

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

ren0zhe 回答时间:2017-5-9 09:31:59
zbber 发表于 2017-5-8 21:19
两个APP交叉升级和升级单个APP的区别不大

那请问下两个APP交叉升级时。升级用的bin文件的向量表偏移地址 和 keil设置的IROM1那里的地址 是如何处理的?
ren0zhe 回答时间:2017-5-9 09:33:48
chifen 发表于 2017-5-8 22:37
IAP做下载 第一个是偏移地址,就是从哪运行,第二是中断向量就是 中断入口同时要改,  如果你是两个 相同的IAP ...

目前这也是我遇到的情况,keil设置IROM1那里不区分APP1和APP2时,交叉升级就会有问题,如果区分生成bin文件,感觉体验特别不好啊
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版