vesperW · 1月22日

单片机 BootLoader 与 APP 如何合并?

1、前言

嵌入式固件一般分为 BootLoader 和 App,BootLoader 用于启动校验、App 升级、App 版本回滚等功能,BootLoader 在 cpu 上电第一阶段中运行,之后跳转至 App 地址执行应用程序。

因此,在发布固件的时候,会存在 BootLoader 固件和 App 固件;此时我们期望是将 BootLoader 固件和 App 固件合并成为一个固件,这样在量产时只需烧录一次即可。

image.png

2、传统方式

一些传统的方法都是“土办法”,没什么毛病,但比较繁琐。项目种类增加,或者版本发布频繁时更加体现出繁琐性,且易出错,操作稍微失误可能导致固件不完整;烧录不完整的固件,机子变“砖头”。

  • 烧录两次,分别烧录 BootLoader 和 App 固件
  • 烧录固件到芯片后,再从芯片读取固件,另存为 hex 文件
  • 手动复制、合并固件
  • BootLoader 支持 App 固件传输功能的,只烧录 BootLoader,后期再升级 App

3、高效方式

我们目标是通过自动化脚本合并生成一个发布固件,提高效率和确保固件的完整性。

3.1 合并文件

Linux 下的脚本我们用得很多,其实 Windows 的脚本也非常优秀,利用 Windows 的脚本可以快速实现增、删、查、改文件。常用 Windows 脚本命令如下。

  • 合并两个文件:copy /b
  • 重命名文件:ren <source_file> <dect_file>
  • 删除文件:del

很显然,我们利用其合并命令,只需一条指令即可将 BootLoader 和 App 文件合并。

例子:

假设当前目录存在 Boot.bin 和 App.bin 文件,合并后文件命名为 Firmware.bin。

copy /b .\Boot.bin + .\App.bin Firmware.bin
注:Windows 的目录路径为反斜杠,与 Linux 不同。

3.2 bin 转 hex

我们知道,二进制(bin)文件是不存在地址信息的,cpu 上电执行并不一定是从地址 0 开始执行代码,如 STM32 芯片起始执行地址为 0x8000000。

因此不能通过串口工具烧录 bin 文件,只能通过 J-link 或者 ST-link 烧录,并且在烧录前指定存储起始地址。因此,将 bin 文件转换为 hex 文件是有必要的。

bin 转 hex 方式:

  • 使用 jflash 工具,把合并后的 bin 文件,使用 jflash 打开,另存为 hex 格式文件
  • 将 bin 文件烧录置芯片,读取出来,另存为 hex 文件
  • 自己动手写一个 bin 转 hex 工具
  • 借助第三方 bin 转 hex 工具

前两者太繁琐,效率低下;第三个比较灵活,但需要花点时间;如果使用优秀的现成工具是最快捷的办法。推荐使用“srec_cat.exe”工具,可以结合 Windows 脚本一起使用。

3.2.1 srec_cat 工具

srec_cat 一个功能非常强大的文件合并、转换工具,支持功能众多,包括:

  • 文件合并
  • 文件分割
  • bin 转 hex
  • hex 转 bin
  • 数据填充
  • CRC 校验

此外,还存在 srec 的系列工具,文件比较工具 srec_cmp.exe 和文件信息查看工具 srec_info.exe,可以从文章后面官方网站下载使用。

文件合并

命令格式:

srec_cat.exe <源文件0> <文件类型> <源文件1> <文件类型> <目标文件> <文件类型>

例子:

srec_cat.exe source0.bin -Binary source1.bin -Binary -o merge.bin -Binary
srec_cat.exe source0.hex -Intel source1.hex -Intel -o merge.hex -Intel

如果 BootLoader 和 App 生产的文件为 hex 格式,可以直接使用该命令合并为一个 hex 文件,注意地址的连续性。

bin 转 hex

命令格式:srec_cat.exe <bin 源文件> <-Binary> <-offset> <偏移地址> <-Output> <hex 目标文件> <-Intel>

例子:

将 Boot.bin 和 App.bin 合并的 Firmware.bin 转换为 hex 格式文件。

srec_cat.exe Firmware.bin -Binary -offset 0x8000000 -o Firmware.hex -Intel

0x8000000,是 STM32 的起始执行地址

更多的 srec 应用和工具下载详见官方网站:http://srecord.sourceforge.net/download.html

3.3 完整示例

第一步,在需要生成固件目录新建一个 txt 文件 第二步,键入如下内容(Boot 固件和 App 固件可以指定目录)

copy /b .\Boot.bin + .\App.bin Firmware.bin
srec_cat.exe Firmware.bin -Binary -offset 0x8000000 -o Firmware.hex -Intel
del Firmware.bin

第三步,重命名 txt 文件为".bat"后缀文件,即是 Windows 可执行脚本的文件类型 第四步,双击运行脚本,即可生成目标文件 出现任何目标文件生成失败的情况,检查相关源文件是否存在,路径是否正确。

3.4 举一反三

以此类比,存在多个 App 文件的情况,可以通过该方式分别进行合并出一个固件。

另外,实际项目中,经常会使用内部 flash 空闲扇区保存一些设备参数信息,如校准系数、设备地址、序列号等信息,我们可以将参数信息保存为一个 bin 文件,通过该方式和固件合并,这样量产时将参数和固件一并写入,提高生产效率!

Image

END

来源:嵌入式专栏

推荐阅读

欢迎大家点赞留言,更多 Arm 技术文章动态请关注极术社区嵌入式客栈专栏欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
2896
内容数
309
分享一些在嵌入式应用开发方面的浅见,广交朋友
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息