揭秘STM32 OTA升級:輕松實現固件遠程無縫更新(一)
一、系統簡介
本 OTA(Over-The-Air)升級系統基于 STM32 系列 MCU,結合開源組件 mOTA 實現遠程或本地固件升級。系統由 Bootloader、固件打包器、固件傳輸器三部分組成,采用標準的 YModem-1K 協議進行數據傳輸,并支持外部 Flash 存儲、固件完整性校驗、斷電保護、加密與版本管理等功能。
本文引用地址:http://www.104case.com/article/202506/471234.htm系統目標是實現:
可靠、安全、低侵入式的升級機制
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 開源許可
評論