14307|36

1366

帖子

6

TA的资源

版主

楼主
 

小谈bootloader和APP两重升级 [复制链接]

 
     一般设计来说,bootloader作为引导程序和升级APP,改动并不大而且也相对稳定。但是如果项目中遇到非得更新bootloader的,比如协议的更新替换,这时候就有设计此方案的必要性了。
     不多说,直接进入正题。     flash分区图和程序图如下,接下来的描述都是基于这图来进行分析

      大概说下思路:简单的说就是设计三段程序,bootloader0、bootloader1、APP。
      这里假设使用的是ST的STM32F103C8T6,该款单片机有64K flash,每个扇区为1K,一共64个扇区。在这些扇区的分配中,bootloader0占用1K,也就是一个扇区空间(0x8000000~0x80003FFF);bootloader1占用22K,也就是22个扇区空间(0x8000400~0x80005BFF);标志区占用1K,也同样为一个扇区空间(0x80005C00~0x80006000);APP部分包括APP和DATA,还有40K空间可利用。这个就flash的分区思路。
      此次再来说下1K标志区的存储,在这里我只用了10个字节存储,当然如果有一些必要的标志数据啥的,也可以存储在此空间,在这里我用结构体表示这些变量成员,并把标志区的flash地址转换成此结构体指针。

    此次再来说明程序流程图。正常模式下,系统开始运行是从bootloader0开始的,然后跳转到bootloader1,再者跳转到APP,这就是一个流程。bootloader0的程序也很简单,无非就是判断标志区的标志变量是否改变,从而选择跳转到Bootloader1或者APP区域。bootloader0的main函数如下,按照上述的流程图可以明白,只要是标志区的跳转标记是正常模式或者bootloader_flag未被置位,说明是没有升级过bootloader1或者已经升级成功的,进而就跳转到bootloader1。否则都直接进入APP,这样可以防止APP里面升级bootloader失败了而且不小心断电了,不用经过Bootloader1进入APP再次升级bootloader1。

      当然在启动文件里面,不需要进入系统时钟初始化直接进去main,所以我们同样也要修改下启动文件。

      最后生成的bootloader0空间比较小,如果觉得这1K扇区用的比较浪费,也同样可以存储一些你觉得必要的数据。

     那么接下来先说明下16个字节升级参数,这16个字节是每次制作升级bin包的时候插入到此Bin包的头16个字节。说明如下:

     bin包的发送上,我的上位机是这样处理的,先每次间隔两秒发送16个字节参数,后续的bin包拆分512个字节依次200ms发送。(下面会简单介绍下上位机的思路。)
     接下来再看Bootloader1,此段代码作为引导进入APP以及升级APP的代码,其作用也不言而喻。回到原来那个流程图,当APP收到APP升级的16个字节升级参数(下面会说明)的时候,APP会把标志区的跳转标志设置为升级模式并且把bootloader1置位并且复位,这时候程序重新运行的时候就一直在bootloader1中运行,一直等待升级APP,当再次收到16个字节升级参数的时候,记录升级参数的CRC,bin包的总长度、根据升级包的总数量擦出APP区域的对应空间。后续在接受512个字节的时候依次写入flash,到最后一包的时候,check下CRC是否对应上,对的上就更新标志区的标志变量并且复位,check不对就上报信息给上位机并且重发。截图中的是明文协议。因为之前用的是明文协议(方便但是弊端比较多,所以才会要更新为暗文协议。)
     
     再者说明APP部分,APP部分主要是一者升级APP,设置标志区的标志变量并且复位跳转至Bootloader1进行APP升;二者是升级Bootloader1。区分是升级APP还是Bootloader主要在于区分16个字节升级参数,16个字节升级参数里面带有一个字节判断APP还是bootloader,以此来决定哪个类型升级。

     底层上已经大概说明完毕,不管是用xyzmodemx协议、modbus协议、自定义协议也好,只要能考虑好升级的安全性和全面性,还有代码逻辑思路清晰,其实都可以。
     接下来说下上位机。我用的是QT,升级使用定时器来做非阻塞式单线程,当然使用多线程升级更加方便。一部分截图如下。对于生产员工来说,只需要点击两个空间,等待进度条100%即可。

      在控件逻辑上,打开升级文件,使用QFileDialog类并把bin包信息通过全局变量记录下来。

    再点击发送升级文件控件,逻辑上是开启两个定时器,一个2s定时,一个200ms定时,当然两个定时都可以根据情况修改;这两个定时的作用是,2s定时的是发送两次16个升级参数,后面的200ms定时是依次发送512包的bin包数据。

     在2s定时的槽函数里面进行发送16个升级参数,发送完关闭2s定时并且开始200ms定时。

     发送bin包里面的头16个字节,可以带参多次发送。(这个是对应2S定时槽函数。)

      在发送bin包的每次512个字节的时候,先记录总的512个字节总段数,每次发送完一包,依次使用seek函数来设置当前文件的位置,并且使用read设置要读的字节长度,直到发送至总段数到了。(这个是对应200ms定时槽函数)代码如下:


      至此,对于两重升级的已经水贴结束了,每周不水水,不刷刷屏,就像在水军群不刷图一样心痒痒。

此内容由EEWORLD论坛网友RCSN原创,如需转载或用于商业用途需征得作者同意并注明出处


此帖出自stm32/stm8论坛

最新回复

这个很厉害呢   详情 回复 发表于 2020-10-29 22:25

赞赏

3

查看全部赞赏

点赞(2) 关注(21)
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 

回复
举报

6040

帖子

196

TA的资源

版主

沙发
 
听大佬们说这帖子很牛逼,我先收藏了,以后慢慢看。
此帖出自stm32/stm8论坛
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

板凳
 
城城版主你这个还缺环节没说。相对地址链接到绝对地址的时候得根据flash实际划分调整。另外,现在IAP可能很方便,以前还得考虑升级部分flash代码不会在升级过程中被新覆盖从而导致不可用,或者弄到sram中执行避免覆盖。等等吧。
此帖出自stm32/stm8论坛

点评

叔叔。  详情 回复 发表于 2018-6-10 14:41
 
 

回复

1366

帖子

6

TA的资源

版主

4
 
本帖最后由 RCSN 于 2018-6-10 14:54 编辑
freebsder 发表于 2018-6-10 13:50
城城版主你这个还缺环节没说。相对地址链接到绝对地址的时候得根据flash实际划分调整。另外,现在IAP可能很 ...

     叔叔。     第一个倒是没注意这个问题,对于三个分区地址来说,是写死了。比如bootloader1占用的是22K,其空间地址范围就在0x8000400~0x80005BFF擦除与写入,当然当来了一个bootloader的升级文件不足22K的时候,会根据其大小擦除相对应的flash空间,剩余的就全不写入与擦出。当然你这个“相对地址链接到绝对地址的时候得根据flash实际划分调整”可以借鉴,除了可以重新调整flash实际划分还需要重新分配好中断向量偏移地址。
第二个确实也有想过,考虑过bkp,但是考虑到ram空间不够,所以如果每次确定收到16个字节升级参数check正确,那么我就去擦除相对应的flash空间的起始地址,CRC check不对上发信息给上位机重发这个bin文件。再者一些重要的用户数据区,规划好确定其分区地址,每次升级的时候,避免不去升级擦除掉这些用户数据区导致不可用的方式。
此帖出自stm32/stm8论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

6423

帖子

17

TA的资源

版主

5
 
这个就牛逼了
此帖出自stm32/stm8论坛
 
个人签名training
 
 

回复

1903

帖子

0

TA的资源

版主

6
 
学习了
此帖出自stm32/stm8论坛
 
 
 

回复

1944

帖子

32

TA的资源

纯净的硅(高级)

7
 
👍👍👍👍👍
此帖出自stm32/stm8论坛
 
 
 

回复

935

帖子

1

TA的资源

禁止发言

8
 
此帖出自stm32/stm8论坛
 
个人签名存储芯片/MCU/SRAM/PSRAM/DDR/FLASH/MRAM。web.www.sramsun.com  QQ3161422826 TEL:13751192923
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

9
 
版主呢?干货级别帖。对了,RC自己就是版主,可以自受一精
此帖出自stm32/stm8论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

10
 
stm32用什么软件刷bootloader?
此帖出自stm32/stm8论坛

点评

可以jlink啊。如果你升级支持升级Bootloader的话,有自定义协议也可以自己做个工具发送Bin包到MCU  详情 回复 发表于 2018-6-12 11:01
 
 
 

回复

1366

帖子

6

TA的资源

版主

11
 
RobinDong 发表于 2018-6-12 10:57
stm32用什么软件刷bootloader?

可以jlink啊。如果你升级支持升级Bootloader的话,有自定义协议也可以自己做个工具发送Bin包到MCU
此帖出自stm32/stm8论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

356

帖子

0

TA的资源

一粒金砂(中级)

12
 
牛逼 好贴顶起来
此帖出自stm32/stm8论坛
 
 
 

回复

1903

帖子

0

TA的资源

版主

13
 
大牛啊
此帖出自stm32/stm8论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

14
 
RCSN 发表于 2018-6-12 11:01
可以jlink啊。如果你升级支持升级Bootloader的话,有自定义协议也可以自己做个工具发送Bin包到MCU

好的我试试,多谢啦
此帖出自stm32/stm8论坛
 
 
 

回复

104

帖子

0

TA的资源

一粒金砂(中级)

15
 
赞👍👍👍
此帖出自stm32/stm8论坛
 
 
 

回复

165

帖子

2

TA的资源

纯净的硅(高级)

16
 
此帖出自stm32/stm8论坛
 
 
 

回复

578

帖子

0

TA的资源

纯净的硅(初级)

17
 
很好的帖子,值得收藏,好好研读学习
此帖出自stm32/stm8论坛
 
个人签名刻苦学习,共同进步
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 
大牛哥,麻烦可以共享一下源码参考一下吗
此帖出自stm32/stm8论坛

点评

你好,有什么问题在帖子回帖就好  详情 回复 发表于 2018-6-23 08:57
 
 
 

回复

1366

帖子

6

TA的资源

版主

19
 
shenqi2004 发表于 2018-6-22 16:51
大牛哥,麻烦可以共享一下源码参考一下吗

你好,有什么问题在帖子回帖就好
此帖出自stm32/stm8论坛
 
 
 

回复

435

帖子

1

TA的资源

一粒金砂(高级)

20
 
楼主,请教一下怎样保证bin 包里要刷新的数据对应的位置是连续的呢?直接暴力全部覆盖么?
此帖出自stm32/stm8论坛

点评

这要看你的协议了。最简单的协议就是,你在上位机对bin包进行拆包,每一包512个字节(当然你可以自己定),每一包都带长度,总包数,当前包数,CRC校验。当下位机收到了此包数据,先CRC校验此包数据是否有效,再根据  详情 回复 发表于 2018-6-24 11:26
 
个人签名君应有语,渺万里层云,千山暮雪,知向谁边?
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表