大家好,本次小編介紹華芯微特MCU OTA升級的應用!
一、引言
OTA升級(Over-the-Air Update,空中下載技術升級)是一種通過無線網絡(如Wi-Fi、藍牙或移動數據網絡)遠程為設備推送并進行應用更新的技術,無需用戶手動 物理連接設備或更換硬件。它廣泛應用于智能手機、智能汽車、物聯網設備、智能穿戴等領域,是現代智能設備維護和功能迭代的核心手段。
在MCU領域,由于急于搶占市場份額而縮短研發周期,或是由于系統架構設計本身的不周全,又或是由于產品功能未能充分適應環境變化導致產品的功能無法適應新的環境,該產品的設計或框架需要及時進行更新迭代。傳統的方法是通過召回待升級產品到廠商中的方式逐個進行系統更新,或者是工程師攜帶專業工具逐戶上門對相關設備進行調試更新,不論是哪一種方式,對廠商而言都需要較多的時間和金錢成本來維護,對用戶的體驗也會帶來不便,此時OTA升級技術變得尤為重要。
二、升級方式
常見的用于OTA升級的IAP方式主要有兩種:
第一種方式為將程序整體擦除后再寫入,這種實現方式一般是利用物聯網模塊通過串口的方式傳輸固件到嵌入式設備,由嵌入式設備的引導加載程序(Bootloader)擦除所需的應用程序區域,再將從串口接收到的新程序寫入。這種方式實現起來比較簡單,但在升級過程中意外斷電或發生錯誤時設備無法正常啟動到應用程序,需要重新進行升級。

第二種實現方式是通過對存儲空間劃分為應用程序區域和固件存儲區域,通過運行應用程序接收新的固件到固件存儲區域,即使傳輸過程中出現意外斷電或發生錯誤,也不會影響應用程序的正常使用,但該方式需消耗多一倍的存儲空間用于存儲固件。

三、功能設計
整體框架:
以SWM34S系列MCU為例,Flash可用容量為512KB。該MCU的Flash起始地址為 0x00000000,因此內部Flash可用地址為0x00000000到0x00080000。其中Bootloader主要包括以下功能:掛載文件系統,對數據進行解析和校驗,將程序寫入Flash或替換文件。 根據實際情況編譯后Bootloader實際占用空間為28kB,因此分配32kB的Flash空間給Bootloader。 為實現存儲空間的充分運用,除預留4kB以儲存備用參數外,其余部分悉數分配給APP,用以承載復雜功能程序的實現。

Bootloader區和APP區是兩個獨立的存儲空間,因此有2個中斷向量表。上電后第一段程序從棧頂地址0x00000000處開始運行,因為MCU是32位,所以程序以4字節進行區分。運行至復位中斷向量(中斷向量表起始地址)0x00000004時,跳轉到復位中斷服務程序中,運行后跳轉到Bootloader的main函數中執行。當執行完Bootloader后,執行跳轉至APP程序的復位向量表,取出復位中斷向量的地址,并跳轉執行復位中斷服務程序,隨后跳轉到APP的main函數中執行。

Bootloader設計:
Bootloader啟動后會通過文件系統檢測SPI FLASH中更新文件是否存在且判斷文件類型,若存在且為素材文件則將舊素材文件替換為新文件并刪除舊文件,若為程序文件則將正確的文件數據存放在自定義的臨時緩沖區中,數據滿一幀后寫入Flash中,直到所有數據寫入完成。 文件不存在或更新完成后跳轉至APP段地址,執行APP程序。
采用SPI FLASH文件系統升級更加安全穩定,文件系統使用的是開源的FATFS文件系統。因此,對于網絡故障和意外斷電導致升級失敗的情況,根據固件存儲區文件是否寫入完全并保存,來檢測升級文件是否完整。當升級過程中出現未知錯誤時,固件存儲區文件未完成保存,此時Bootloade直接運行原程序,只有固件存儲區文件完整時才將需要升級的數據拷貝覆蓋原數據。
APP設計:
因APP程序起始地址為0x00008000,所以在Keil工程中需將工程的FLASH起始地址更改為0x8000,大小更改為0x76000,SRAM初始地址為0x20000000。需檢查Options for Target->Linker中的Use Memory Layout from Target Dialog是否勾選,勾選后通過對話框中的Target->IROM1來修改FLASH起始地址及大小。

若Use Memory Layout from Target Dialog未勾選,則通過編輯sct文件(分散加載文件)來修改FLASH起始地址及大小。


四、傳輸協議
協議簡介:
固件(素材文件和程序文件)數據的傳輸通過Xmodem協議進行,Xmodem是一種在串口通信中廣泛使用的異步文件傳輸協議,最早在20世紀70年代由Ward Christensen提出并實現的,傳輸數據的單位為信息包,信息包格式如下:
幀頭 | 包號 | 包號反碼 | 有效數據 | 校驗位 |
SOH/STX | PN | XPN | DATA | SUM/CRC |
1字節 | 1字節 | 1字節 | 128/1024字節 | 1/2字節 |
Xmodem 協議最早是以 128 字節塊的形式傳輸數據,并且每個塊都使用校驗和進行錯誤檢測。后面衍生出了使用循環冗余校驗方式 (CRC16) 和支持 1024 字節塊的傳輸協議 (Xmodem-1k)。幀頭表示后面的有效數據的幀長度,因為數據包的序號和反序號只有1字節,所以包序不能大于255,若數據包個數大于255,序號則歸零重復使用。根據Xmodem 協議規定,數據包長度有兩種:一是以SOH(0x01)為幀頭開始的數據包,信息包中的有效數據為128字節,數據包的總長度為131+校驗字節;二是以STX(0x02)為幀頭開始的數據包,信息包中的有效數據為1024字節,數據包總長度為1027+校驗字節。SOH、STX為協議固定的控制符,具體的控制符定義為:
符號 | 數值 | 含義 |
SOH | 0x01 | 128字節數據包 |
STX | 0x02 | 1024字節數據包 |
EOT | 0x04 | 文件傳輸結束標識符 |
ACK | 0x06 | 接收數據包成功信號 |
NAK | 0x15 | 接收數據包失敗信號 |
CA | 0x18 | 傳輸中止 |
C | 0x43 | 請求數據包 |
通訊流程:
以WIFI升級為例,MCU收到升級請求后,發送 C 請求數據,WIFI設備將按照Xmodem協議將固件文件分塊傳輸給MCU設備。MCU設備在接收到每個數據塊后,會發送確認信號(ACK)或重傳請求(NAK)。
如果傳輸過程中出現錯誤,終端軟件將自動重傳出錯的數據塊。

更多詳情請參考網盤中13.SWM341(S)/02.SDK/01.IAP_UserBoot Demo/串口Xmodem方式的Userboot/ 路徑下的應用參考文件 。
結束語:
華芯微特多款屏驅芯片系列均支持OTA升級并提供簡單易懂的參考例程,操作簡單,開發便捷,有需要了解更多,可以在華芯微特論壇(bbs.synwit.cn)中查找開發技術資料或發帖向我們提問,期待您與華芯微特的每一次邂逅!
歡迎多多點贊、轉發、分享,您的每次支持都是對小編的鼓勵!