STM32项目中一种在线升级/应用升级OTA-IAP设计方案
STM32 OTA-IAP設計方案
OTA是Over-the-Air的簡寫,即空中下載技術,通過網絡遠程給用戶進行系統更新和升級。IAP是In Application Programming的簡寫,IAP是用戶自己的程序在運行過程中對User Flash的部分區域進行燒寫,目的是為了在產品發布后可以方便地通過預留的通信口對產品中的固件程序進行更新升級。IAP主要包括BootLoader和應用程序兩部分,基于IAP的OTA設計思路是先通過OTA接收升級固件,再利用IAP進行固件搬移、校驗和程序跳轉,實現空中升級的目的。
BootLoader程序根據判斷是否需要升級固件,并進行運行代碼跳轉。APP工程中需要編寫OTA數據包交互協議,將接收到的升級固件保存至FLASH,校驗一致性然后設置升級標志位并重啟。
一、STM32啟動模式分析
Cortex-M3 內核啟動有3種情況:
Cortex-M3內核規定,起始地址必須存放棧頂指針,而第二個地址則必須存放復位中斷入口向量地址,在Cortex-M3內核復位后,會自動從起始地址的下一個32位空間取出復位中斷入口向量,跳轉執行復位中斷服務程序。Boot引腳設置見下表。
| 0 | 無關 | FLASH |
| 1 | 0 | 系統存儲器,ISP模式 |
| 1 | 1 | SRAM,調試 |
STM32的啟動文件(startup_stm32f103xb.s)和啟動過程。
(1)首先對棧和堆的大小進行定義,并在代碼區的起始處建立中斷向量表,其第一個表項是棧頂地址(32位),第二個表項是復位中斷服務入口地址;(2)然后執行復位中斷,在復位中斷服務程序中跳轉 C/C++標準實時庫的main函數(__main),完成用戶堆棧等的初始化后,跳轉.c 文件中的main函數(真正的用戶main函數)開始執行程序。假設STM32被設置為從內部FLASH啟動,中斷向量表起始地位為0x8000000,則棧頂地址存放于0x8000000處,復位中斷服務入口地址存放于0x8000004處。當STM32遇到復位信號后,則從0x80000004處取出復位中斷服務入口地址,繼而執行復位中斷服務程序,然后跳轉__main函數,最后進入main函數。
二、FLASH分區
設置STM32為從FLASH啟動,即硬件設置管腳BOOT0低電平。本方案單片機型號采用:STM32F103RBT6,FLASH:128KB, SRAM:20KB。FLASH分為Bootloader、APPA、APPB、Parameter4個部分,分別占用20kB、50kB、50kB和8kB內存空間。APPA是應用程序區,運行用戶設計的應用程序;APPB是應用程序備份升級區,存放接收到的固件升級包;Parameter是參數區,保存程序運行的關鍵參數、升級標志和密鑰。FLASH分區示意圖如下圖所示。
三、OTA流程
單片機上電后首選運行BootLoader該段代碼,讀取Parameter參數區的升級標志量,判斷是否有升級需求。若有升級需求,則根據記錄的相應固件大小將APPB區升級文件拷貝至APPA區,并改寫升級標志量,然后重啟;若無升級請求,則程序跳轉至APPA代碼區運行。OTA程序流程如下所示。
具體流程描述如下:
Step1:上電啟動單片機,首先執行BootLoader程序。
Step2:BootLoader讀取Parameter區參數,查看升級標志是否有升級任務,若沒有升級任務,則進入 Step3,否則進入 Step4。
Step3: BootLoader程序跳轉至APPA,執行用戶代碼,并判斷是否收到升級任務請求,若有升級任務請求則進入 Step7。
Step4:根據Parameter區升級參數,校驗APPB固件數據并將APPB升級固件拷貝到APPA區,執行 Step5 和 Step6。
Step5:將升級標志位清除。
Step6:重啟,再次執行BootLoader。
Step7:將接受到的升級數據包存入APPB區,并將相關升級參數存入Parameter區,若接收數據完成,固件檢驗通過則寫入Parameter區升級標志,并進入 Step8 。
Step8:重啟,再次執行BootLoader。
四、工程設置
4.1 BootLoader工程設置
由于BootLoader需要在上電復位后首先執行,因此,設置BootLoader存放在FLASH起始位置0x08000000,在MDK中打開options for target,設置IROM1 Start = 0x08000000,Size = 0x5000(0x5000 = 20kB),在Flash Download中設置下載Flash位置,參數與IROM1中設置Start和Size相同。BootLoader代碼大小不超過20kB,越小越好。
4.2 APP工程設置
根據FLASH分區,APP代碼存放在緊挨著BootLoader之后,因此APP的起始位置應該為0x08000000+0x5000 = 0x08005000,占用內存大小為0xC800(50kB),在MDK中打開options for target,設置IROM1 Start = 0x08005000,Size = 0xC800,在Flash Download中設置下載Flash位置,參數與IROM1中設置的Start和Size相同,如圖5和圖6所示。由于APP代碼運行的起始位置不在0x08000000,其棧頂地址發生偏移,對應的中斷向量表地址也整體發生偏移,因此,在代碼中需要對APP代碼的中斷向量表偏移進行設置,具體的在system_stm32f1xxx.c中啟動代碼中可以看到定義的中斷向量表偏移量宏定義:
#ifdef VECT_TAB_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ #elseSCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ #endif /* #define VECT_TAB_SRAM */ #define VECT_TAB_OFFSET 0x5000 /*!< Vector Table base offset field. This value must be a multiple of 0x200. */
升級界面如下:
設備啟動界面如下:
下一篇準備寫個具體實現,包括本文提到的整包升級和朋友提到的差分升級,并且附帶配套的QT開發的升級軟件開發教程,考慮收費欄目。
有需求的朋友請私信,我統計一下情況。
總結
以上是生活随笔為你收集整理的STM32项目中一种在线升级/应用升级OTA-IAP设计方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux mount挂载和umont
- 下一篇: Java开发基于控制台的购书系统