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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版