在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

關于在線升級IAP的基礎知識

GReq_mcu168 ? 來源:CSDN技術社區 ? 作者:IoT小胡 ? 2022-05-31 17:24 ? 次閱讀

簡介

本文主要講解在線升級IAP的基礎知識, 主要是針對IAP從原理分析,分區劃分, 到代碼編寫和實驗驗證等過程闡述這一過程. 幫助大家加深對在線升級的認識.

1. 在線升級知識

什么是BootLoader?

BootLoader可以理解成是引導程序, 它的作用是啟動正式的App應用程序. 換言之,BootLoader是一個程序, App也是一個程序, BootLoader程序是用于啟動App程序的.

STM32中的程序在哪兒?

正常情況下, 我們寫的程序都是放在STM32片內Flash中(暫不考慮外擴Flash). 我們寫的代碼最終會變成二進制文件, 放進Flash中 感興趣的話可以在Keil>>>Debug>>>Memory中查看, 右邊Memory窗口存儲的就是代碼

e679dd4a-da5e-11ec-ba43-dac502259ad0.png

接下來就可以進入正題了.

進行分區

既然我們寫的程序都會變成二進制文件存放到Flash中, 那么我們就可以進一步對我們程序進行分區. 我使用的是F103RB-NUCLEO開發板,他的Flash一共128頁, 每頁1K.見下圖:

e6a8a6ac-da5e-11ec-ba43-dac502259ad0.png

以它為例, 我將它分為三個區.BootLoader區App1區App2區(備份區)具體劃分如下圖:

  • BootLoader區存放啟動代碼

  • App1區存放應用代碼

  • App2區存放暫存的升級代碼

e6e71e46-da5e-11ec-ba43-dac502259ad0.png

總體流程圖

  • 先執行BootLoader程序, 先去檢查APP2區有沒有程序, 如果有就將App2區(備份區)的程序拷貝到App1區, 然后再跳轉去執行App1的程序.

  • 然后執行App1程序, 因為BootLoaderApp1這兩個程序的向量表不一樣, 所以跳轉到App1之后第一步是先去更改程序的向量表. 然后再去執行其他的應用程序.

  • 在應用程序里面會加入程序升級的部分, 這部分主要工作是拿到升級程序, 然后將他們放到App2區(備份區), 以便下次啟動的時候通過BootLoader更新App1的程序. 流程圖如下圖所示:

e711da8c-da5e-11ec-ba43-dac502259ad0.png

2. BootLoader的編寫

本節主要講解在線升級(OTA)的BooLoader的編寫,我將以我例程的BootLoader為例, 講解BootLoader(文末會提供免費的代碼下載鏈接),其他的大體上原理都差不多。

流程圖分析

以我例程的BootLoader為例:

我將App2區的最后一個字節(0x0801FFFC)用來表示App2區是否有升級程序, STM32在擦除之后Flash的數據存放的都是0xFFFFFFFF, 如果有, 我們將這個地址存放0xAAAAAAAA. 具體的流程圖見下圖所示

e739b20a-da5e-11ec-ba43-dac502259ad0.png

程序編寫和分析

所需STM32的資源有:

  • 發送USART數據和printf重定向

  • Flash的讀寫

  • 程序跳轉指令,可以參考如下代碼:


		

1/*采用匯編設置棧的值*/ 2__asmvoidMSR_MSP(uint32_tulAddr) 3{ 4MSRMSP,r0//設置MainStack的值 5BXr14 6} 7 8 9/*程序跳轉函數*/ 10typedefvoid(*Jump_Fun)(void); 11voidIAP_ExecuteApp(uint32_tApp_Addr) 12{ 13Jump_FunJumpToApp; 14 15if(((*(__IOuint32_t*)App_Addr)&0x2FFE0000)==0x20000000)//檢查棧頂地址是否合法. 16{ 17JumpToApp=(Jump_Fun)*(__IOuint32_t*)(App_Addr+4);//用戶代碼區第二個字為程序開始地址(復位地址) 18MSR_MSP(*(__IOuint32_t*)App_Addr);//初始化APP堆棧指針(用戶代碼區的第一個字用于存放棧頂地址) 19JumpToApp();//跳轉到APP. 20} 21}

  • 在需要跳轉的地方執行這個函數就可以了IAP_ExecuteApp(Application_1_Addr);

  • 其他的代碼請參考BootLoader源代碼

3. APP的編寫

本節主要講解在線升級(OTA)的App1的編寫以及整個流程的說明,我將以我例程的App為例, 采用Ymodem協議進行串口傳輸,講解App的編寫(后面會提供免費的代碼下載鏈接), 其他的協議原理大體上都差不多, 都是通過某種協議拿到升級的代碼。

流程圖分析

以我例程的App1為例:

  • 先修改向量表, 因為本程序是由BootLoader跳轉過來的, 不修改向量表后面會出現問題;

  • 打印版本信息, 方便查看不同的App版本;

  • 本例程的升級程序采用串口的Ymoderm協議進行傳輸bin文件. 具體的流程圖見下圖所示:

e763f696-da5e-11ec-ba43-dac502259ad0.png

程序編寫和分析

所需STM32的資源有:

  • 發送USART數據和printf重定向

  • Flash的讀寫

  • 串口的DMA收發

  • YModem協議相關

Ymodem協議

  • 百度百科[Ymodem協議]

  • 具體流程可自行查找相關文檔, 這兒提供一個我找到的 XYmodem.pdf(文末和源碼一起提供).

  • Ymodem協議相關介紹可參考我的這篇教程 YModem介紹

(https://blog.csdn.net/weixin_41294615/article/details/104652105).

代碼分析

  • 代碼大多數都是通過串口實現Ymodem協議的接收, 這兒就不詳細說明
  • 后面放了我的源代碼, 詳情請參考我的源代碼.
  • 主函數添加修改向量表的指令

e7ce9c80-da5e-11ec-ba43-dac502259ad0.png

  • 打印版本信息以及跳轉指令

e81ded62-da5e-11ec-ba43-dac502259ad0.png

  • YModem相關的文件接收部分

		1/**  2*@bieafYModem升級  3*  4*@paramnone  5*@returnnone  6*/  7voidymodem_fun(void)  8{  9inti; 10if(Get_state()==TO_START) 11{ 12send_command(CCC); 13HAL_Delay(1000); 14} 15if(Rx_Flag)//Receiveflag 16{ 17Rx_Flag=0;//cleanflag 18 19/*拷貝*/ 20temp_len=Rx_Len; 21for(i=0;i22{ 23temp_buf[i]=Rx_Buf[i]; 24} 25 26switch(temp_buf[0]) 27{ 28caseSOH:///<數據包開始 29{ 30staticunsignedchardata_state=0; 31staticunsignedintapp2_size=0; 32if(Check_CRC(temp_buf,temp_len)==1)/// 33{ 34if((Get_state()==TO_START)&&(temp_buf[1]==0x00)&&(temp_buf[2]==(unsignedchar)(~temp_buf[1])))/// 35{ 36printf(">Receivestart... "); 37 38Set_state(TO_RECEIVE_DATA); 39data_state=0x01; 40send_command(ACK); 41send_command(CCC); 42 43/*擦除App2*/ 44Erase_page(Application_2_Addr,40); 45} 46elseif((Get_state()==TO_RECEIVE_END)&&(temp_buf[1]==0x00)&&(temp_buf[2]==(unsignedchar)(~temp_buf[1])))/// 47{ 48printf(">Receiveend... "); 49 50Set_Update_Down(); 51Set_state(TO_START); 52send_command(ACK); 53HAL_NVIC_SystemReset(); 54} 55elseif((Get_state()==TO_RECEIVE_DATA)&&(temp_buf[1]==data_state)&&(temp_buf[2]==(unsignedchar)(~temp_buf[1])))/// 56{ 57printf(">Receivedatabag:%dbyte ",data_state*128); 58 59/*燒錄程序*/ 60WriteFlash((Application_2_Addr+(data_state-1)*128),(uint32_t*)(&temp_buf[3]),32); 61data_state++; 62 63send_command(ACK); 64} 65} 66else 67{ 68printf(">Notpasscrc "); 69} 70 71}break; 72caseEOT://數據包開始 73{ 74if(Get_state()==TO_RECEIVE_DATA) 75{ 76printf(">ReceiveEOT1... "); 77 78Set_state(TO_RECEIVE_EOT2); 79send_command(NACK); 80} 81elseif(Get_state()==TO_RECEIVE_EOT2) 82{ 83printf(">ReceiveEOT2... "); 84 85Set_state(TO_RECEIVE_END); 86send_command(ACK); 87send_command(CCC); 88} 89else 90{ 91printf(">ReceiveEOT,Buterror... "); 92} 93}break; 94} 95} 96}
  • 其中部分函數未在以上代碼中展現, 詳情請參看文末給出的源碼鏈接.

4. 整體測試

本節主要對前三節的教程做測試驗證BootLoader+App的升級功能。

源代碼

BootLoader源代碼和App1源代碼可以在原作者的gitee獲取:https://gitee.com/leafguo/leaf_notes/STM32CubeMX/STM32CubeMx_OTA

代碼的下載

  • 由下圖可知兩份代碼的下載區域是不一樣的,所以他們「下載的區域也不一樣」

e6e71e46-da5e-11ec-ba43-dac502259ad0.png

BootLoader的下載

  • BootLoader的代碼默認是最開始的所以不需要特別設置代碼的下載位置
  • 按照下圖, 修改擦除方式為Erase Sectors, 大小限制在0X5000(20K)

e869658a-da5e-11ec-ba43-dac502259ad0.png

  • 燒錄代碼
  • 運行, 通過串口1打印輸出, 會看到以下打印消息
  • 說明BootLoader已經成功運行

e8abead6-da5e-11ec-ba43-dac502259ad0.png

App1的下載

  • App1稍微復雜一點, 需要將代碼的起始位置設置為0x08005000
  • 同時也要修改擦除方式為Erase Sectors, 見下圖

e9139fc8-da5e-11ec-ba43-dac502259ad0.png

e975bc76-da5e-11ec-ba43-dac502259ad0.png

  • 燒錄代碼
  • 運行, 通過串口1打印輸出, 會看到以下打印消息
  • 說明BootLoader已經成功跳轉到版本號為0.0.1的App1

e99d5308-da5e-11ec-ba43-dac502259ad0.png

生成App2的.bin文件

  • Keil如何生成.bin文件, 請參考這篇博文 Keil如何生成.bin文件
https://blog.csdn.net/weixin_41294615/article/details/104656577
  • 修改代碼, 把版本號改為0.0.2, 并且編譯并且生成.bin文件
  • 生成好之后你會得到一個.bin結尾的文件, 這就是我們待會兒YModem要傳輸的文件

e9b84ce4-da5e-11ec-ba43-dac502259ad0.png

使用Xshell進行文件傳輸

  • 打開Xshell
  • 代碼中, 串口1進行調試信息的打印, 串口2進行YModem升級的
  • 所以使用Xshell打開串口2進行文件傳輸, 串口1則可以通過串口調試助手查看調試消息
  • 你會看到App的版本成功升級到0.0.2了.
  • 如果你到了這一步.
  • 那么恭喜你! 你已經能夠使用在線升級了!

5. 總結

通過本幾節的教程, 想必你已經會使用在線升級了, 只要原理知道了其他的問題都可以迎刃而解了, 除了使用YModem協議傳輸.bin文件, 你還可以通過藍牙, WIFI,等其他協議傳輸, 只要能夠將.bin文件傳輸過去, 那其他的部分原理都差不多。

原文標題:詳解STM32在線IAP升級

文章出處:【微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

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

    關注

    2290

    文章

    11018

    瀏覽量

    362954
  • IAP
    IAP
    +關注

    關注

    2

    文章

    165

    瀏覽量

    24894
  • 在線升級
    +關注

    關注

    0

    文章

    9

    瀏覽量

    6045

原文標題:詳解STM32在線IAP升級

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    STM32 IAP在線升級

    STM32很強大的一個功能是支持IAP在線升級IAP(In-Application Programming),即在“應用程序中編程 ",通俗的來將是程序自己可以往程序存儲器里寫數據或
    發表于 03-09 15:56

    介紹關于編程的基礎知識

    關注、星標公眾號,不錯過精彩內容作者:strongerHuang對于軟件工程師來說,代碼升級(或程序更新)算是必備基礎知識。下面將介紹關于編程的基礎知識,以及結合STM32官方提供的D
    發表于 07-27 08:13

    IAP在線升級

    flash。IAP在線升級的確是個好東西,對于那些已經安裝好的設備來說,真是一大利器。IAP的核心理論其實比較簡單:總共有兩個程序,一個叫bootloader,一個叫app。其中bo
    發表于 08-06 07:07

    IAP在線升級是什么

    IAP在線升級是什么?怎樣去設計應用程序?
    發表于 10-19 09:27

    如何去實現stm32的IAP在線升級

    如何去實現stm32的IAP在線升級呢?需要注意哪些事情呢?
    發表于 11-29 07:35

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

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

    串口藍牙IAP在線升級的相關資料推薦

    串口藍牙IAP在線升級轉載:https://www.it610.com/article/1279095852547194880.htm(https://www.it610.com/article
    發表于 12-10 06:55

    IAP在線升級相關資料分享

    最近做了一個工程需要用到IAP在線升級這個功能,當時在學的時候,了解到IAP的功能當時就覺得很雞肋,明明有燒寫器干嘛那么費事,現在覺得當時確實淺薄了,
    發表于 12-13 08:01

    STM32 IAP在線升級詳解

    背景知識一、stm32的內存映射參考博文:STM32 IAP 在線升級詳解操作前我們先來說一下內存映射:下圖在stm32f100芯片手冊的29頁,我們只截取關鍵部分注意: 根據啟動方式
    發表于 02-21 06:10

    STM8在線升級關于IAP與APP互相跳轉的實現

    詳細介紹STM8中,實現在線升級時,IAP與APP互相跳轉的過程。
    發表于 05-04 16:10 ?33次下載

    ARM在線升級的應用IAP代碼

    ARM嵌入式應用程序架構設計實例精講--ARM在線升級的應用IAP代碼
    發表于 07-08 11:08 ?6次下載

    ARM在線升級的應用IAP代碼

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

    STM32三種啟動模式以及IAP在線升級

    stm32 iap在線升級
    發表于 01-13 14:28 ?17次下載

    51單片機IAP在線升級

    51單片機IAP在線升級愛矽半導體E85F3325單片機IAP在線升級教程,此處可查看更新及de
    發表于 11-11 19:21 ?16次下載
    51單片機<b class='flag-5'>IAP</b><b class='flag-5'>在線</b><b class='flag-5'>升級</b>

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

    AT32 MCU如何使用IAP通過USART實現對固件的在線升級更新
    的頭像 發表于 09-19 16:51 ?3005次閱讀
    AT32 MCU如何使用<b class='flag-5'>IAP</b>通過USART實現對固件的<b class='flag-5'>在線</b><b class='flag-5'>升級</b>更新
    主站蜘蛛池模板: 欧美一级特黄aa大片视频 | 欧美色图在线视频 | 国产婷婷综合丁香亚洲欧洲 | 俄罗斯一级成人毛片 | 亚洲国产激情在线一区 | 丁香五月缴情综合网 | 狠狠色丁香婷婷综合小时婷婷 | 婷婷色九月 | 日日干干夜夜 | 欧美在线精品一区二区三区 | 日韩一级片免费看 | 亚洲人毛茸茸bbxx | 免费精品一区二区三区在线观看 | 特级毛片a级毛免费播放 | 天堂在线中文 | 中文一级黄色片 | 亚洲免费色| china3p单男精品自拍 | 四虎影视最新网址 | 四虎影院网 | 欧美一级看片a免费观看 | 美女黄视频免费 | 视频在线观看一区二区三区 | 日日干夜夜操s8 | 日本不卡免费高清视频 | 手机在线观看毛片 | 夜夜网站 | 国产产一区二区三区久久毛片国语 | 午夜a视频 | 香蕉视频久久久 | 特级黄色毛片 | 国产精品午夜在线观看 | 午夜无遮挡怕怕怕免费视频 | 亚洲男人天堂2021 | 国产69精品久久 | 五月婷婷丁香久久 | 久久在精品线影院精品国产 | 五月天激情开心网 | 亚洲免费色 | 人人做人人看 | 天天摸日日舔 |