【嵌入式开发学习】__如何将BootLoader与APP合并成一个固件

目录

一、前言

二、传统方式

三、高效方式

1. 合并文件

2. bin转hex

srec_cat工具

3. 完整示例

4. 举一反三

(* ̄︶ ̄)创作不易!期待你们的 点赞、收藏和评论喔。 


一、前言

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

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

二、传统方式

一些传统的方法都是“土办法”,没什么毛病,但比较繁琐。

项目种类增加,或者版本发布频繁时更加体现出繁琐性,且易出错,操作稍微失误可能导致固件不完整;烧录不完整的固件,机子变“砖头”。

  • 烧录两次,分别烧录BootLoader和App固件

  • 烧录固件到芯片后,再从芯片读取固件,另存为hex文件

  • 手动复制、合并固件

  • BootLoader支持App固件传输功能的,只烧录BootLoader,后期再升级App

三、高效方式

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

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不同。 

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脚本一起使用。

srec_cat工具

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

  1. 文件合并

  2. 文件分割

  3. bin转hex

  4. hex转bin

  5. 数据填充

  6. 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. 完整示例

  • 第一步,在需要生成固件目录新建一个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可执行脚本的文件类型;
  • 第四步,双击运行脚本,即可生成目标文件 出现任何目标文件生成失败的情况,检查相关源文件是否存在,路径是否正确。

4. 举一反三

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

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


(* ̄︶ ̄)创作不易!期待你们的 点赞收藏评论喔。 

本文来源网络,免费分享知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除!

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
STM32 bootloader app合并是指将MCU的启动程序和应用程序合并到一起,可以在单个MCU中实现启动程序和应用程序两种不同的功能。这种技术有助于简化系统设计和开发流程,减少本和减少系统板子的体积。 在STM32单片机开发中,bootloaderapp分别是分开编写的。bootloader在芯片出厂后就已经存在,主要负责系统的初始化、底层硬件的配置以及app的加载、升级和运行。app是用户程序,包括主函数等,通常是由开发人员或客户按照需求编写的。 为了实现bootloaderapp合并,需要在编写app时做一些特殊处理。主要有以下几个方面: 1.确定代码入口 合并后的代码需要在单片机上运行,所以需要确定代码的入口地址。一般情况下,bootloader的代码会占用一些内存,app的代码入口需要从bootloader的后面开始。如果bootloader占用的内存不一定严格固定,可以使用一个全局变量来指示app的入口地址。 2.禁用某些功能 为了保证bootloader正常运行,app中有些功能不能使用。例如,如果app中涉及到修改bootloader中的某些参数或实现特定的外设控制,可能会干扰bootloader的正常工作。解决这个问题的方法是,在app中禁用相关的功能。 3.编写代码复位程序 合并后的代码需要能够执行复位操作,即允许app重新启动。为了实现这一功能,需要编写复位程序(Reset)。 总之,STM32 bootloader app合并不是一件简单的事情,需要开发人员根据具体应用需求做出相应的处理,确保代码的可靠性和运行稳定性。但是,在现代嵌入式系统中,将bootloaderapp合并在一起已经为常见技术,为MCU的开发提供了更大的灵活性和优秀性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rleco.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值