STM32 BootApp BIN文件合并SRecord工具从安装到实战全攻略文章摘要在 STM32 带 Bootloader 的项目中将 Boot 和 App 两个 BIN 文件合并为一个进行一次性烧录是常见需求。本文基于 STM32CubeMX Keil MDK5 工具链详细介绍如何使用开源工具 SRecord 的 srec_cat 命令完成 BIN 文件合并帮助你提升开发效率。一、前言你是否遇到过这样的场景项目中 Bootloader 和 Application 分别编译生成两个 BIN 文件烧录时需要分两次操作不仅效率低还容易因地址偏移搞错导致固件无法运行在 STM32 带 Bootloader 的项目开发中将 Boot 和 App 两个 BIN 文件合并为一个然后一次性烧录到芯片中是非常常见的需求。这不仅能简化烧录流程还能避免因手动设置地址带来的低级错误。本文将手把手教你使用SRecord这款开源工具完成以下目标了解 SRecord 工具的功能和核心组件在 Windows 环境下安装并配置 SRecord使用srec_cat命令将 Boot App 的 BIN 文件合并为一个掌握常用命令和常见问题排查方法二、前置条件在开始之前请确认你已经具备以下条件项目要求硬件STM32 开发板如 STM32F103C8T6软件环境STM32CubeMX Keil MDK5操作系统Windows 10/11固件文件已编译好的 Boot BIN 文件和 App BIN 文件知识基础了解 STM32 Flash 地址映射和链接脚本基本概念说明本文所有操作均基于STM32 STM32CubeMX Keil MDK5这套工具链后续不再特殊说明。三、为什么需要合并 BIN 文件3.1 传统烧录方式的痛点在没有合并工具的情况下烧录 Boot App 通常需要先烧录 Bootloader 到0x08000000再烧录 Application 到0x08004000或其他偏移地址这种方式存在两个问题效率低需要两次烧录操作易出错手动设置偏移地址容易搞错导致 App 无法运行3.2 合并后的优势使用 SRecord 合并后只需要将 Boot 和 App 合并为一个 BIN 文件从0x08000000地址一次性烧录好处操作简单、不易出错、适合批量生产。3.3 内存布局示意STM32 Flash 内存布局以 0x4000 偏移为例 0x08000000 ┌─────────────────────┐ │ │ │ Bootloader (16KB) │ │ │ 0x08004000 ├─────────────────────┤ │ │ │ Application │ │ │ │ │ 0x0801FFFF └─────────────────────┘四、SRecord 工具简介4.1 什么是 SRecordSRecord 是一套开源的 EPROM 加载文件处理工具包由 Peter Miller 开发使用 C 编写遵循 GNU GPL v3 许可证。它支持30 种固件文件格式的读取、写入、合并和转换。对于嵌入式开发SRecord 最常用的场景包括合并多个固件文件Bootloader Application转换固件格式BIN ↔ HEX 等填充或删除空白区域计算或检验 CRC / 校验和截取或排除特定地址范围4.2 三个核心工具SRecord 提供了三个核心命令行工具工具命令功能合并与转换srec_cat将多个固件文件合并或转换格式比较文件srec_cmp比较两个固件文件是否相等查看信息srec_info打印固件文件的摘要信息本文重点我们主要使用srec_cat来完成 BIN 文件的合并操作。4.3 支持的常见格式格式扩展名说明读/写Binary.bin纯二进制文件无格式信息读写Intel HEX.hexIntel MCS-86 格式常用于单片机编程器读写Motorola S-Record.s19/.srecS记录格式读写C Array.c/.hC 数组声明可嵌入到固件中仅写五、下载与安装5.1 下载预编译版Step 1打开 SRecord 官方 SourceForge 下载页面https://sourceforge.net/projects/srecord/files/srecord-win32/1.63/Step 2下载 Windows 预编译压缩包文件名类似srecord-1.63-w32.zipStep 3解压到你想要安装的目录例如D:\srecord\Step 4解压后的目录结构如下D:\srecord\ ├── srec_cat.exe ← 合并转换工具主要使用 ├── srec_cmp.exe ← 文件比较工具 ├── srec_info.exe ← 信息查看工具 ├── srecord-1.63.pdf ← 官方参考手册 ├── README.md ├── Readme.txt └── Readme-Windows.txt注意可执行文件直接在根目录下没有bin子目录直接使用即可。六、配置环境变量为了能在任意命令行位置直接使用srec_cat需要将其添加到系统 PATH 环境变量中。Step 1右键点击此电脑选择属性Step 2点击高级系统设置 → “环境变量”Step 3在系统变量中找到Path点击编辑Step 4新增一条填入 SRecord 所在的目录路径D:\srecordStep 5点击确定保存关闭并重新打开命令提示符窗口Step 6验证安装是否成功srec_cat--version如果显示版本信息如srec_cat version 1.63则说明安装成功。⚠️注意如果提示不是内部或外部命令请检查路径是否正确或关闭并重新打开命令提示符窗口。七、Keil MDK5 生成 BIN 文件在使用 SRecord 合并之前你需要先从 Keil MDK5 编译生成 Boot 和 App 的 BIN 文件。Keil 默认只生成 HEX 文件需要额外配置才能输出 BIN 文件。7.1 配置 Keil 自动生成 BIN 文件Step 1打开 Keil MDK5进入你的工程Boot 或 AppStep 2点击工具栏的Options for Target按钮或按快捷键Alt F7Step 3切换到User选项卡Step 4在Run User Programs After Build/Rebuild区域勾选Run #1Step 5在对应的输入框中填入以下命令fromelf --bin --output $LL.bin #LStep 6点击OK保存配置配置完成后每次编译工程Build 或 RebuildKeil 会自动在工程输出目录生成对应的.bin文件。7.2 fromelf 命令参数说明参数含义fromelfKeil 自带的 ELF 转换工具--bin输出纯二进制格式BIN--output $LL.bin指定输出文件路径和名称$L工程输出目录的路径L当前工程的目标名称不含扩展名#L当前编译生成的 ELF 文件路径7.3 手动生成 BIN 文件如果你不想配置自动生成功能也可以在编译完成后手动执行命令fromelf--bin--outputObjects\boot.binObjects\boot.axffromelf--bin--outputObjects\app.binObjects\app.axf说明Objects是 Keil 默认的输出目录boot.axf和app.axf是编译生成的 ELF 文件名称与你的工程名一致。7.4 确认 BIN 文件生成编译完成后检查工程输出目录默认为Objects或Listings应该能看到生成的.bin文件ProjectFolder/ ├── Objects/ │ ├── boot.bin ← 生成的 Boot BIN 文件 │ ├── boot.axf ← 编译生成的 ELF 文件 │ ├── boot.hex ← 默认生成的 HEX 文件 │ └── ... └── ...⚠️注意Boot 和 App 需要分别在各自的工程中编译生成 BIN 文件确保两个工程的 IROM1 地址配置正确。八、合并 BIN 文件实战8.1 前提准备在合并之前你需要确认以下信息参数说明示例Boot BIN 文件Bootloader 的二进制文件boot.binApp BIN 文件Application 的二进制文件app.binBoot 起始地址STM32 Flash 基址0x08000000App 起始地址App 在 Flash 中的实际地址0x08004000输出文件名合并后的文件名merged.bin重要App 起始地址必须与你的 App 工程链接脚本中 FLASH 的起始地址一致否则烧录后 App 无法正常运行8.2 确定 App 偏移地址在 Keil MDK5 中打开你的 App 工程点击Options for Target→Target选项卡查看IROM1的起始地址IROM1: Start 0x08004000, Size 0x0001C000其中Start 0x08004000就是 App 的偏移地址。或者在 STM32CubeMX 中配置时查看 Linker Script 中的 FLASH 定义MEMORY { RAM (xrw) : ORIGIN 0x20000000, LENGTH 20K FLASH (rx) : ORIGIN 0x08004000, LENGTH 112K }常见 App 偏移地址对照表Boot 大小Keil 中的 App 起始地址srec_cat 中的-offset值16 KB0x08004000-offset 0x400032 KB0x08008000-offset 0x800048 KB0x0800C000-offset 0xC00064 KB0x08010000-offset 0x10000128 KB0x08020000-offset 0x200008.3 基本合并命令假设你的 App 偏移为0x4000即 16KB在命令提示符中执行srec_cat boot.bin-binary^ app.bin-binary-offset0x4000 ^-omerged.bin-binary说明^是 Windows CMD 的换行符用于将长命令分成多行书写方便阅读。你也可以写在一行内。一行版本srec_cat boot.bin-binaryapp.bin-binary-offset0x4000-omerged.bin-binary8.4 命令参数详解参数含义boot.bin输入的 Bootloader BIN 文件-binary指定输入文件格式为纯二进制app.bin输入的 Application BIN 文件-offset 0x4000App 相对于 Boot 的偏移地址16KB-o merged.bin输出文件名-binary输出格式为纯二进制8.5 验证合并结果合并完成后使用srec_info查看合并文件的信息srec_info merged.bin输出示例Format: Binary Header: 0 Start: 0x00000000 Data: 0x00000000 .. 0x00003FFF 0x00004000 .. 0x0000FFFF你应该能看到两段数据区域分别对应 Boot从 0 开始和 App从 0x4000 开始。还可以用srec_cmp比较合并前后的数据是否一致srec_cmp boot.bin-binarymerged.bin-binarysrec_cmp app.bin-binary-offset0x4000 merged.bin-binary如果比较结果显示一致说明合并正确无误。九、进阶用法9.1 合并并填充空白区域为 0xFFFlash 擦除后的默认值是0xFF。如果你希望合并后的文件填充 Boot 和 App 之间的空白区域srec_cat boot.bin-binary^ app.bin-binary-offset0x4000 ^-fill0xFF-overmerged.bin ^-omerged.bin-binary9.2 合并三个或更多文件如果你有 Boot、App、User Data 三个文件srec_cat boot.bin-binary^ app.bin-binary-offset0x4000 ^ data.bin-binary-offset0x10000 ^-omerged.bin-binary9.3 BIN 转 HEX 格式如果需要将合并后的 BIN 转为 Intel HEX 格式某些烧录器需要 HEX 格式srec_cat boot.bin-binary^ app.bin-binary-offset0x4000 ^-omerged.hex-intel9.4 截取特定地址范围如果你只需要提取 App 部分的数据srec_cat merged.bin-binary-crop0x4000 0x10000 ^-oapp_only.bin-binary9.5 常用过滤器速查过滤器命令示例功能offset-offset 0x4000偏移数据的地址crop-crop 0x0000 0x4000截取指定地址范围exclude-exclude 0x1000 0x2000排除指定地址范围fill-fill 0xFF -over merged.bin用指定值填充空白CRC32-crc32 -at 0x3FFF0在指定地址插入 CRC32byte-swap-byte-swap 2交换字节序大小端转换