新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 揭秘STM32 OTA升级:轻松实现固件远程无缝更新(一)

揭秘STM32 OTA升级:轻松实现固件远程无缝更新(一)

作者:嵌入式芯视野 时间:2025-06-11 来源:今日头条 收藏

一、系统简介

(Over-The-Air)升级系统基于 系列 MCU,结合开源组件 m 实现远程或本地固件升级。系统由 Bootloader、固件打包器、固件传输器三部分组成,采用标准的 YModem-1K 协议进行数据传输,并支持外部 Flash 存储、固件完整性校验、断电保护、加密与版本管理等功能。

本文引用地址:https://www.eepw.com.cn/article/202506/471234.htm

系统目标是实现:

  • 可靠、安全、低侵入式的升级机制

  • Boot 与 APP 分离,减少耦合

  • 最小化对原有应用程序的改动


二、实现功能

1. 基础功能

功能

描述

固件接收

通过串口使用 YModem 协议接收 .ota 固件

存储管理

支持写入内置 Flash 或外部 SPI/QSPI Flash

固件校验

支持 CRC32 校验、魔术字校验、固件长度比对

启动控制

Bootloader 决定启动 APP 或进入升级模式

状态指示

LED 状态闪烁/串口输出提示当前进度

固件跳转

校验通过后跳转执行新 APP

2. 高级功能(可选)

功能

描述

固件加密

支持对 包 AES 加密与解密

固件签名

固件支持附加 RSA 签名与验证

双分区

实现 APP A/B 区交替升级

断点续传

支持升级中断后恢复上次进度

出厂恢复

支持按键长按恢复出厂固件

版本回退

若 APP 启动失败,自动回退旧版本


️ 三、系统架构

1. 组成模块

 ┌─────────────────────────────┐
│       上位机 (YModem)                                                                                       │ ← 固件发送工具/Firmware_Packager
└────────────┬────────────────┘
             │
     串口传输(YModem协议)
             ↓
┌─────────────────────────────┐
│         Bootloader                                                                                                 │
│ ┌─────────────────────────┐       │
│ │ OTA标志检测                                                                                     │      │
│ │ YModem接收与CRC校验                                                              │       │
│ │ Flash写入管理                                                                                  │       │
│ │ 固件信息提取与验证                                                                       │       │
│ │ App跳转 & 启动判断                                                                       │       │
│ └─────────────────────────┘        │
└────────────┬────────────────┘
             ↓
┌─────────────────────────────┐
│             APP                                                                                                            │
│ ┌─────────────────────────┐        │
│ │ 功能运行(采集/通讯等)                                                            │        │
│ │ OTA触发 & 重启设置标志                                                              │        │
│ └─────────────────────────┘        │
└─────────────────────────────┘


2. 分区示意(以 F4 为例)

区域

起始地址

大小

用途

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 开源许可




关键词: STM32 OTA

评论


相关推荐

技术专区

关闭