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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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種情況:

  • 通過boot引腳設置可以將中斷向量表定位于SRAM區,即起始地址為0x2000000,同時復位后 PC 指針位于0x2000000處。
  • 通過boot引腳設置可以將中斷向量表定位于FLASH區,即起始地址為0x8000000,同時復位后PC指針位于0x8000000處。
  • 通過boot引腳設置可以將中斷向量表定位于內置Bootloader區。
  • Cortex-M3內核規定,起始地址必須存放棧頂指針,而第二個地址則必須存放復位中斷入口向量地址,在Cortex-M3內核復位后,會自動從起始地址的下一個32位空間取出復位中斷入口向量,跳轉執行復位中斷服務程序。Boot引腳設置見下表。

    BOOT0BOOT1啟動模式
    0無關FLASH
    10系統存儲器,ISP模式
    11SRAM,調試

    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區,執行 Step5Step6
    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设计方案的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。