stm32 iap 远程升级方案讨论

2019-12-27 19:01发布

我想通过GPRS实现STM32的远程升级,想法是把512kflash分成两个应用程序区,平常工作在A区,如果收到升级数据就先写入B区,全部写完后如果校验通过就在某个位置上置标志位然后重启系统。系统在引导区的时候根据标志位来运行A区或B区。有谁能提供个思路呢???
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
xizi
1楼-- · 2020-01-06 22:50
回复【51楼】yzhu  
出个主意,将flash分为boot、a、b三个区。  
方案1:  
a区运行代码时,将升级数据写入b区,然后重启系统;  
boot代码查看b区有无代码,  
        有的话,将b区的代码重写到a区,并擦除b区的代码,然后重启系统;  
        没有的话,直接运行a区的代码;  
因为flash擦除后,读出值均为0x0ff,很容易判断是否有无代码。  
这样做的好处是工程设置不必改来改去,缺点是没次升级,需要擦除3次flash。

-------------------------------------------------------------------------
如果将b区的代码重写到a区过程中掉电,则上电应确保重新回写,而不是执行a区的残缺代码。
xizi
2楼-- · 2020-01-06 23:39
回复【11楼】lcslxh
回复【8楼】alvin007  
关注中  
lz的思路时将内置flash分成3个区吧  
引导区  应用区a  应用区b  
其实这里的b区完全作为一个外置数据存储器来用了  
如果是这样何不在引导区加入“升级”程序 直接覆盖a区   
如果像4楼所说真的意外中断了  
也只是没有完成升级 引导程序没遭到破坏  
只需要重新升级即可  
不知这样是否可行
--------------------------------------------------------------------
你的这种思路有一个问题是,如果程序已经在运行了呢?在要升级的时候如何转到引导区呢?如何判断是在升级程序还是转到正常运行状态呢
-----------------------------------------------------------------------

将内置flash分成3个区的好处是升级失败后可以有放弃升级的选择,重新运行原来的代码。

如果内置flash只分成2个区,没有b区,每次升级程序直接覆盖a区。则升级失败后没有选择,只能反复努力,直到升级成功。

程序已经在运行不是问题,要升级的时候放狗咬人即可,复位后转到引导区。
xizi
3楼-- · 2020-01-07 02:58
改发一个新贴。http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5156132&bbs_id=9999
shunda
4楼-- · 2020-01-07 03:23
 精彩回答 2  元偷偷看……
wenjin0386
5楼-- · 2020-01-07 08:59
学习
polang11
6楼-- · 2020-01-07 13:28
关注中,很实用的技术

一周热门 更多>