OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11269|回复: 14

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

[复制链接]

40

主题

150

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6183
金钱
6183
注册时间
2015-7-18
在线时间
448 小时
发表于 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 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2016-7-19
在线时间
43 小时
发表于 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了
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

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

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

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

使用道具 举报

5

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

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

使用道具 举报

40

主题

150

帖子

0

精华

论坛元老

Rank: 8Rank: 8

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

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

使用道具 举报

2

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

31

主题

176

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2015-10-16
在线时间
85 小时
发表于 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: 3Rank: 3

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

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

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2017-9-28
在线时间
21 小时
发表于 2019-1-21 12:11:58 | 显示全部楼层
augustedward 发表于 2018-3-14 19:57
我做过这方面的,思路很简单的,bootloader接收到升级程序时,把程序直接写到备份区,然后当全部写完校验后 ...

怎么从 APP 跳转到IAP
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12001
金钱
12001
注册时间
2013-3-8
在线时间
1279 小时
发表于 2019-1-22 01:12:27 | 显示全部楼层
有点过头08 发表于 2019-1-21 12:11
怎么从 APP 跳转到IAP

软复位,你百度一下,有操作的!
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2018-10-24
在线时间
17 小时
发表于 2019-6-29 16:57:35 | 显示全部楼层
6666666666
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-8-26
在线时间
10 小时
发表于 2019-8-30 10:43:49 | 显示全部楼层
楼主,这个方案最终可以实现吗?
回复

使用道具 举报

40

主题

150

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6183
金钱
6183
注册时间
2015-7-18
在线时间
448 小时
 楼主| 发表于 2019-8-31 10:00:52 | 显示全部楼层
946356399a 发表于 2019-8-30 10:43
楼主,这个方案最终可以实现吗?

可以实现,程序实际大小只有几十K,而STM32F103RE以上的都是512的内存,可以在合适的位置开辟新的内存区存放备份程序,就可以实现
回复

使用道具 举报

5

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2018-7-27
在线时间
86 小时
发表于 2020-5-19 09:09:35 | 显示全部楼层
Loyslf_璞野 发表于 2018-3-14 15:59
你可以将  flash  分成四个区域   地址区域由低到高  
最低地址的
1号区域放bootloader程序  的地址区间
...

你好,你有这方面的例程吗,分享一下可以吗
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-2 20:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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