什么是 stm32‑bootloader?
stm32‑bootloader 是一套 可定制的启动加载程序,专为 STM32 系列 MCU 设计。它把 MCU 的上电流程分成两段:
-
1. Bootloader(引导程序)先跑,负责检查、擦除、写入新的固件文件。
-
2. 完成后 跳转 到你的业务代码(Application),两者像是“先检查后使用”。
这套代码本身是 开源 的,放在 lib/stm32-bootloader 目录里,配套的示例项目在 projects 里,直接拽进你的工程就能跑。
它解决了哪些痛点?
|
痛点 |
传统做法 |
使用 stm32‑bootloader 后的改变 |
| 固件升级只能靠外部工具 |
必须连上 ST‑Link、J‑Link、甚至专用 ISP 设备 |
在运行时通过 UART / SPI / SD 卡 等接口自行刷写 |
| 升级过程不安全 |
烧写中断会导致 MCU 变砖 |
内置 擦除/写入校验、CRC32 校验、写保护检测,出错自动回滚 |
| 多片 MCU 需要分别维护 bootloader |
每个项目都要手写一套启动代码 |
统一的库函数 |
| OTA(空中升级)难实现 |
需要自行搭建完整的协议栈 |
提供 扩展接口,可以直接接入 Wi‑Fi / BLE 模块,实现 OTA |
简而言之,它把 “只能在工厂/实验室刷写” 的局面,变成 “在现场、在生产线上、甚至在用户手里都能升级” 的可能。
安装 & 使用步骤(手把手)
下面的步骤以 STM32L496‑Discovery 为例,其他芯片只要改改
bootloader.h里的宏定义即可。
-
1. 克隆仓库
git clone https://github.com/akospasztor/stm32-bootloader.git
cd stm32-bootloader
2. 把 bootloader 加入你的工程
复制 lib/stm32-bootloader 里的 *.c/h 到项目的 src 与 inc 目录,或者直接在 IDE(Keil/IAR/STM32CubeIDE)里把整个文件夹加入 Source Group。
3. 配置 bootloader.h
-
•
BOOTLOADER_APP_ADDRESS:业务代码的起始地址(比如0x08008000)。 -
•
BOOTLOADER_USE_CRC:是否开启 CRC 校验,建议打开。 -
• 其它比如 UART 波特率、Flash 大小,根据硬件自行改。
4. 在 main.c 中调用
#include "bootloader.h"
int main(void)
{
HAL_Init();
SystemClock_Config();
/* 先跑 bootloader,决定是否跳转 */
if (Bootloader_Run() == BOOTLOADER_JUMP_TO_APP) {
JumpToApplication(); // 业务代码入口
}
while (1) { /* 这里可以放升级 UI 或者错误处理 */ }
}
5. 准备升级文件
-
• 使用 objcopy 把编译好的
.elf转成 binary:arm-none-eabi-objcopy -O binary firmware.elf firmware.bin -
• 若开启 CRC,最后四字节会自动写入校验码(库内部会算)。
6. 把 firmware.bin 放到 SD 卡根目录(示例项目使用 FatFS),上电后 bootloader 会自动检测、擦除、写入、校验,成功后跳转。
小技巧:如果没有 SD 卡,也可以改成 UART Xmodem、CAN、甚至 BLE,只要实现
Bootloader_ReceiveData()接口即可。
优缺点一览
|
优点 |
说明 |
| 跨平台、跨芯片 |
同一套库支持 STM32F、L、G 系列,只要改宏定义 |
| 安全性高 |
多层校验、写保护检查、错误回滚,几乎不可能刷成“砖头” |
| 易扩展 |
只需实现数据接收函数,即可支持 OTA、蓝牙、以太网等 |
| 文档齐全 | docs
目录有 Doxygen 生成的 API 文档,配套 README 详细示例 |
| 开源免费 |
MIT 许可证,商用也无压力 |
|
缺点 |
说明 |
| 占用 Flash |
Bootloader 本身大约 20KB,低端 MCU 需要留足空间 |
| 学习成本 |
要理解 Flash 编程流程、向量表迁移等概念,对新手略有门槛 |
| 依赖 HAL/CMSIS |
如需裸机或其他 SDK,需要自行移植代码 |
| 没有图形 UI |
只提供底层 API,若要做升级界面,需要自行开发上层逻辑 |
小结——为什么你应该把它装进项目?
-
• 现场升级:不再受限于调试器,现场即可刷固件,省时省钱。
-
• 安全可靠:多重校验+回滚机制,让固件更新不再是“赌注”。
-
• 灵活定制:从 UART 到 Wi‑Fi,只要实现数据输入,bootloader 就能跑。
如果你正为 “固件怎么安全、快捷地升级?” 这件事头疼,强烈建议把 stm32‑bootloader 拉进来玩玩。把升级的痛点交给它,你只需要专注业务代码的创新。
项目地址: https://github.com/akospasztor/stm32-bootloader