摘要
这个合集围绕 STM32 BootLoader 实战开发展开,内容从最基础的 APP 跳转开始,一直写到串口升级、网口升级、Flash 擦写、固件头、CRC、防回滚、断电恢复、A/B 分区、签名校验、上位机联调、工程移植和现场排查。
如果只是做一个能跳转 APP 的 BootLoader,代码并不复杂。
但真正用于产品时,BootLoader 要解决的问题会多很多:
APP 地址怎么偏移 中断向量表怎么处理 Flash 分区怎么规划 串口或网口怎么接收固件 升级中断电怎么办 写 Flash 失败怎么办 CRC 校验失败怎么办 旧版本固件能不能回滚 固件能不能被伪造 升级失败后设备能不能恢复 上位机怎么显示进度和错误 不同 STM32 型号怎么移植 现场问题怎么定位这个系列的目标不是只给一段跳转代码,而是把 STM32 BootLoader 从“能跑”写到“能用于项目”。
目录
- 1. 这个合集适合谁
- 2. 推荐阅读顺序
- 3. 第一篇:BootLoader 入门教程
- 4. 第二篇:APP 偏移、固件校验与升级标志
- 5. 第三篇:串口 YMODEM 升级 APP 固件
- 6. 第四篇:F103、F407、G473 的 Flash 擦写适配
- 7. 第五篇:基于 W5500 网口的 YMODEM 升级
- 8. 第六篇:固件头、CRC、版本号与防回滚
- 9. 第七篇:升级状态机、错误码与异常恢复
- 10. 第八篇:A/B 双分区升级与失败回滚
- 11. 第九篇:固件加密、签名校验与防篡改
- 12. 第十篇:上位机升级工具联调流程
- 13. 第十一篇:工程移植模板与多芯片适配
- 14. 第十二篇:常见问题排查、量产测试与现场维护
- 15. 按需求怎么选文章
- 16. 一条完整的 BootLoader 产品化路线
- 17. 学习时最容易踩的坑
- 18. 总结
1. 这个合集适合谁
这个合集适合下面几类读者。
1.1 正在做 STM32 IAP 的开发者
如果你正在做:
STM32 在线升级 串口升级 网口升级 BootLoader 跳转 APP APP 固件校验 升级失败恢复可以按这个合集从前往后看。
前面几篇解决基础流程,后面几篇解决工程可靠性。
1.2 有 STM32 基础,但没完整做过 BootLoader 的读者
你可能已经会:
GPIO 串口 定时器 Flash 读写 STM32CubeMX 或 Keil 工程配置但没完整做过:
APP 地址偏移 向量表重定位 BootLoader 跳转 YMODEM 接收 固件头设计 断电恢复这个系列可以把这些点串起来。
1.3 做工业设备维护和远程升级的工程师
工业设备现场升级不只是“能下载固件”。
还要考虑:
现场断电 通信中断 固件传错 版本回滚 客户误操作 升级后设备不上线这个系列后半部分重点就是这些工程问题。
1.4 想把 BootLoader 做成项目模板的人
如果你希望整理一套可以复用的 BootLoader 模板,可以重点看:
第四篇 Flash 适配 第六篇 固件头和升级记录 第七篇 状态机 第十一篇 工程移植模板 第十二篇 排查清单这些内容更偏工程结构。
2. 推荐阅读顺序
建议按下面顺序阅读。
入门教程 -> APP 偏移和跳转 -> 串口 YMODEM -> Flash 擦写适配 -> W5500 网口升级 -> 固件头、CRC、防回滚 -> 状态机、错误码、断电恢复 -> A/B 双分区 -> 固件安全 -> 上位机联调 -> 工程移植 -> 常见问题排查如果你只想先跑通最小版本,可以先看:
入门教程 第二篇 第三篇 第四篇如果你已经能升级,但想提高可靠性,可以看:
第六篇 第七篇 第八篇 第十二篇如果你想做产品化升级,可以看:
第八篇 第九篇 第十篇 第十一篇 第十二篇3. 第一篇:BootLoader 入门教程
文章标题:
STM32 BootLoader 入门教程:从原理到 APP 跳转实现这篇是整个系列的入口。
主要解决几个基础问题:
BootLoader 是什么 STM32 上电后从哪里启动 为什么 BootLoader 要放在 0x08000000 APP 为什么要偏移 BootLoader 如何跳转 APP APP 工程需要改哪些地方其中最重要的一点是:
BootLoader 应该放在 0x08000000因为 STM32 上电后默认从 Flash 起始地址取栈顶和 Reset_Handler。
如果 BootLoader 不放在起始地址,就不能作为第一段启动程序接管设备。
这篇适合刚接触 BootLoader 的读者。
读完以后,至少要搞清楚:
0x08000000 放 BootLoader APP 放到后面的偏移地址 APP 工程链接地址要改 APP 需要设置 VTOR BootLoader 跳转前要设置 MSP4. 第二篇:APP 偏移、固件校验与升级标志
文章标题:
STM32 BootLoader 实战(二):APP 偏移配置、固件校验与升级标志设计第一篇讲了跳转原理。
第二篇开始进入工程设计。
重点内容:
APP 起始地址如何确定 Keil、CubeIDE、IAR 怎么改 APP 地址 APP 中断向量表怎么重定位 BootLoader 跳转 APP 前要做哪些清理 如何判断 APP 是否有效 固件包头不要直接写到 APP 起始地址 升级标志位怎么设计这篇非常关键。
很多 BootLoader 问题都出在这里:
APP 工程没有改链接地址 APP 没有设置 VTOR BootLoader 直接跳到了空地址 固件头把 APP 向量表顶掉了 升级标志和 APP 共用擦除页建议读者在这一篇后完成一个最小验证:
BootLoader 可以检查 APP 是否有效 BootLoader 可以跳转 APP APP 串口中断和定时器中断正常 APP 可以通过命令请求进入 BootLoader5. 第三篇:串口 YMODEM 升级 APP 固件
文章标题:
STM32 BootLoader 实战(三):串口 YMODEM 升级 APP 固件串口 YMODEM 是最适合入门和调试的升级方式。
这篇重点讲:
串口 IAP 整体流程 为什么选择 YMODEM YMODEM 数据包格式 BootLoader 串口升级状态机 APP bin 文件要求 接收 YMODEM 数据包 解析 YMODEM 第 0 包 擦除 APP Flash 写入 APP Flash 固件 CRC 与 APP 有效标志 上位机发送固件这篇解决的是:
如何把一个 app.bin 通过串口写进 STM32 内部 Flash串口升级的优点是:
链路简单 容易抓日志 方便用串口工具验证 适合调试 BootLoader 主流程建议先用串口把升级跑通,再做网口升级。
6. 第四篇:F103、F407、G473 的 Flash 擦写适配
文章标题:
STM32 BootLoader 实战(四):F103、F407、G473 的 Flash 擦写适配与分区保护BootLoader 里最不能写错的就是 Flash。
这篇重点讲三类芯片的差异:
STM32F103C8T6 STM32F407VET6 STM32G473VET6重点内容:
为什么要单独封装 Flash 驱动 BootLoader 统一 Flash 接口 分区保护原则 F103 Page 擦写 F407 Sector 擦写 G473 Bank/Page 擦写 升级中途断电处理 如何保护 BootLoader 区域 调试检查清单这篇最重要的结论:
不要把不同 STM32 系列的 Flash 擦写逻辑混用F103 是 Page。
F407 是不等大小 Sector。
G473 要考虑 Bank 和 Page。
如果擦写边界算错,轻则升级失败,重则把 BootLoader 自己擦掉。
7. 第五篇:基于 W5500 网口的 YMODEM 升级
文章标题:
STM32 BootLoader 实战(五):基于 W5500 网口的 YMODEM 升级 APP 固件串口升级适合调试,网口升级更适合现场维护。
这篇讲的是:
W5500 + TCP + YMODEM重点内容:
为什么网口升级还可以继续用 YMODEM W5500 网口升级整体流程 硬件连接和启动条件 网络参数和 Socket 规划 W5500 初始化代码 建立 TCP Server 把 TCP 接收适配成 YMODEM 字节接口 YMODEM over TCP 的接收流程 上位机发送方式 断线、超时和重复升级处理 调试日志和状态码这里最容易踩的坑是:
TCP 是字节流,一次 send 不等于一次 recv所以 BootLoader 不能假设上位机一次发送 1029 字节,下位机就一次收到 1029 字节。
要把 TCP 接收缓存适配成按字节读取,再交给 YMODEM。
8. 第六篇:固件头、CRC、版本号与防回滚
文章标题:
STM32 BootLoader 实战(六):APP 固件头、CRC 校验、版本号与防回滚设计前面几篇让设备能升级。
这篇让设备知道:
这份固件是不是完整 是不是给当前设备用 版本是否允许升级 升级中断电后处于什么状态重点内容:
YMODEM 自带 CRC 为什么还不够 固件包和 APP 镜像要分清楚 固件头字段设计 固件头放在哪里 打包工具生成固件包 BootLoader 解析固件头 APP 整包 CRC 校验 版本号和防回滚 升级记录区设计 断电后的恢复逻辑 串口、网口 YMODEM 如何衔接固件头这篇的核心思想:
BootLoader 不应该盲目接收 app.bin更好的做法是让上位机先打包:
固件头 + APP 数据 + CRC/版本信息BootLoader 收到后先判断,再擦写。
9. 第七篇:升级状态机、错误码与异常恢复
文章标题:
STM32 BootLoader 实战(七):升级状态机、错误码与异常恢复设计BootLoader 代码不能只写成一大段流程。
升级过程中会遇到:
超时 断线 重复升级 取消升级 Flash 写失败 CRC 失败 断电恢复如果没有状态机,后期很难维护。
这篇重点讲:
为什么 BootLoader 要做状态机 主状态设计 升级事件设计 状态切换表 错误码设计 升级上下文结构体 串口和网口如何复用状态机 Flash 写入异常处理 CRC 失败后的处理 超时、断线和重复升级 断电恢复和升级记录区 调试日志怎么打 上位机应该显示哪些信息这篇适合把 BootLoader 从 demo 改成工程代码。
重点是:
每个阶段有状态 每个失败有错误码 每个异常有处理策略10. 第八篇:A/B 双分区升级与失败回滚
文章标题:
STM32 BootLoader 实战(八):A/B 双分区升级、启动选择与失败回滚设计单 APP 分区最大的问题是:
一旦开始擦 APP,旧程序就不完整如果此时断电、断线、写入失败,设备只能停留 BootLoader 等待重新升级。
A/B 双分区解决的是这个问题。
重点内容:
单 APP 分区的问题 A/B 双分区的基本思路 哪些项目适合 A/B F103、F407、G473 的分区建议 A/B 分区记录结构 固件头需要增加哪些字段 BootLoader 上电如何选择启动分区 为什么要写非活动分区 新 APP 第一次启动为什么不能马上确认成功 APP 如何确认启动成功 回滚逻辑怎么设计 APP 向量表和链接地址 A/B 分区状态机这篇适合现场设备、远程设备、无人值守设备。
如果设备升级失败后必须尽量自动恢复,就应该考虑 A/B。
11. 第九篇:固件加密、签名校验与防篡改
文章标题:
STM32 BootLoader 实战(九):固件加密、签名校验与防篡改设计CRC 能防传输错误,但不能防伪造。
别人可以改完固件后重新计算 CRC。
所以产品阶段还要考虑:
固件是否来自你 固件是否被篡改 旧固件能否被重放 固件内容是否需要保密这篇重点讲:
CRC 能解决什么,不能解决什么 固件安全的完整性、真实性、保密性 加密、Hash、HMAC、数字签名的区别 推荐的三档方案 固件包格式扩展 签名应该覆盖哪些内容 BootLoader 验签流程 单 APP 分区和 A/B 分区的差异 AES 加密流程 密钥和公钥放在哪里 防重放和防回滚的关系 F103、F407、G473 上的取舍这篇适合有产品安全需求的项目。
核心结论:
加密负责保密 签名负责防篡改和防伪造 防回滚要靠 version_code 和升级记录区12. 第十篇:上位机升级工具联调流程
文章标题:
STM32 BootLoader 实战(十):上位机升级工具联调流程与问题定位BootLoader 不是单片机一个人的事。
真正升级时,上位机也很重要。
这篇重点讲:
上位机工具负责什么 推荐的工具界面结构 固件选择和本地校验 串口升级联调流程 W5500 TCP 升级联调流程 进入 BootLoader 的几种方式 握手协议怎么设计 YMODEM 发送端状态机 进度条应该怎么算 错误码和提示文案 设备复位和重新连接 日志怎么打才方便排查 批量升级注意事项 C# 上位机代码结构示例 联调检查清单这篇的重点是:
上位机不能只显示一个进度条它应该显示:
当前阶段 当前包号 传输进度 BootLoader 错误码 升级前版本 升级后版本 日志否则现场排查很困难。
13. 第十一篇:工程移植模板与多芯片适配
文章标题:
STM32 BootLoader 实战(十一):工程移植模板、链接脚本与多芯片适配代码在一个芯片上跑通,不代表很容易移到另一个芯片。
这篇讲的是工程组织和移植方法。
重点内容:
为什么要做工程模板 推荐的工程目录结构 配置文件分层 Flash 分区表统一定义 BootLoader 和 APP 的链接地址 Keil、CubeIDE、IAR 分别要改哪里 APP 启动文件和 VTOR Flash 驱动适配层 通信通道适配层 固件头和打包工具参数 F103C8T6 移植模板 F407VET6 移植模板 G473VET6 移植模板 从一个芯片移到另一个芯片的步骤 map 文件和 bin 文件检查这篇适合把 BootLoader 做成可维护工程。
核心思想:
地址集中配置 Flash 驱动分芯片适配 通信通道统一接口 APP 链接地址、VTOR、打包工具参数保持一致14. 第十二篇:常见问题排查、量产测试与现场维护
文章标题:
STM32 BootLoader 实战(十二):常见问题排查、量产测试与现场维护清单这是偏排障手册的一篇。
重点不是新增功能,而是解决:
出了问题怎么查 量产前怎么测 现场升级失败怎么处理 返厂分析要保存什么主要内容:
BootLoader 排查要先分层 最小闭环验证流程 APP 跳转失败怎么排查 进入 BootLoader 失败怎么排查 YMODEM 第 0 包失败怎么排查 数据包传输中断怎么排查 Flash 擦写失败怎么排查 CRC 或 Hash 校验失败怎么排查 断电恢复异常怎么排查 A/B 分区回滚异常怎么排查 固件签名和防回滚问题怎么排查 上位机显示成功但设备没运行 量产测试流程 现场升级操作清单 返厂分析需要保存哪些信息如果你的 BootLoader 已经能跑,这篇可以帮助你把它变得更适合交付。
15. 按需求怎么选文章
不同阶段可以重点看不同文章。
15.1 只想实现 APP 跳转
建议看:
入门教程 第二篇 第十二篇中的 APP 跳转排查目标:
BootLoader 从 0x08000000 启动 APP 从偏移地址启动 APP 中断正常15.2 想实现串口升级
建议看:
第二篇 第三篇 第四篇 第七篇 第十篇目标:
上位机通过串口发送固件 BootLoader 接收 YMODEM 写入 APP Flash 校验并跳转 APP15.3 想实现网口升级
建议看:
第三篇 第四篇 第五篇 第七篇 第十篇目标:
W5500 建立 TCP Server 上位机作为 TCP Client YMODEM over TCP 断线超时可恢复15.4 想提高可靠性
建议看:
第六篇 第七篇 第八篇 第十二篇目标:
固件头检查 CRC 校验 版本防回滚 升级记录区 断电恢复 A/B 回滚15.5 想做产品级安全升级
建议看:
第六篇 第八篇 第九篇 第十篇 第十一篇 第十二篇目标:
固件签名 防篡改 防重放 防回滚 A/B 分区 上位机日志 量产测试16. 一条完整的 BootLoader 产品化路线
如果从零开始做一个 BootLoader,可以按这个路线推进。
16.1 第一阶段:最小跳转
完成:
BootLoader 固定在 0x08000000 APP 链接到 APP_BASE BootLoader 检查 APP 栈顶和 Reset_Handler BootLoader 跳转 APP APP 设置 VTOR这个阶段不要急着加 YMODEM。
先把跳转跑稳。
16.2 第二阶段:串口升级
完成:
串口等待升级 YMODEM 接收 擦除 APP 区 写入 APP 区 CRC 校验 写 APP 有效标志 复位或跳转 APP这个阶段用串口日志定位问题。
16.3 第三阶段:Flash 适配和分区保护
完成:
F103/F407/G473 分芯片适配 统一 Flash 接口 擦写边界检查 禁止擦 BootLoader 区 参数区独立这一阶段决定后面能不能稳定。
16.4 第四阶段:固件头和升级记录
完成:
固件头 APP 大小 APP CRC 版本号 目标芯片 目标板卡 升级记录区 断电恢复状态这一步让 BootLoader 不再盲目写入。
16.5 第五阶段:状态机和错误码
完成:
升级状态机 错误码 上位机提示 超时处理 取消处理 重复升级处理 日志这一阶段让问题能定位。
16.6 第六阶段:网口和上位机
完成:
W5500 TCP 升级 串口和网口复用 YMODEM 上位机工具 固件解析 进度显示 日志保存 设备复位后重连这一阶段让升级工具能用于现场。
16.7 第七阶段:可靠性和安全
完成:
A/B 双分区 失败回滚 固件签名 防篡改 防重放 防回滚 量产保护配置这一阶段让 BootLoader 更接近产品化。
16.8 第八阶段:测试和交付
完成:
正常升级测试 异常升级测试 断电测试 错误固件测试 批量升级测试 现场操作清单 返厂分析记录没有测试清单的 BootLoader,很难放心交付。
17. 学习时最容易踩的坑
17.1 只改 BootLoader,不改 APP 链接地址
这是最常见问题。
APP 必须链接到 APP_BASE。
否则 BootLoader 跳转后很容易 HardFault。
17.2 固件头直接放在 APP 起始地址
APP 起始地址放的是向量表。
如果把固件头直接写到 APP 起始地址,会破坏:
初始栈顶 Reset_Handler 中断向量表固件头应该作为传输包头,或放在独立参数区,或放到 APP 内部固定偏移并配合链接脚本。
17.3 把 F407 Sector 当成等大小 Page
F407 Sector 不等大小。
不能用 F103 的 Page 思路直接套。
17.4 TCP 升级时假设一次 send 等于一次 recv
TCP 是字节流。
这点在 W5500 升级里非常重要。
17.5 上位机显示 100% 就算成功
传输完成不等于升级成功。
还要等:
BootLoader 校验通过 写记录成功 设备复位 APP 上报新版本17.6 只做 CRC,不做版本管理
CRC 只能说明数据完整。
不能防止旧版本覆盖新版本。
防回滚要靠版本号和升级记录区。
17.7 只加密,不签名
加密只是保密。
签名才是防篡改、防伪造。
17.8 没有断电测试
BootLoader 用于现场,必须测断电。
尤其是:
擦 APP 时断电 写 APP 时断电 写有效标志时断电 A/B PENDING 阶段断电18. 总结
STM32 BootLoader 看起来只是“启动 + 升级”,但真正做完整以后,它是一套系统工程。
从最小版本到产品版本,大概会经历:
APP 跳转 APP 偏移 串口升级 Flash 擦写 网口升级 固件头 CRC 校验 版本防回滚 状态机 错误码 断电恢复 A/B 分区 签名校验 上位机工具 工程移植 量产测试 现场维护这个合集就是按这个路线整理的。
建议学习时不要一上来追求大而全。
更稳的方式是:
先让 BootLoader 跳 APP 再让串口升级跑通 再补 Flash 边界保护 再补固件头和 CRC 再补状态机和错误码 再补断电恢复和 A/B 最后再做签名、安全、上位机和量产测试BootLoader 最重要的不是代码写得多,而是每个边界都清楚。
只要地址、分区、校验、记录、状态和日志都清楚,后面维护起来就会轻松很多。
文章标签
STM32 BootLoader IAP YMODEM W5500 Flash分区 固件升级 嵌入式 单片机