摘要

前面 BootLoader 系列文章主要讲原理和实现思路。

但真正做项目时,只看文章还不够。

很多内容最好有一份可以直接拿来对照、修改、移植的资料:

Flash 分区表
APP 跳转排查清单
串口 YMODEM 升级流程
W5500 TCP YMODEM 升级流程
固件头结构体模板
CRC32 代码
升级记录区模板
固件打包脚本

所以我整理了一套 STM32 BootLoader 配套资源包。

这些资源不是完整商业工程,也不是直接复制就能适配所有板子的万能代码。

它们更适合用作:

项目设计参考
移植检查清单
代码模板
调试对照资料
上位机和 BootLoader 联调说明

这篇专门说明资源包里有什么、适合谁、怎么用,以及和 BootLoader 系列文章如何配合。

目录

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
防回滚
嵌入式
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐