OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32/FPGA开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 3308|回复: 8

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

[复制链接]

  离线 

33

主题

107

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1420
金钱
1420
注册时间
2015-7-18
在线时间
127 小时
发表于 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

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2016-7-19
在线时间
38 小时
发表于 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

主题

1759

帖子

0

精华

资深版主

Rank: 8Rank: 8

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

使用道具 举报

  离线 

9

主题

1348

帖子

0

精华

论坛元老

Rank: 8Rank: 8

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

使用道具 举报

  离线 

3

主题

36

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

33

主题

107

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

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

使用道具 举报

  离线 

2

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

31

主题

175

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
金钱
384
注册时间
2015-10-16
在线时间
80 小时
发表于 2018-9-13 08:38:34 | 显示全部楼层
Loyslf_璞野 发表于 2018-3-14 15:59
你可以将  flash  分成四个区域   地址区域由低到高  
最低地址的
1号区域放bootloader程序  的地址区间
...

请教一下,您实现这个是用3个程序吗:一个bootloader+一个app1+一个app2?还是都在一个程序里实现?我的疑惑是在生成.bin程序的时候需要在编译器修改起始地址,app1和app2位置交替更新的话,程序编译时起始地址分别改为不同的吗?
回复

使用道具 举报

  离线 

11

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2016-7-19
在线时间
38 小时
发表于 2018-12-1 23:00:47 | 显示全部楼层
ziyan0005 发表于 2018-9-13 08:38
请教一下,您实现这个是用3个程序吗:一个bootloader+一个app1+一个app2?还是都在一个程序里实现?我的 ...

起始地址分别是不同  app程序flash的起始地址
回复

使用道具 举报

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

本版积分规则




关闭

正点原子STM32/FPGA资料免费洗澡上一条 /1 下一条

正点原子公众号

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

GMT+8, 2018-12-13 22:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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