STM32 BootLoader 实战合集:从 APP 跳转到安全升级完整路线
2026/6/11 11:15:10 网站建设 项目流程

摘要

这个合集围绕 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 跳转前要设置 MSP

4. 第二篇: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 可以通过命令请求进入 BootLoader

5. 第三篇:串口 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 校验并跳转 APP

15.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分区 固件升级 嵌入式 单片机

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询