揭秘STM32 OTA升級(jí):輕松實(shí)現(xiàn)固件遠(yuǎn)程無縫更新(一)
一、系統(tǒng)簡(jiǎn)介
本 OTA(Over-The-Air)升級(jí)系統(tǒng)基于 STM32 系列 MCU,結(jié)合開源組件 mOTA 實(shí)現(xiàn)遠(yuǎn)程或本地固件升級(jí)。系統(tǒng)由 Bootloader、固件打包器、固件傳輸器三部分組成,采用標(biāo)準(zhǔn)的 YModem-1K 協(xié)議進(jìn)行數(shù)據(jù)傳輸,并支持外部 Flash 存儲(chǔ)、固件完整性校驗(yàn)、斷電保護(hù)、加密與版本管理等功能。
本文引用地址:http://2s4d.com/article/202506/471234.htm系統(tǒng)目標(biāo)是實(shí)現(xiàn):
可靠、安全、低侵入式的升級(jí)機(jī)制
Boot 與 APP 分離,減少耦合
最小化對(duì)原有應(yīng)用程序的改動(dòng)
二、實(shí)現(xiàn)功能
1. 基礎(chǔ)功能
功能 | 描述 |
固件接收 | 通過串口使用 YModem 協(xié)議接收 .ota 固件 |
存儲(chǔ)管理 | 支持寫入內(nèi)置 Flash 或外部 SPI/QSPI Flash |
固件校驗(yàn) | 支持 CRC32 校驗(yàn)、魔術(shù)字校驗(yàn)、固件長(zhǎng)度比對(duì) |
啟動(dòng)控制 | Bootloader 決定啟動(dòng) APP 或進(jìn)入升級(jí)模式 |
狀態(tài)指示 | LED 狀態(tài)閃爍/串口輸出提示當(dāng)前進(jìn)度 |
固件跳轉(zhuǎn) | 校驗(yàn)通過后跳轉(zhuǎn)執(zhí)行新 APP |
2. 高級(jí)功能(可選)
功能 | 描述 |
固件加密 | 支持對(duì) OTA 包 AES 加密與解密 |
固件簽名 | 固件支持附加 RSA 簽名與驗(yàn)證 |
雙分區(qū) | 實(shí)現(xiàn) APP A/B 區(qū)交替升級(jí) |
斷點(diǎn)續(xù)傳 | 支持升級(jí)中斷后恢復(fù)上次進(jìn)度 |
出廠恢復(fù) | 支持按鍵長(zhǎng)按恢復(fù)出廠固件 |
版本回退 | 若 APP 啟動(dòng)失敗,自動(dòng)回退舊版本 |
? 三、系統(tǒng)架構(gòu)
1. 組成模塊
┌─────────────────────────────┐
│ 上位機(jī) (YModem) │ ← 固件發(fā)送工具/Firmware_Packager
└────────────┬────────────────┘
│
串口傳輸(YModem協(xié)議)
↓
┌─────────────────────────────┐
│ Bootloader │
│ ┌─────────────────────────┐ │
│ │ OTA標(biāo)志檢測(cè) │ │
│ │ YModem接收與CRC校驗(yàn) │ │
│ │ Flash寫入管理 │ │
│ │ 固件信息提取與驗(yàn)證 │ │
│ │ App跳轉(zhuǎn) & 啟動(dòng)判斷 │ │
│ └─────────────────────────┘ │
└────────────┬────────────────┘
↓
┌─────────────────────────────┐
│ APP │
│ ┌─────────────────────────┐ │
│ │ 功能運(yùn)行(采集/通訊等) │ │
│ │ OTA觸發(fā) & 重啟設(shè)置標(biāo)志 │ │
│ └─────────────────────────┘ │
└─────────────────────────────┘
2. 分區(qū)示意(以 STM32F4 為例)
區(qū)域 | 起始地址 | 大小 | 用途 |
Bootloader | 0x08000000 | 16KB | 固定啟動(dòng)區(qū) |
APP 主區(qū) | 0x08004000 | 480KB | 正常應(yīng)用區(qū) |
OTA 緩存區(qū)(外部 Flash) | 0x90000000 | 1MB+ | 新固件臨時(shí)存儲(chǔ) |
固件信息區(qū) | 末頁(yè) | 4KB | 保存版本、CRC、長(zhǎng)度等信息 |
四、設(shè)計(jì)思路
設(shè)計(jì)思路
1. Boot 與 APP 分離
Bootloader 是獨(dú)立的小程序,負(fù)責(zé)固件升級(jí)與跳轉(zhuǎn),不與主程序交叉編譯
APP 層可最小侵入,僅在需要升級(jí)時(shí)設(shè)置跳轉(zhuǎn)標(biāo)志,重啟進(jìn)入 Bootloader
2. 狀態(tài)機(jī)驅(qū)動(dòng)升級(jí)流程
Bootloader 內(nèi)部采用狀態(tài)機(jī)結(jié)構(gòu)組織升級(jí)流程,提升清晰度和可維護(hù)性:
BOOT_WAIT_TRIGGER → BOOT_OTA_MODE → BOOT_RECEIVE
↓ ↓
BOOT_FAIL → BOOT_VERIFY → BOOT_SUCCESS → BOOT_JUMP_APP
3. 安全性 & 容錯(cuò)設(shè)計(jì)
加密:防止固件被截獲、篡改
簽名:校驗(yàn)固件來源是否合法
魔術(shù)字 + CRC32 校驗(yàn):確保接收完整
斷電保護(hù)機(jī)制:每頁(yè)寫入成功標(biāo)志,重啟后按標(biāo)志恢復(fù)
4. 固件包打包規(guī)范
由 Firmware_Packager 工具打包,包含以下結(jié)構(gòu):
Header(64B) | 固件內(nèi)容 | 固件尾標(biāo)志(Watermark) | 可選簽名
支持自定義版本號(hào)、加密方式、簽名機(jī)制
工具命令行參數(shù)靈活,可擴(kuò)展
5. 軟件架構(gòu)
軟件架構(gòu)
硬件層描述的是運(yùn)算器件和邏輯器件,如 CPU、ADC、TIMER、各類 IC 等,是所有軟件組件的硬件基礎(chǔ),是軟件邏輯的最終底層實(shí)現(xiàn)。
硬件抽象層是位于驅(qū)動(dòng)與硬件電路之間的接口層,將硬件抽象化。它隱藏了特定平臺(tái)的硬件接口細(xì)節(jié),為驅(qū)動(dòng)層提供抽象化的硬件接口,使其具有硬件無關(guān)性。
驅(qū)動(dòng)層通過調(diào)用硬件抽象層的開放接口,實(shí)現(xiàn)一定的邏輯功能后封裝,提供給上層軟件調(diào)用。
數(shù)據(jù)傳輸層負(fù)責(zé)收發(fā)數(shù)據(jù),對(duì)外開放的是數(shù)據(jù)發(fā)送與接收相關(guān)的接口,屏蔽了通訊接口的邏輯代碼,使其易于修改為其他類型的通訊接口。
協(xié)議析構(gòu)層將調(diào)用數(shù)據(jù)傳輸層的數(shù)據(jù)收發(fā)接口進(jìn)行封包發(fā)送與收包解析,通過實(shí)現(xiàn)公有協(xié)議或自定義的協(xié)議,完成對(duì)數(shù)據(jù)的構(gòu)造和解析。
應(yīng)用層負(fù)責(zé)業(yè)務(wù)邏輯代碼的實(shí)現(xiàn),通過調(diào)用其他層封裝的接口,完成頂層邏輯功能。
6. 文件架構(gòu)
├─ document 設(shè)計(jì)和原理性文檔
├─ example 示例工程
├─ image 圖片資源
├─ source mOTA 組件的源碼
│ ├─ bootloader mOTA 組件的 bootloader 部分
│ │ ├─ Component 第三方庫(kù)
│ │ ├─ Config bootloader 配置文件
│ │ ├─ Core 核心源碼
│ │ │ ├─ Module 代碼模塊(可移植部分)
│ ├─ BSP BSP(板級(jí)支持包)
├─ tools mOTA 組件的工具部分
│ ├─ firmware_packager 固件打包工具
│ ├─ YModem_Sender 基于 YModem-1K 協(xié)議的發(fā)送工具
├─ README.md 說明文件
├─ LICENSE Apache-2.0 開源許可
評(píng)論