OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 1073|回复: 6

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

[复制链接]

  离线 

32

主题

104

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1058
金钱
1058
注册时间
2015-7-18
在线时间
101 小时
发表于 2018-3-14 15:59:10 | 显示全部楼层 |阅读模式
1金钱
现在的想法是将32的flash分为三个区,分别是BootLoader区,程序备份区和运行区,在在线升级时将程序升级到备份区,当升级完成后,再将备份区的程序拷到运行区运行,如果升级失败则直接运行运行区,这样就保证了在线升级失败也可以使程序正常运行老版本,对于这种想法,大家有没有好的建议或者例程。

最佳答案

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

你可以将 flash 分成四个区域 地址区域由低到高 最低地址的 1号区域放bootloader程序 的地址区间 2号区域flash放一个存放操作标志数的区间 3号区域app1的地址区间 4号区域app2的地址区间 每回主控上电或者复位 先去读取2号区域的数值 假设如果区域2 的 flash的标志数读回来是 1跳转运行3号区域app1的程序 运行app1的时候如果检测到升级操作指示 写2号区域f ...
回复

使用道具 举报

  离线 

11

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2016-7-19
在线时间
36 小时
发表于 2018-3-14 15:59:11 | 显示全部楼层
你可以将  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了
回复

使用道具 举报

  离线 

20

主题

1660

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3255
金钱
3255
注册时间
2014-8-26
在线时间
783 小时
发表于 2018-3-14 18:24:10 | 显示全部楼层
帮顶。
回复

使用道具 举报

  离线 

9

主题

1320

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4554
金钱
4554
注册时间
2013-3-8
在线时间
616 小时
发表于 2018-3-14 19:57:35 | 显示全部楼层
我做过这方面的,思路很简单的,bootloader接收到升级程序时,把程序直接写到备份区,然后当全部写完校验后,没有错误,则把备份区的代码全部复制到运行区。然后跳转执行。若校验错误,则直接执行。
回复

使用道具 举报

  离线 

3

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2014-8-7
在线时间
35 小时
发表于 2018-3-14 20:39:08 | 显示全部楼层
正点原子公众号
本帖最后由 ndthome 于 2018-3-14 20:44 编辑
augustedward 发表于 2018-3-14 19:57
我做过这方面的,思路很简单的,bootloader接收到升级程序时,把程序直接写到备份区,然后当全部写完校验后 ...

是不是这样备份区接收数据,如果校验成功,则把备份数据复制到主运行区里,如果备份数据校验失败,则直接运行主运行区,
复制到主运行区里,再把主运行区校验一下,如果主运行区校验成功,则运行主运行区,如果校验失败,则跳到备份区执行。
回复

使用道具 举报

  离线 

32

主题

104

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1058
金钱
1058
注册时间
2015-7-18
在线时间
101 小时
 楼主| 发表于 2018-3-15 08:37:39 | 显示全部楼层
augustedward 发表于 2018-3-14 19:57
我做过这方面的,思路很简单的,bootloader接收到升级程序时,把程序直接写到备份区,然后当全部写完校验后 ...

我现在也想这样做,我试一下
回复

使用道具 举报

  离线 

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2016-5-11
在线时间
30 小时
发表于 2018-4-21 00:57:45 | 显示全部楼层
也在看这方面的思路,帮顶
回复

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-6-22 19:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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