新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 揭秘STM32 OTA升級(jí):輕松實(shí)現(xiàn)固件遠(yuǎn)程無縫更新(一)

揭秘STM32 OTA升級(jí):輕松實(shí)現(xiàn)固件遠(yuǎn)程無縫更新(一)

作者:嵌入式芯視野 時(shí)間:2025-06-11 來源:今日頭條 收藏

一、系統(tǒng)簡(jiǎn)介

(Over-The-Air)升級(jí)系統(tǒng)基于 系列 MCU,結(jié)合開源組件 m 實(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ì) 包 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ū)示意(以 F4 為例)

區(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 開源許可




關(guān)鍵詞: STM32 OTA

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉