STM32 BootLoader 配套资源包使用说明:分区表、排查清单、固件头模板与升级流程
摘要
前面 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.md
4.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.md
5.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.md
6.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.md
7.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
flags
BootLoader 收到固件后,先检查这些字段。
检查通过再擦写 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.bin
7.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 可以请求进入 BootLoader
9.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 = 10203
BootLoader 比较 version_code,不要比较字符串。
12. 常见错误
12.1 直接发送 app.bin
如果 BootLoader 设计的是接收固件包,就不要直接发送原始 app.bin。
应该先打包:
app.bin -> app.fw
再发送:
app.fw
12.2 APP 地址只改了 BootLoader
必须同时改:
BootLoader APP_BASE
APP 工程链接地址
APP VTOR
打包工具 app_base
12.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 大小是否一致
最后一包填充是否算进 CRC
13.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
防回滚
嵌入式
更多推荐

所有评论(0)