色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32單片機實現固件在線升級(IAP)

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


1,固件升級方案綜述

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

2,劃分FALSH存儲區域

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

若要實現IAP功能則必須將FLASH空間劃分為幾個部分,每部分都存儲一個可以獨立運行的程序文件(可以理解為幾個獨立的單片機工程):

1、引導程序,每次復位時程序默認執行此程序,在接下來的執行過程中可以跳轉到用戶編寫的程序,因此這部分程序是固化在以0x08000000為起始的區域中。在引導程序中可以對電路系統作出一些自檢和初始化檢查的工作,因此該程序又稱為bootloader或boot程序,需要注意的是在設計bootloader時要提前規定好程序空間的大小,比如規定程序存儲區域為0x08000000-0x8007FFF,則bootlader程序存儲空間為32KB,編寫boot程序時要注意這一點

2、用戶需要升級的新程序,這部分包含了用戶的業務代碼,復雜的運算邏輯和算法實現均在這一部分完成,稱為APP程序,該部分程序一般存儲在bootloader區域之后的FLASH中。用一個不是特別恰當的例子類比bootloader和APP:bootloader相當于電腦組裝時的BIOS,APP則相當于操作系統,電腦開機時首先運行BIOS,完成后跳轉運行到操作系統。

3、升級之前的老版APP備份。這部分相當于電腦系統更新前對老系統的備份,一旦在升級過程中發生錯誤需要還原到備份系統,防止系統升級失敗成磚。同樣的APP與APP備份將剩余的FLASH平分,以上述booloader為例,APP程序及其備份所占區域為:(512-32)/2=240KB,因此編寫的APP程序編譯后的占用的FLASH空間不得超過240KB,這一點可以通過查驗.map文件確認,對于不同FLASH大小的芯片可以類比以上計算方法確認自己的程序大小上限(在此插入一句,改變編譯器的優化等級可以改變最后的程序大小,但是高的優化等級對程序編寫規范要求更高,因此優化等級應該在一開始設計APP之前就確定好,中途變更會帶來不可預測的問題)。

以STM32F407VET6單片機為例劃分后的FALSH存儲框圖如下所示:

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

3,BOOTLADER設計

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

1、系統自檢

2、實現APP程序跳轉

3、升級過程中接收APP文件并存儲到對應的FLASH區域

功能1、3對于不同的系統要求不同,自檢的內容以及實現文件傳輸的物理層接口和鏈路協議不同,不在此過多描述。下面主要給出APP跳轉的部分代碼:

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

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

4,編寫APP程序

APP程序中實現了用戶的業務代碼,和由APP跳轉回bootloader的邏輯,實際的操作還是對上文中程序存儲Flag的讀寫,這部分邏輯實現的流程圖如下圖所示:

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

由于APP程序對應的是另外一個工程文件,因此在工程設置中要將FLASH的偏移地址向下移動,空出bootlader的區域,比如上文中bootloader區域是0x08000000-0x08008000,因此APP工程的FLASH起始地址是0x8008000,偏移量是0x8000,這一點非常重要。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6035

    文章

    44554

    瀏覽量

    634637
  • STM32
    +關注

    關注

    2270

    文章

    10895

    瀏覽量

    355734
  • IAP
    IAP
    +關注

    關注

    2

    文章

    163

    瀏覽量

    24279
收藏 人收藏

    評論

    相關推薦

    如何實現STM32在線升級IAP功能?

    如何實現STM32在線升級IAP功能?
    發表于 11-30 06:22

    如何去實現STM32在線升級IAP功能呢

    最近因項目需求要實現STM32在線升級IAP功能,先將這幾天的學習體會和IAP的具體
    發表于 02-21 06:26

    stm32單片機自我升級程序IAP

    stm32 單片機自我升級程序IAP,詳細的介紹,分析
    發表于 06-17 15:42 ?23次下載

    ARM在線升級的應用IAP代碼

    電子專業單片機相關知識學習教材資料——ARM在線升級的應用IAP代碼
    發表于 09-13 17:23 ?0次下載

    使用STM32單片機實現IAP的詳細資料說明

    本文檔的主要內容詳細介紹的是使用STM32單片機實現IAP的詳細資料說明。先說一下實現的功能 IAP
    發表于 05-17 18:04 ?28次下載
    使用<b class='flag-5'>STM32</b><b class='flag-5'>單片機</b><b class='flag-5'>實現</b><b class='flag-5'>IAP</b>的詳細資料說明

    如何使用CPUID和AES算法實現STM32單片機固件升級

    針對STM32系統固件升級時使用同一個文件易被非法復制使用的缺陷,提出并實現了一種一個STM32芯片使用一個唯一
    發表于 11-19 15:14 ?37次下載
    如何使用CPUID和AES算法<b class='flag-5'>實現</b><b class='flag-5'>STM32</b><b class='flag-5'>單片機</b>的<b class='flag-5'>固件</b><b class='flag-5'>升級</b>

    STM32單片機網絡遠程升級固件的源碼下載

    STM32單片機網絡遠程升級固件的源碼下載
    發表于 04-17 09:27 ?77次下載

    51單片機IAP在線升級

    51單片機IAP在線升級愛矽半導體E85F3325單片機IAP
    發表于 11-11 19:21 ?16次下載
    51<b class='flag-5'>單片機</b><b class='flag-5'>IAP</b><b class='flag-5'>在線</b><b class='flag-5'>升級</b>

    8051系列單片機固件升級iap

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

    STC單片機在線ISP IAP OTA

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

    STM32通過IAP實現固件升級的分析與示例

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

    關于STM32單片機IAP實現

    基于STM32F103單片機IAP實現(雖然該篇文章不會詳細寫出實現細節,但是會從一個全局的角度講述,實際的
    發表于 02-09 10:29 ?5次下載
    關于<b class='flag-5'>STM32</b><b class='flag-5'>單片機</b>的<b class='flag-5'>IAP</b><b class='flag-5'>實現</b>

    STM32 IAP升級固件與上位例程

    本例程實現功能: 1、IAP固件程序實現固件APP搬移,跳轉至APP 2、APP固件程序
    發表于 05-29 16:26 ?17次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>IAP</b><b class='flag-5'>升級</b><b class='flag-5'>固件</b>與上位<b class='flag-5'>機</b>例程

    AT32 MCU如何使用IAP通過USART實現固件在線升級更新

    AT32 MCU如何使用IAP通過USART實現固件在線升級更新
    的頭像 發表于 09-19 16:51 ?2280次閱讀
    AT32 MCU如何使用<b class='flag-5'>IAP</b>通過USART<b class='flag-5'>實現</b>對<b class='flag-5'>固件</b>的<b class='flag-5'>在線</b><b class='flag-5'>升級</b>更新

    STM32/GD32系列單片機固件服務器使用手冊

    GD32、STM32單片機,是我們最常見的一種MCU。通常我們在使用STM32單片機都會遇到程序在線
    發表于 11-09 16:36 ?5次下載
    主站蜘蛛池模板: 国产永久视频| 丰满人妻按磨HD| 在线亚洲中文字幕36页| 亚洲 欧美 清纯 校园 另类 | 亚洲色偷偷偷网站色偷一区人人藻| 毛片免费在线播放| 国产午夜精品久久理论片| 国产AV亚洲国产AV麻豆| 黑色丝袜美女被网站| 国外经典三级| 欧美自拍亚洲综合图区| 亚洲欧美一区二区三区九九九| bbw videos 欧美老妇| MATURETUBE乱妇| 黑丝美女娇喘| 日日夜夜国产| 亚洲综合日韩在线2019| 纲手裸乳被爆白浆| 高清无码中文字幕影片| 理论片午午伦夜理片影院| 久久资源365| 亚欧成人毛片一区二区三区四区 | 中文字幕在线观看亚洲视频| 中文字幕亚洲无线码一区| 暖暖在线观看播放视频| 久久综合九色| 无码一区国产欧美在线资源| 日日噜噜噜噜夜夜爽亚洲精品| 熟妇的味道HD中文字幕| 女人被躁到高潮嗷嗷叫小| 亚洲spank男男实践网站| 一级毛片皇帝 宫女| 儿子日母亲B好爽| 你是淫荡的我的女王| 情浓野战台湾三级| 在线国产a不卡| 国产一区二区三区乱码在线观看 | 色偷拍自怕亚洲在线| 忘忧草在线社区WWW日本直播| 99久久久无码国产精品AAA| 久久精品国产亚洲AV热无遮挡 |