揭秘STM32 OTA升级:轻松实现固件远程无缝更新(一)
一、系统简介
本 OTA(Over-The-Air)升级系统基于 STM32 系列 MCU,结合开源组件 mOTA 实现远程或本地固件升级。系统由 Bootloader、固件打包器、固件传输器三部分组成,采用标准的 YModem-1K 协议进行数据传输,并支持外部 Flash 存储、固件完整性校验、断电保护、加密与版本管理等功能。
系统目标是实现:
可靠、安全、低侵入式的升级机制
Boot 与 APP 分离,减少耦合
最小化对原有应用程序的改动
二、实现功能
1. 基础功能
功能 | 描述 |
固件接收 | 通过串口使用 YModem 协议接收 .ota 固件 |
存储管理 | 支持写入内置 Flash 或外部 SPI/QSPI Flash |
固件校验 | 支持 CRC32 校验、魔术字校验、固件长度比对 |
启动控制 | Bootloader 决定启动 APP 或进入升级模式 |
状态指示 | LED 状态闪烁/串口输出提示当前进度 |
固件跳转 | 校验通过后跳转执行新 APP |
2. 高级功能(可选)
功能 | 描述 |
固件加密 | 支持对 OTA 包 AES 加密与解密 |
固件签名 | 固件支持附加 RSA 签名与验证 |
双分区 | 实现 APP A/B 区交替升级 |
断点续传 | 支持升级中断后恢复上次进度 |
出厂恢复 | 支持按键长按恢复出厂固件 |
版本回退 | 若 APP 启动失败,自动回退旧版本 |
️ 三、系统架构
1. 组成模块
┌─────────────────────────────┐
│ 上位机 (YModem) │ ← 固件发送工具/Firmware_Packager
└────────────┬────────────────┘
│
串口传输(YModem协议)
↓
┌─────────────────────────────┐
│ Bootloader │
│ ┌─────────────────────────┐ │
│ │ OTA标志检测 │ │
│ │ YModem接收与CRC校验 │ │
│ │ Flash写入管理 │ │
│ │ 固件信息提取与验证 │ │
│ │ App跳转 & 启动判断 │ │
│ └─────────────────────────┘ │
└────────────┬────────────────┘
↓
┌─────────────────────────────┐
│ APP │
│ ┌─────────────────────────┐ │
│ │ 功能运行(采集/通讯等) │ │
│ │ OTA触发 & 重启设置标志 │ │
│ └─────────────────────────┘ │
└─────────────────────────────┘
2. 分区示意(以 STM32F4 为例)
区域 | 起始地址 | 大小 | 用途 |
Bootloader | 0x08000000 | 16KB | 固定启动区 |
APP 主区 | 0x08004000 | 480KB | 正常应用区 |
OTA 缓存区(外部 Flash) | 0x90000000 | 1MB+ | 新固件临时存储 |
固件信息区 | 末页 | 4KB | 保存版本、CRC、长度等信息 |
四、设计思路
设计思路
1. Boot 与 APP 分离
Bootloader 是独立的小程序,负责固件升级与跳转,不与主程序交叉编译
APP 层可最小侵入,仅在需要升级时设置跳转标志,重启进入 Bootloader
2. 状态机驱动升级流程
Bootloader 内部采用状态机结构组织升级流程,提升清晰度和可维护性:
BOOT_WAIT_TRIGGER → BOOT_OTA_MODE → BOOT_RECEIVE
↓ ↓
BOOT_FAIL → BOOT_VERIFY → BOOT_SUCCESS → BOOT_JUMP_APP
3. 安全性 & 容错设计
加密:防止固件被截获、篡改
签名:校验固件来源是否合法
魔术字 + CRC32 校验:确保接收完整
断电保护机制:每页写入成功标志,重启后按标志恢复
4. 固件包打包规范
由 Firmware_Packager 工具打包,包含以下结构:
Header(64B) | 固件内容 | 固件尾标志(Watermark) | 可选签名
支持自定义版本号、加密方式、签名机制
工具命令行参数灵活,可扩展
5. 软件架构
软件架构
硬件层描述的是运算器件和逻辑器件,如 CPU、ADC、TIMER、各类 IC 等,是所有软件组件的硬件基础,是软件逻辑的最终底层实现。
硬件抽象层是位于驱动与硬件电路之间的接口层,将硬件抽象化。它隐藏了特定平台的硬件接口细节,为驱动层提供抽象化的硬件接口,使其具有硬件无关性。
驱动层通过调用硬件抽象层的开放接口,实现一定的逻辑功能后封装,提供给上层软件调用。
数据传输层负责收发数据,对外开放的是数据发送与接收相关的接口,屏蔽了通讯接口的逻辑代码,使其易于修改为其他类型的通讯接口。
协议析构层将调用数据传输层的数据收发接口进行封包发送与收包解析,通过实现公有协议或自定义的协议,完成对数据的构造和解析。
应用层负责业务逻辑代码的实现,通过调用其他层封装的接口,完成顶层逻辑功能。
6. 文件架构
├─ document 设计和原理性文档
├─ example 示例工程
├─ image 图片资源
├─ source mOTA 组件的源码
│ ├─ bootloader mOTA 组件的 bootloader 部分
│ │ ├─ Component 第三方库
│ │ ├─ Config bootloader 配置文件
│ │ ├─ Core 核心源码
│ │ │ ├─ Module 代码模块(可移植部分)
│ ├─ BSP BSP(板级支持包)
├─ tools mOTA 组件的工具部分
│ ├─ firmware_packager 固件打包工具
│ ├─ YModem_Sender 基于 YModem-1K 协议的发送工具
├─ README.md 说明文件
├─ LICENSE Apache-2.0 开源许可

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码