0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32單片機(jī)實(shí)現(xiàn)固件在線升級(jí)(IAP)

撞上電子 ? 2023-12-16 08:00 ? 次閱讀


1,固件升級(jí)方案綜述

單片機(jī)的固件升級(jí)方式有很多種。1、ICP:簡(jiǎn)單說就是在單片機(jī)開發(fā)時(shí)使用燒錄器升級(jí)程序,比如使用J-Link燒錄單片機(jī)程序。2、ISP:在單片機(jī)內(nèi)部實(shí)現(xiàn)了基于通信接口(如串口、I2C、SPI等等)的FLASH引導(dǎo)程序,配合廠家提供的燒錄軟件工具或自行開發(fā)的軟件實(shí)現(xiàn)程序燒錄。3、IAP:是指單片機(jī)程序開發(fā)好之后在運(yùn)行過程中由外部用戶發(fā)起的在線升級(jí),這種升級(jí)方式一般由用戶自行設(shè)計(jì)升級(jí)方案,方案靈活性和自由度較高,在智能家居、汽車電子物聯(lián)網(wǎng)設(shè)備中常用的OTA即空中下載技術(shù)原理也與之類似。

2,劃分FALSH存儲(chǔ)區(qū)域

STM32系列單片機(jī)中,程序存儲(chǔ)在內(nèi)部FLASH中,按照不同的單片機(jī)型號(hào)FLASH大小有所不同,有64KB、128KB、512KB等等。以STM32F407VET6系列單片機(jī)為例,內(nèi)置FLASH大小為512KB,存儲(chǔ)地址為0x08000000-0x0807FFFF。單片機(jī)每次程序復(fù)位時(shí)從0x08000000的位置開始執(zhí)行主程序,如果不做IAP則這512KB空間都可以用來存儲(chǔ)用戶編寫的APP程序。

若要實(shí)現(xiàn)IAP功能則必須將FLASH空間劃分為幾個(gè)部分,每部分都存儲(chǔ)一個(gè)可以獨(dú)立運(yùn)行的程序文件(可以理解為幾個(gè)獨(dú)立的單片機(jī)工程):

1、引導(dǎo)程序,每次復(fù)位時(shí)程序默認(rèn)執(zhí)行此程序,在接下來的執(zhí)行過程中可以跳轉(zhuǎn)到用戶編寫的程序,因此這部分程序是固化在以0x08000000為起始的區(qū)域中。在引導(dǎo)程序中可以對(duì)電路系統(tǒng)作出一些自檢和初始化檢查的工作,因此該程序又稱為bootloader或boot程序,需要注意的是在設(shè)計(jì)bootloader時(shí)要提前規(guī)定好程序空間的大小,比如規(guī)定程序存儲(chǔ)區(qū)域?yàn)?x08000000-0x8007FFF,則bootlader程序存儲(chǔ)空間為32KB,編寫boot程序時(shí)要注意這一點(diǎn)

2、用戶需要升級(jí)的新程序,這部分包含了用戶的業(yè)務(wù)代碼,復(fù)雜的運(yùn)算邏輯和算法實(shí)現(xiàn)均在這一部分完成,稱為APP程序,該部分程序一般存儲(chǔ)在bootloader區(qū)域之后的FLASH中。用一個(gè)不是特別恰當(dāng)?shù)睦宇惐萣ootloader和APP:bootloader相當(dāng)于電腦組裝時(shí)的BIOS,APP則相當(dāng)于操作系統(tǒng),電腦開機(jī)時(shí)首先運(yùn)行BIOS,完成后跳轉(zhuǎn)運(yùn)行到操作系統(tǒng)。

3、升級(jí)之前的老版APP備份。這部分相當(dāng)于電腦系統(tǒng)更新前對(duì)老系統(tǒng)的備份,一旦在升級(jí)過程中發(fā)生錯(cuò)誤需要還原到備份系統(tǒng),防止系統(tǒng)升級(jí)失敗成磚。同樣的APP與APP備份將剩余的FLASH平分,以上述booloader為例,APP程序及其備份所占區(qū)域?yàn)椋海?12-32)/2=240KB,因此編寫的APP程序編譯后的占用的FLASH空間不得超過240KB,這一點(diǎn)可以通過查驗(yàn).map文件確認(rèn),對(duì)于不同F(xiàn)LASH大小的芯片可以類比以上計(jì)算方法確認(rèn)自己的程序大小上限(在此插入一句,改變編譯器的優(yōu)化等級(jí)可以改變最后的程序大小,但是高的優(yōu)化等級(jí)對(duì)程序編寫規(guī)范要求更高,因此優(yōu)化等級(jí)應(yīng)該在一開始設(shè)計(jì)APP之前就確定好,中途變更會(huì)帶來不可預(yù)測(cè)的問題)。

以STM32F407VET6單片機(jī)為例劃分后的FALSH存儲(chǔ)框圖如下所示:

2fd4bc9e-9ba6-11ee-9788-92fbcf53809c.jpg

3,BOOTLADER設(shè)計(jì)

根據(jù)上面的描述,bootloader主要有完成以下功能:

1、系統(tǒng)自檢

2、實(shí)現(xiàn)APP程序跳轉(zhuǎn)

3、升級(jí)過程中接收APP文件并存儲(chǔ)到對(duì)應(yīng)的FLASH區(qū)域

功能1、3對(duì)于不同的系統(tǒng)要求不同,自檢的內(nèi)容以及實(shí)現(xiàn)文件傳輸?shù)奈锢韺?a target="_blank">接口和鏈路協(xié)議不同,不在此過多描述。下面主要給出APP跳轉(zhuǎn)的部分代碼:

#define APP_ADDR 0x08008000 //應(yīng)用程序起始地址 typedef void (*pFunction)(void); //重定義pFunction為void(*)(void)函數(shù)指針類型void jump(void){ uint32_t APP_ADDR_Buff=0; //緩存APP地址數(shù)值 uint32_t APP_ADDR_Value=0; //APP地址的內(nèi)容 uint32_t Jump_ADDR; //跳轉(zhuǎn)的目標(biāo)地址 pFunction Jump_APP; //跳轉(zhuǎn)的目標(biāo)函數(shù)指針 APP_ADDR_Buff = APPLICATION_ADDRESS; //用戶程序的首地址 APP_ADDR_Value = (*(volatile uint32_t*)APP_ADDR_Buff);//取出首地址里面的值 if (( APP_ADDR_Value & 0x2FFE0000 ) == 0x20000000) //判斷APP首地址里面存的棧頂?shù)刂分凳欠窈戏?{ DISABLE_INTERRUPTS(); //關(guān)總中斷,使用不同的庫寫法不同,不可直接復(fù)制 RCC_DeInit();//將外設(shè)RCC寄存器重設(shè)為缺省值,使用不同的庫寫法不同,不可直接復(fù)制 Jump_ADDR = *(volatile uint32_t*)(APP_ADDR_Buff + 4);//APP起始地址第二個(gè)字為程序開始地址(新程序復(fù)位地址) //指針函數(shù)指向用戶程序地址,也就是PC指針goto到用戶程序起始地址 Jump_APP = (pFunction)Jump_ADDR; //取出程序地址給指針函數(shù) __set_MSP(*(volatile uint32_t*)APP_ADDR_Buff); //初始化APP的堆棧指針 Jump_APP(); //執(zhí)行指針函數(shù),實(shí)現(xiàn)程序跳轉(zhuǎn) } else { ErrorHandle(); //拋出異常 }}int main(void){
SystemInit();//系統(tǒng)時(shí)鐘初始化 SYSInit(); //系統(tǒng)初始化 delay_ms(200); if(ReadProgramAPPFlag()) //如果需要更新APP { APP_FlashWrite(); //接收APP文件數(shù)據(jù),并將APP程序存儲(chǔ)到指定位置 if(APP_Check()) //APP文件校驗(yàn)通過,將新的APP程序更新到備份區(qū)域 APP_Backup(); else //否則恢復(fù)備份區(qū) APP_Restore(); ResetProgramAPPFlag(); //對(duì)完成升級(jí)的標(biāo)志復(fù)位 } jump(); //正常情況下運(yùn)行到這一步時(shí)APP區(qū)域已經(jīng)正確寫入程序文件 while(1); }

其中ReadProgramDoneFlag()是判斷程序應(yīng)該是先接收升級(jí)文件再跳轉(zhuǎn)還是直接跳轉(zhuǎn)的標(biāo)志,在APP中如果有升級(jí)需求則對(duì)這個(gè)標(biāo)志置位,在bootloader中完成文件接收之后對(duì)標(biāo)志復(fù)位,需要注意的是這個(gè)標(biāo)志位不是全局變量也不是局部變量,要保證程序跳轉(zhuǎn),初始化堆棧之后這個(gè)標(biāo)志的值不受影響,因此該標(biāo)志變量最佳選擇是寫在外部EEPROM或內(nèi)置FLASH中,讀寫標(biāo)志的操作其實(shí)是對(duì)EEPROM或FLASH的讀寫。

4,編寫APP程序

APP程序中實(shí)現(xiàn)了用戶的業(yè)務(wù)代碼,和由APP跳轉(zhuǎn)回bootloader的邏輯,實(shí)際的操作還是對(duì)上文中程序存儲(chǔ)Flag的讀寫,這部分邏輯實(shí)現(xiàn)的流程圖如下圖所示:

2fe11638-9ba6-11ee-9788-92fbcf53809c.jpg

由于APP程序?qū)?yīng)的是另外一個(gè)工程文件,因此在工程設(shè)置中要將FLASH的偏移地址向下移動(dòng),空出bootlader的區(qū)域,比如上文中bootloader區(qū)域是0x08000000-0x08008000,因此APP工程的FLASH起始地址是0x8008000,偏移量是0x8000,這一點(diǎn)非常重要。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6030

    文章

    44489

    瀏覽量

    631960
  • STM32
    +關(guān)注

    關(guān)注

    2264

    文章

    10854

    瀏覽量

    354289
  • IAP
    IAP
    +關(guān)注

    關(guān)注

    2

    文章

    163

    瀏覽量

    24203
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何實(shí)現(xiàn)STM32在線升級(jí)IAP功能?

    如何實(shí)現(xiàn)STM32在線升級(jí)IAP功能?
    發(fā)表于 11-30 06:22

    如何去實(shí)現(xiàn)STM32在線升級(jí)IAP功能呢

    最近因項(xiàng)目需求要實(shí)現(xiàn)STM32在線升級(jí)IAP功能,先將這幾天的學(xué)習(xí)體會(huì)和IAP的具體
    發(fā)表于 02-21 06:26

    stm32單片機(jī)自我升級(jí)程序IAP

    stm32 單片機(jī)自我升級(jí)程序IAP,詳細(xì)的介紹,分析
    發(fā)表于 06-17 15:42 ?23次下載

    ARM在線升級(jí)的應(yīng)用IAP代碼

    電子專業(yè)單片機(jī)相關(guān)知識(shí)學(xué)習(xí)教材資料——ARM在線升級(jí)的應(yīng)用IAP代碼
    發(fā)表于 09-13 17:23 ?0次下載

    使用STM32單片機(jī)實(shí)現(xiàn)IAP的詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用STM32單片機(jī)實(shí)現(xiàn)IAP的詳細(xì)資料說明。先說一下實(shí)現(xiàn)的功能 IAP
    發(fā)表于 05-17 18:04 ?26次下載
    使用<b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>IAP</b>的詳細(xì)資料說明

    如何使用CPUID和AES算法實(shí)現(xiàn)STM32單片機(jī)固件升級(jí)

    針對(duì)STM32系統(tǒng)固件升級(jí)時(shí)使用同一個(gè)文件易被非法復(fù)制使用的缺陷,提出并實(shí)現(xiàn)了一種一個(gè)STM32芯片使用一個(gè)唯一
    發(fā)表于 11-19 15:14 ?35次下載
    如何使用CPUID和AES算法<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>固件</b><b class='flag-5'>升級(jí)</b>

    STM32單片機(jī)網(wǎng)絡(luò)遠(yuǎn)程升級(jí)固件的源碼下載

    STM32單片機(jī)網(wǎng)絡(luò)遠(yuǎn)程升級(jí)固件的源碼下載
    發(fā)表于 04-17 09:27 ?77次下載

    51單片機(jī)IAP在線升級(jí)

    51單片機(jī)IAP在線升級(jí)愛矽半導(dǎo)體E85F3325單片機(jī)IAP
    發(fā)表于 11-11 19:21 ?14次下載
    51<b class='flag-5'>單片機(jī)</b><b class='flag-5'>IAP</b><b class='flag-5'>在線</b><b class='flag-5'>升級(jí)</b>

    8051系列單片機(jī)固件升級(jí)iap

    8051系列單片機(jī)固件升級(jí)iap聲明:#define UPGRADE_FLAG 0xaa //升級(jí)標(biāo)志位#define APP_START_
    發(fā)表于 11-23 16:51 ?18次下載
    8051系列<b class='flag-5'>單片機(jī)</b><b class='flag-5'>固件</b><b class='flag-5'>升級(jí)</b><b class='flag-5'>iap</b>

    STC單片機(jī)在線ISP IAP OTA

    STC單片機(jī)在線ISP IAP OTA
    發(fā)表于 12-03 18:21 ?25次下載
    STC<b class='flag-5'>單片機(jī)</b><b class='flag-5'>在線</b>ISP <b class='flag-5'>IAP</b> OTA

    STM32通過IAP實(shí)現(xiàn)固件升級(jí)的分析與示例

    大部分MCU都可以通過IAP對(duì)片內(nèi)flash進(jìn)行讀寫來實(shí)現(xiàn)固件升級(jí)。這里主要是STM32如何實(shí)現(xiàn)
    發(fā)表于 12-14 18:50 ?11次下載
    <b class='flag-5'>STM32</b>通過<b class='flag-5'>IAP</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>固件</b><b class='flag-5'>升級(jí)</b>的分析與示例

    關(guān)于STM32單片機(jī)IAP實(shí)現(xiàn)

    基于STM32F103單片機(jī)IAP實(shí)現(xiàn)(雖然該篇文章不會(huì)詳細(xì)寫出實(shí)現(xiàn)細(xì)節(jié),但是會(huì)從一個(gè)全局的角度講述,實(shí)際的
    發(fā)表于 02-09 10:29 ?5次下載
    關(guān)于<b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>IAP</b><b class='flag-5'>實(shí)現(xiàn)</b>

    STM32 IAP升級(jí)固件與上位機(jī)例程

    本例程實(shí)現(xiàn)功能: 1、IAP固件程序實(shí)現(xiàn)固件APP搬移,跳轉(zhuǎn)至APP 2、APP固件程序
    發(fā)表于 05-29 16:26 ?17次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>IAP</b><b class='flag-5'>升級(jí)</b><b class='flag-5'>固件</b>與上位<b class='flag-5'>機(jī)</b>例程

    AT32 MCU如何使用IAP通過USART實(shí)現(xiàn)對(duì)固件在線升級(jí)更新

    AT32 MCU如何使用IAP通過USART實(shí)現(xiàn)對(duì)固件在線升級(jí)更新
    的頭像 發(fā)表于 09-19 16:51 ?2174次閱讀
    AT32 MCU如何使用<b class='flag-5'>IAP</b>通過USART<b class='flag-5'>實(shí)現(xiàn)</b>對(duì)<b class='flag-5'>固件</b>的<b class='flag-5'>在線</b><b class='flag-5'>升級(jí)</b>更新

    STM32/GD32系列單片機(jī)固件服務(wù)器使用手冊(cè)

    GD32、STM32單片機(jī),是我們最常見的一種MCU。通常我們?cè)谑褂?b class='flag-5'>STM32單片機(jī)都會(huì)遇到程序在線
    發(fā)表于 11-09 16:36 ?5次下載