找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6005|回复: 3
打印 上一主题 下一主题
收起左侧

STC8A8K64S4A12单片机bootloader加载片外flash在线升级程序

  [复制链接]
跳转到指定楼层
楼主
  之前的发的帖子提到了基于STC8A8K64S4A12单片机的bootloader实现程序的更新,并且测试可以正常跳转运行。今天这篇帖子会详细介绍片外型的bootloader实现程序在线升级,在介绍之前,我先介绍自己了解的市面上主流产品bootloader升级方式。
   根据是否主动升级,可以分为主动升级和被动升级主动。升级就是单片机自己能同时主动获取和更新内部flash的程序。另外一种升级方式就是被动升级,一般借助烧录器烧录程序都属于被动升级的方式。主动升级的架构一般由引导程序(bootloader)和用户程序(app)组成,bootloader主要起到升级程序引导和切换的作用,app是程序升级的对象。后面的内容讨论的是都是主动升级方式。
  根据是否外挂flash,可以分为片上型(onchip)和片外型(offchip)两种。片上型,单片机没有外挂flash,程序升级全部依靠单片机内部存储。比较典型的是CC2541的OTA(空中升级),CC2541将内部存储分成BIM、Image A和Image B。其中BIM是引导程序,Image A和Image B是用户应用程序。当执行在Image A时,可以升级Image B程序,完成后重启,让BIM选择切换运行Image B程序,反之亦然。这种方式有优点,亦有缺点,优点就是OTA过程中如果失败,不怕程序奔溃,顶多不切换就行,缺点就是两个功能类似的用户程序占用更多存储空间。片外型,单片机有外挂flash,程序升级时单片机的用户程序先将升级数据写入到外部flash中,完成后重启,重启后bootloader会将外部flash的升级数据读出,然后写入到内部flash,完成后,切换到升级后的用户程序。比较典型的是CC2640R2F的OTA-Offchip。这种方式的优点是将外部flash作为升级程序数据缓存,无需占用内部flash,用户程序存储空间利用率高,缺点就是需要增加一片flash的成本。                            
  根据传输媒介,可以分为无线升级和有线升级。无线升级,一般常见SOC方案如:BLE(低功耗蓝牙)、ZigBee、sub-1G、wifi和自定义2.4G等,这些应用可以利用无线传输升级数据包来实现程序升级。比如CC2541的OTA升级,由于CC2541内置2.4G射频端口,Image A和Image B这两个程序都有蓝牙协议栈,利用协议栈,可以轻松调制输出BLE信号,也可以接收解析BLE信号。手机连接CC2541后,升级文件通过蓝牙发送给CC2541,CC2541边接收数据包,边擦写内部flash,直到完成擦写。有线升级,主要利用串口、SPI、烧录器和外部flash等来传输升级程序。  
  接下来,我介绍一下本次STC8A8K64S4A12单片机采用片外型来在线升级程序功能实现。
  首先是空间分配问题,STC8A8K64S4A12单片机的程序存储空间ROM有64K,ROM的擦除是按照512字节/扇区,所以存储空间分配要按照512字节的整数倍。我将前面3K存储空间(0x0000-0x0BFF)分配给BIM程序区来作为bootloader,剩下61K存储空间(0x0C00-0xFFFF)分配给IMAGE程序区。开发板的外部flash型号是W25X16CL,存储空间为2M。由于flash的擦除是按照4K/扇区,所以存储空间分配要按照4K的整数倍。我将前面的4K存储空间作为IMAGE文件信息区,将接下来的64K存储空间作为IMAGE文件数据区。

  处理好空间分配问题,接下来就是BIM工程和IMAGE工程的功能实现了。BIM工程比较简单,只要上电后读取W25X16CL的IMAGE文件信息查看否更新标志。如果有更新标志,则加载W25X16CL的IMAGE文件数据到IMAGE程序区中,完成后,擦除W25X16CL的数据,再跳转到IMAGE程序区。如果没有更新标志,则直接跳转到IMAGE程序区。IMAGE工程就相对复杂点,其中比较麻烦的是如何将IMAGE文件加载到W25X16CL中。这里采用了开源的Fatfs32文件系统,再挂载SD卡,这样就能方便地保存和读取IMAGE文件了。保存在SD卡的是IMAGE.bin文件,这种格式不带地址等信息,占用空间小。升级时,单片机将SD中的IMAGE.bin文件加载到W25X16CL中,完成后,STC8A8K64S4A12单片机软复位,BIM程序区的bootloader会加载W25X16CL的IMAGE文件数据到内部flash中。
  另外一个需要解决的问题是hex文件合并的问题。BIM工程和IMAGE工程是两个不同的独立工程,编译后可以产生对应的hex文件,正常工作的条件是将同时烧录两个工程对应的hex文件。由于STC-ISP不支持两次烧录来合并hex文件,所以需要先将hex文件合并成一个BIM+IMAGE.hex文件,然后再用STC-ISP烧录到STC8A8K64S4A12单片机中。这里我采用python的intelhex库里面的hexmerge.py,再用pyinstaller将hexmerge.py打包成hexmerge.exe执行文件,这样就算没有安装python环境也可以运行。在IAR的配置里面的post-build command line填写调用hexmerge.exe的命令语句,IAR在程序编译后会调用hexmerge.exe,合并产生BIM+IMAGE.hex文件。一般BIM程序编译完就不管它了,改动都是IMAGE程序。调试时,将BIM+IMAGE.hex烧录到STC8A8K64S4A12单片机运行即可。
  下面是自己测试的BIM工程图片

下面是自己测试IMAGE工程(image 1)

  下面是自己测试IMAGE工程(image 2)

下面是编译生成文件

  其中,BIM+IMAGE.hex是烧录到STC8A8K64S4A12单片机中的,每次调试都是烧录这个文件。IMAGE.bin是升级文件,需要将IMAGE.bin拷贝到SD卡中,STC8A8K64S4A12单片机会从SD加载升级文件实现升级。
  下面是测试打印的结果

  在SD卡里面存放2个软件版本的升级文件(image1.bin和image2.bin),打印测试显示可以正常来回切换升级程序。
  可以看到,只要往W25X16CL写入升级文件和文件信息,就可以实现升级。如果不用SD卡,也可以通过其他方式获取升级文件,比如用NRF24L01模块接收升级文件,再将升级文件加载到W25X16CL,这样也算是无线升级了。也可以连接电脑串口,接收串口的升级文件,再将升级文件加载到W25X16CL。方法多样,具体选择哪种,要按照实际情况选择。
  下面是实物照片

  附件是BIM工程和IMAGE工程,有兴趣的话,可以下载查看。

在线升级.7z (9.49 MB, 下载次数: 156)

评分

参与人数 1黑币 +9 收起 理由
hony2020 + 9

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:62509 发表于 2020-5-17 15:12 | 只看该作者
这应该算是优秀文章!!!!
回复

使用道具 举报

板凳
ID:87000 发表于 2022-7-6 15:43 | 只看该作者
正在研究怎么实现单片机程序升级,这样,就算给客户烧录文件,客户抄板了,还得破解程序才行。。。
回复

使用道具 举报

地板
ID:87000 发表于 2022-7-6 15:55 | 只看该作者
hexmerge.exe 这玩意在kell里面怎么设置了?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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