摘要
前面 BootLoader 系列文章主要讲原理和实现思路。
但真正做项目时,只看文章还不够。
很多内容最好有一份可以直接拿来对照、修改、移植的资料:
Flash 分区表 APP 跳转排查清单 串口 YMODEM 升级流程 W5500 TCP YMODEM 升级流程 固件头结构体模板 CRC32 代码 升级记录区模板 固件打包脚本所以我整理了一套 STM32 BootLoader 配套资源包。
这些资源不是完整商业工程,也不是直接复制就能适配所有板子的万能代码。
它们更适合用作:
项目设计参考 移植检查清单 代码模板 调试对照资料 上位机和 BootLoader 联调说明这篇专门说明资源包里有什么、适合谁、怎么用,以及和 BootLoader 系列文章如何配合。
目录
- 1. 资源包适合谁
- 2. 资源包不适合什么场景
- 3. 当前资源包清单
- 4. 资源一:Flash 分区表
- 5. 资源二:APP 跳转排查清单
- 6. 资源三:YMODEM 与 W5500 升级流程
- 7. 资源四:固件头、CRC、防回滚模板
- 8. 建议下载顺序
- 9. 如何配合文章使用
- 10. 如何移植到自己的工程
- 11. 使用前必须确认的参数
- 12. 常见错误
- 13. 资源包里的代码怎么定位问题
- 14. 适合做成项目资料的内容
- 15. 总结
1. 资源包适合谁
这套资源包适合下面几类读者。
1.1 正在做 STM32 BootLoader 的开发者
如果你正在做:
STM32 IAP APP 跳转 串口 YMODEM 升级 W5500 网口升级 Flash 分区设计 固件头和 CRC 校验 版本防回滚可以用资源包里的表格、清单和模板对照自己的工程。
1.2 文章看懂了,但不知道怎么落到工程里的人
文章讲的是思路。
资源包解决的是:
地址怎么填 检查项怎么列 结构体怎么定义 打包脚本怎么写 升级流程怎么画适合边看文章边对照。
1.3 想快速搭一个 BootLoader 骨架的人
如果你不想从空白文件开始,可以先看:
boot_jump_app.c app_vector_relocate.c boot_firmware_header.h boot_crc32.c boot_record.c firmware_pack_tool.py再根据自己的芯片和工程改。
1.4 做项目文档和交付资料的人
资源包里有:
Flash 分区表 升级流程说明 排查清单 移植说明这些内容可以作为项目内部设计文档的基础。
2. 资源包不适合什么场景
为了避免误解,先说明边界。
这套资源包不是:
完整量产工程 适配所有 STM32 型号的通用库 可直接烧录运行的 Keil/CubeIDE 工程 带完整 UI 的上位机软件 带完整安全签名体系的商用 OTA 平台它更像:
BootLoader 学习和移植资料包使用时需要你根据自己的项目修改:
芯片型号 Flash 大小 APP 起始地址 BootLoader 大小 参数区地址 串口号和波特率 W5500 IP 和端口 目标板卡 ID 版本号规则不要直接把里面的地址复制到项目里就烧录。
BootLoader 代码最怕地址不匹配。
3. 当前资源包清单
当前整理了 4 个资源包。
01_STM32_BootLoader_Flash分区表.zip 02_STM32_BootLoader_APP跳转排查清单.zip 03_STM32_BootLoader_YMODEM_W5500升级流程.zip 04_STM32_BootLoader_固件头CRC防回滚模板.zip对应内容:
| 编号 | 资源包 | 主要内容 |
|---|---|---|
| 01 | Flash 分区表 | F103、F407、G473 分区参考表 |
| 02 | APP 跳转排查清单 | 跳转代码、VTOR 示例、排查清单 |
| 03 | YMODEM / W5500 升级流程 | 串口升级流程、网口升级流程、状态流程图 |
| 04 | 固件头 CRC 防回滚模板 | 固件头、CRC32、升级记录、打包脚本 |
这 4 个资源包对应 BootLoader 系列中最容易落地的部分。
4. 资源一:Flash 分区表
资源包名称:
01_STM32_BootLoader_Flash分区表.zip主要文件:
STM32_BootLoader_Flash分区表_F103_F407_G473.xlsx README.md README_UPLOAD.md4.1 这个资源解决什么问题
BootLoader 项目第一件事就是规划 Flash。
要先确定:
BootLoader 放哪里 BootLoader 占多大 APP 从哪里开始 APP 最大多大 参数区放哪里 升级记录区放哪里 是否需要 A/B 双分区如果这些地址一开始没规划好,后面会反复改:
APP 链接地址 VTOR Flash 擦除范围 固件头 app_base 上位机打包参数这个资源包就是帮你先把分区表画清楚。
4.2 覆盖哪些芯片
当前主要以三个型号为例:
STM32F103C8T6 STM32F407VET6 STM32G473VET6分别对应三类典型情况:
F103C8T6:Flash 小,适合简单串口 BootLoader F407VET6:Flash 较大,适合网口、固件头、较完整功能 G473VET6:适合更完整的产品化分区设计4.3 怎么使用
建议使用方式:
1. 打开 Excel 分区表 2. 找到接近自己芯片容量的方案 3. 修改 BootLoader 大小 4. 修改 APP 起始地址 5. 修改参数区或记录区地址 6. 确认擦除单位边界 7. 把最终地址同步到工程和打包工具最终至少要同步到:
BootLoader flash_layout.h APP 链接脚本 APP VTOR 上位机打包工具 项目文档4.4 使用时注意
F103、F407、G473 的 Flash 擦写单位不同:
F103:Page F407:Sector,且大小不均匀 G473:Page + Bank,需要注意 DBANK不要只看地址连续不连续。
还要看擦除单位是否独立。
尤其是:
参数区不要和 APP 共用同一个擦除单位 BootLoader 区不要被 APP 擦除范围覆盖5. 资源二:APP 跳转排查清单
资源包名称:
02_STM32_BootLoader_APP跳转排查清单.zip主要文件:
STM32_BootLoader_APP跳转排查清单.md boot_jump_app.c app_vector_relocate.c README_UPLOAD.md5.1 这个资源解决什么问题
BootLoader 最常见的问题就是:
APP 明明下载进去了,但跳转后 HardFault APP 单独下载能跑,BootLoader 跳不过去 APP 主循环能跑,但中断不进 串口、定时器、CAN 中断异常这个资源包就是专门查这些问题。
5.2 排查清单包含什么
排查清单主要包括:
检查 Flash 地址 检查 APP 向量表 检查 APP 工程配置 检查 VTOR 检查 BootLoader 跳转动作 检查 HardFault 最小验证顺序建议遇到跳转问题时,不要直接改代码。
先按清单逐项查。
5.3 boot_jump_app.c
这个文件提供 BootLoader 跳转 APP 的基本代码框架。
核心动作包括:
读取 APP 栈顶 读取 APP Reset_Handler 判断地址是否合法 关闭中断 关闭 SysTick 清理 NVIC 设置 VTOR 设置 MSP 跳转 APP移植时要重点修改:
APP_BASE_ADDR APP_MAX_SIZE SRAM 地址范围 NVIC 清理数量 芯片头文件5.4 app_vector_relocate.c
这个文件提供 APP 侧向量表重定位示例。
APP 启动后要设置:
SCB->VTOR=APP_BASE_ADDR;如果 APP 不设置 VTOR,常见现象是:
主循环能跑 中断不正常 一开串口中断就异常 定时器中断进错5.5 使用时注意
跳转相关代码必须和 APP 链接地址一致。
至少检查三处:
BootLoader 里的 APP_BASE_ADDR APP 工程 IROM/FLASH 起始地址 APP 里的 SCB->VTOR这三处不一致,跳转问题很难避免。
6. 资源三:YMODEM 与 W5500 升级流程
资源包名称:
03_STM32_BootLoader_YMODEM_W5500升级流程.zip主要文件:
串口_YMODEM_升级流程.md W5500_TCP_YMODEM_升级流程.md BootLoader_升级状态流程图.mmd README_UPLOAD.md6.1 这个资源解决什么问题
很多 BootLoader 项目能跳 APP,但升级流程容易乱。
常见问题:
BootLoader 和上位机谁先发 什么时候发送 C 第 0 包怎么处理 什么时候擦 APP 什么时候写 APP_VALID TCP 分包怎么处理 断线后设备停在哪里这个资源包把串口和网口升级流程分别整理出来。
6.2 串口_YMODEM_升级流程.md
主要讲串口升级的顺序:
BootLoader 进入升级模式 周期发送 C 上位机发送 YMODEM 第 0 包 BootLoader 解析文件名和大小 BootLoader 擦除 APP 区 上位机发送数据包 BootLoader 写 Flash 接收完成 CRC 校验 写 APP 有效标志 复位或跳转 APP它适合和第三篇文章一起看。
6.3 W5500_TCP_YMODEM_升级流程.md
主要讲 W5500 网口升级。
关键点:
设备作为 TCP Server 上位机作为 TCP Client TCP 连接成功后仍要等待 BootLoader 准备好 YMODEM 数据跑在 TCP 字节流上 一次 send 不等于一次 recv 断线后要等待重新连接或重新升级它适合和第五篇文章一起看。
6.4 BootLoader_升级状态流程图.mmd
这是 Mermaid 流程图文件。
可以用来画:
BootLoader 初始化 检查升级标志 检查 APP 等待升级 接收固件头 擦除 APP 接收数据 写 Flash 校验 标记有效 跳转 APP 错误处理如果项目要写内部设计文档,这个流程图可以作为基础。
6.5 使用时注意
流程图和说明不是固定标准。
你需要根据项目调整:
是否先完整接收再擦 APP 是否有外部 Flash 暂存 是否做 A/B 分区 是否做签名校验 是否有上位机握手命令但整体顺序不要乱:
检查 -> 接收 -> 写入 -> 校验 -> 标记有效不要接收一点就直接认为升级成功。
7. 资源四:固件头、CRC、防回滚模板
资源包名称:
04_STM32_BootLoader_固件头CRC防回滚模板.zip主要文件:
boot_firmware_header.h boot_crc32.c boot_record.c firmware_pack_tool.py README_移植说明.md README_UPLOAD.md7.1 这个资源解决什么问题
只接收原始app.bin有几个问题:
不知道固件给哪个芯片用 不知道固件给哪个板子用 不知道 APP 大小 不知道 APP CRC 不知道版本号 不知道是否允许回滚所以需要固件头。
这个资源包提供一套基础模板。
7.2 boot_firmware_header.h
这个文件定义固件头结构。
常见字段包括:
magic header_size target_chip target_board app_base app_size app_crc32 version_major version_minor version_patch version_build version_code flagsBootLoader 收到固件后,先检查这些字段。
检查通过再擦写 APP。
7.3 boot_crc32.c
这个文件提供 CRC32 计算模板。
用途:
上位机打包时计算 APP CRC BootLoader 写完 APP 后重新计算 CRC 升级记录区保存自身 CRC注意:
上位机和 BootLoader 的 CRC 参数必须一致包括:
多项式 初始值 输入反转 输出反转 最终异或7.4 boot_record.c
这个文件提供升级记录区模板。
记录内容可以包括:
升级状态 APP 地址 APP 大小 APP CRC 版本号 写入进度 错误码 记录序号 记录 CRC它用于处理:
升级中断电 写入一半失败 CRC 校验失败 版本防回滚 APP 有效标志7.5 firmware_pack_tool.py
这是固件打包脚本模板。
它的作用是:
读取 app.bin 计算大小 计算 CRC32 填写固件头 输出带固件头的升级包基本思路:
app.bin -> firmware_pack_tool.py -> app.fw现场升级时发送:
app.fw不是直接发送:
app.bin7.6 README_移植说明.md
这个文件说明如何把模板移到自己的工程。
重点看:
文件说明 推荐使用方式 打包命令示例 注意事项建议先把模板跑在测试工程里,再合到正式工程。
8. 建议下载顺序
如果你刚开始做 BootLoader,建议按这个顺序使用资源包。
8.1 第一步:下载 Flash 分区表
先确定地址。
BootLoader 多大 APP 从哪里开始 参数区在哪里 记录区在哪里地址不清楚,后面都会乱。
8.2 第二步:下载 APP 跳转排查清单
先跑通:
BootLoader 跳 APP APP 中断正常 APP 能请求进入 BootLoader跳转不稳定,不要急着调升级。
8.3 第三步:下载 YMODEM / W5500 升级流程
再跑:
串口 YMODEM W5500 TCP YMODEM建议先串口,再网口。
8.4 第四步:下载固件头 CRC 防回滚模板
最后补:
固件头 APP CRC 版本号 防回滚 升级记录区 打包脚本这样 BootLoader 才不只是能升级,而是能判断固件是否可靠。
9. 如何配合文章使用
资源包和文章对应关系如下。
| 资源包 | 推荐配合文章 |
|---|---|
| Flash 分区表 | 入门教程、第二篇、第四篇、第八篇、第十一篇 |
| APP 跳转排查清单 | 入门教程、第二篇、第十二篇 |
| YMODEM / W5500 升级流程 | 第三篇、第五篇、第七篇、第十篇 |
| 固件头 CRC 防回滚模板 | 第六篇、第七篇、第九篇、第十二篇 |
9.1 做跳转
看:
入门教程 第二篇 APP 跳转排查清单资源目标:
BootLoader 可以跳 APP APP 中断正常 APP 可以请求进入 BootLoader9.2 做串口升级
看:
第三篇 YMODEM 升级流程资源 固件头模板资源目标:
串口发送固件 BootLoader 写入 APP CRC 通过 APP 有效标志写入9.3 做网口升级
看:
第五篇 W5500 TCP YMODEM 升级流程资源 第十篇上位机联调目标:
W5500 TCP 连接 YMODEM over TCP 断线超时处理9.4 做可靠性
看:
第六篇 第七篇 第八篇 第十二篇 固件头 CRC 防回滚模板目标:
升级记录区 断电恢复 版本防回滚 A/B 失败回滚10. 如何移植到自己的工程
资源包移植时,建议按下面步骤。
10.1 先确定芯片和 Flash 容量
确认:
芯片型号 Flash 总大小 SRAM 大小 Flash Page 或 Sector 大小 是否有 Bank 是否有写保护需求不要直接套 F103/F407/G473 的地址。
它们只是示例。
10.2 修改分区表
先改 Excel 或自己的分区文档。
确定:
BOOT_BASE BOOT_SIZE APP_BASE APP_SIZE PARAM_BASE PARAM_SIZE RECORD_BASE RECORD_SIZE确认所有分区都在 Flash 范围内。
10.3 同步工程配置
同步到:
BootLoader 工程宏定义 APP 工程链接地址 APP VTOR 打包工具 app_base 上位机配置最少检查三处:
BootLoader 认为 APP 在哪里 APP 实际链接到哪里 固件包头写的 app_base 是哪里10.4 移植跳转代码
修改:
APP_BASE_ADDR APP_MAX_SIZE SRAM 范围 NVIC 清理数量 芯片头文件先测试:
BootLoader 跳 APP APP 中断正常10.5 移植固件头和记录区
修改:
target_chip target_board app_base app_size version_code record address record erase unit记录区必须独立。
不要和 APP 共用擦除页或 Sector。
10.6 移植打包脚本
修改脚本参数:
目标芯片 目标板卡 APP 起始地址 APP 最大大小 版本号 输出文件名打包后,上位机或脚本应显示:
固件版本 APP 地址 APP 大小 APP CRC 目标板卡11. 使用前必须确认的参数
使用资源包前,建议先填一张表。
芯片型号: Flash 大小: SRAM 大小: BootLoader 起始地址: BootLoader 大小: APP 起始地址: APP 最大大小: 参数区地址: 记录区地址: 串口号: 波特率: W5500 IP: W5500 端口: 目标板卡 ID: 固件版本号规则:这些参数没定,资源包就不能直接改。
11.1 APP_BASE_ADDR
这是最重要的地址之一。
它必须同时出现在:
BootLoader APP 链接脚本 APP VTOR 固件头 打包工具 上位机显示只改一处不够。
11.2 APP_MAX_SIZE
APP 最大大小要小于 APP 分区。
还要考虑:
是否预留参数区 是否预留记录区 是否做 A/B 是否有固件头11.3 target_board
建议每个硬件板卡都有独立 ID。
不要只靠芯片型号判断。
同样是 F407,也可能有不同外设、不同 Flash 分区、不同启动条件。
11.4 version_code
版本号显示可以是:
1.2.3但防回滚最好用单调递增的:
version_code = 10203BootLoader 比较version_code,不要比较字符串。
12. 常见错误
12.1 直接发送 app.bin
如果 BootLoader 设计的是接收固件包,就不要直接发送原始app.bin。
应该先打包:
app.bin -> app.fw再发送:
app.fw12.2 APP 地址只改了 BootLoader
必须同时改:
BootLoader APP_BASE APP 工程链接地址 APP VTOR 打包工具 app_base12.3 记录区和 APP 共用擦除单位
如果记录区和 APP 共用同一个 Page 或 Sector,升级时很容易互相影响。
记录区要独立。
12.4 F407 用 F103 的 Page 算法
F407 是 Sector。
不能按等大小 Page 计算擦除范围。
12.5 W5500 升级时没处理 TCP 分包
TCP 是字节流。
不要假设一次 send 对应一次 recv。
12.6 上位机只显示“升级失败”
现场排查必须有:
阶段 包号 错误码 设备 ID 固件版本 日志否则失败后很难定位。
13. 资源包里的代码怎么定位问题
13.1 跳转失败
看:
STM32_BootLoader_APP跳转排查清单.md boot_jump_app.c app_vector_relocate.c重点查:
APP_BASE 内容 栈顶地址 Reset_Handler APP 链接地址 VTOR BootLoader 跳转前清理13.2 CRC 失败
看:
boot_crc32.c firmware_pack_tool.py重点查:
上位机和 BootLoader CRC 参数是否一致 计算范围是否一致 APP 大小是否一致 最后一包填充是否算进 CRC13.3 升级后断电恢复异常
看:
boot_record.c重点查:
记录区地址 记录区 CRC 升级状态 写入进度 APP 有效标志13.4 网口升级异常
看:
W5500_TCP_YMODEM_升级流程.md BootLoader_升级状态流程图.mmd重点查:
TCP 连接是否建立 BootLoader 是否发送 C recv 是否处理分包 ACK 节奏是否正确 断线后是否能重新升级14. 适合做成项目资料的内容
这些资源也可以整理进项目文档。
建议项目内部保留:
Flash 分区表 APP 跳转排查清单 升级流程图 YMODEM 协议说明 固件头字段说明 升级记录区字段说明 错误码表 上位机升级操作说明 现场升级失败处理说明这些资料对后期维护很有用。
不要只把代码交出去。
BootLoader 项目最怕没人知道:
APP 地址为什么是这个 固件头为什么不能写到 APP 起始地址 为什么升级失败后不能强行跳 APP 为什么 F407 不能按 Page 擦 为什么 TCP 不能按包 recv文档和清单能减少后期沟通成本。
15. 总结
这套 STM32 BootLoader 配套资源包主要解决“文章看懂以后怎么落地”的问题。
当前 4 个资源包分别对应:
Flash 分区设计 APP 跳转排查 串口 / W5500 升级流程 固件头 / CRC / 防回滚模板建议使用顺序:
先看分区表 再跑 APP 跳转 再调 YMODEM 升级 最后补固件头、CRC、版本和升级记录使用时一定要注意:
资源里的地址是示例,不是所有项目通用 APP_BASE 必须和 APP 链接地址一致 Flash 擦写必须按具体芯片适配 记录区要独立 打包工具参数要和 BootLoader 配置一致BootLoader 是一个很适合模板化的模块。
但模板不是直接复制,而是帮助你少漏检查项、少走弯路。
只要分区、跳转、升级流程、固件头和记录区这几块都对齐,后面的串口升级、网口升级、断电恢复和上位机联调都会顺很多。
文章标签
STM32 BootLoader IAP YMODEM W5500 Flash分区 固件头 CRC 防回滚 嵌入式