stm32如何将flash分为三个区用来做在线升级?

2019-07-20 23:24发布

现在的想法是将32的flash分为三个区,分别是BootLoader区,程序备份区和运行区,在在线升级时将程序升级到备份区,当升级完成后,再将备份区的程序拷到运行区运行,如果升级失败则直接运行运行区,这样就保证了在线升级失败也可以使程序正常运行老版本,对于这种想法,大家有没有好的建议或者例程。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
Loyslf_璞野
1楼-- · 2019-07-21 02:44
你可以将  flash  分成四个区域   地址区域由低到高  
最低地址的
1号区域放bootloader程序  的地址区间
2号区域flash放一个存放操作标志数的区间
3号区域app1的地址区间
4号区域app2的地址区间

每回主控上电或者复位
  先去读取2号区域的数值  
     假设如果区域2 的 flash的标志数读回来是
         1跳转运行3号区域app1的程序               运行app1的时候如果检测到升级操作指示
                   写2号区域flash标志数4  软后软件复位单片机
               没有升级指示  正常运行app1
         2跳转运行4号区域app2的程序
               运行app2的时候如果检测到升级操作指示
                   写2号区域flash标志数3  软后软件复位单片机
               没有升级指示  正常运行app2
         3执行bootloader升级app1区域
                 刷写完程序以后并校验该程序区域
                     如果校验正确   写区域2flash的标志数为 1 软后软件复位单片机
                     如果校验错误   写区域2flash的标志数为 2 软后软件复位单片机
         4执行bootloader升级app2区域
                刷写完程序以后并校验该程序区域
                     如果校验正确   写区域2flash的标志数为 2 软后软件复位单片机
                     如果校验错误   写区域2flash的标志数为 1 软后软件复位单片机

以上就是我的升级思路
但是这里要考虑到程序运行错误的情况   就是硬件错误  跑飞
我都会在有可能出现错误时掉进的while里
写一段软件复位程序
这段错误处理程序可以这么写
先读取  区域2flash的标志数
看看现在运行出错的app是哪个区域的
如果是区域3的app1那么就把区域2的flash标志数写为2  然后软件复位  这样复位以后运行的就是app2了
如果是区域4的app2那么就把区域2的flash标志数写为1  然后软件复位  这样复位以后运行的就是app1了
login_FAE
2楼-- · 2019-07-21 08:04
 精彩回答 2  元偷偷看……
augustedward
3楼-- · 2019-07-21 11:02
我做过这方面的,思路很简单的,bootloader接收到升级程序时,把程序直接写到备份区,然后当全部写完校验后,没有错误,则把备份区的代码全部复制到运行区。然后跳转执行。若校验错误,则直接执行。
ndthome
4楼-- · 2019-07-21 15:13
 精彩回答 2  元偷偷看……
追月
5楼-- · 2019-07-21 20:25
augustedward 发表于 2018-3-14 19:57
我做过这方面的,思路很简单的,bootloader接收到升级程序时,把程序直接写到备份区,然后当全部写完校验后 ...

我现在也想这样做,我试一下
806034232
6楼-- · 2019-07-22 01:16
也在看这方面的思路,帮顶

一周热门 更多>