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