让 STM32 也能像手机一样“OTA”——全能 Bootloader 速看攻略

 


什么是 stm32‑bootloader?

stm32‑bootloader 是一套 可定制的启动加载程序,专为 STM32 系列 MCU 设计。它把 MCU 的上电流程分成两段:

  1. 1. Bootloader(引导程序)先跑,负责检查、擦除、写入新的固件文件。

  2. 2. 完成后 跳转 到你的业务代码(Application),两者像是“先检查后使用”。

这套代码本身是 开源 的,放在 lib/stm32-bootloader 目录里,配套的示例项目在 projects 里,直接拽进你的工程就能跑。


它解决了哪些痛点?

痛点

传统做法

使用 stm32‑bootloader 后的改变

固件升级只能靠外部工具

必须连上 ST‑Link、J‑Link、甚至专用 ISP 设备

在运行时通过 UART / SPI / SD 卡 等接口自行刷写

升级过程不安全

烧写中断会导致 MCU 变砖

内置 擦除/写入校验、CRC32 校验、写保护检测,出错自动回滚

多片 MCU 需要分别维护 bootloader

每个项目都要手写一套启动代码

统一的库函数 Bootloader_Init/Erase/FlashNext/...,只改配置即可

OTA(空中升级)难实现

需要自行搭建完整的协议栈

提供 扩展接口,可以直接接入 Wi‑Fi / BLE 模块,实现 OTA

简而言之,它把 “只能在工厂/实验室刷写” 的局面,变成 “在现场、在生产线上、甚至在用户手里都能升级” 的可能。


安装 & 使用步骤(手把手)

下面的步骤以 STM32L496‑Discovery 为例,其他芯片只要改改 bootloader.h 里的宏定义即可。

  1. 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

     

    发表评论