日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32项目中一种在线升级/应用升级OTA-IAP设计方案

發(fā)布時(shí)間:2023/12/10 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32项目中一种在线升级/应用升级OTA-IAP设计方案 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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種情況:

  • 通過boot引腳設(shè)置可以將中斷向量表定位于SRAM區(qū),即起始地址為0x2000000,同時(shí)復(fù)位后 PC 指針位于0x2000000處。
  • 通過boot引腳設(shè)置可以將中斷向量表定位于FLASH區(qū),即起始地址為0x8000000,同時(shí)復(fù)位后PC指針位于0x8000000處。
  • 通過boot引腳設(shè)置可以將中斷向量表定位于內(nèi)置Bootloader區(qū)。
  • 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è)置見下表。

    BOOT0BOOT1啟動(dòng)模式
    0無關(guān)FLASH
    10系統(tǒng)存儲(chǔ)器,ISP模式
    11SRAM,調(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í)行 Step5Step6
    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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。