国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

詳解stm32在線IAP升級

jf_BxU6dNQb ? 來源:CSDN ? 作者:CSDN ? 2022-12-05 11:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

1.在線升級知識

什么是BootLoader?

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

STM32中的程序在哪兒?

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

49d8a5c2-744e-11ed-8abf-dac502259ad0.png

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

進行分區

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

4a09bd4c-744e-11ed-8abf-dac502259ad0.png

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

  • BootLoader區存放啟動代碼
  • App1區存放應用代碼
  • App2區存放暫存的升級代碼

4a2a83d8-744e-11ed-8abf-dac502259ad0.png

總體流程圖

  • 先執行BootLoader程序, 先去檢查APP2區有沒有程序, 如果有就將App2區(備份區)的程序拷貝到App1區, 然后再跳轉去執行App1的程序.
  • 然后執行App1程序, 因為BootLoaderApp1這兩個程序的向量表不一樣, 所以跳轉到App1之后第一步是先去更改程序的向量表. 然后再去執行其他的應用程序.
  • 在應用程序里面會加入程序升級的部分, 這部分主要工作是拿到升級程序, 然后將他們放到App2區(備份區), 以便下次啟動的時候通過BootLoader更新App1的程序. 流程圖如下圖所示:

4a5a7e26-744e-11ed-8abf-dac502259ad0.png

2. BootLoader的編寫

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

流程圖分析

以我例程的BootLoader為例:

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

4a88aa94-744e-11ed-8abf-dac502259ad0.png

程序編寫和分析

所需STM32的資源有:

  • 發送USART數據和printf重定向
  • Flash的讀寫
  • 程序跳轉指令,可以參考如下代碼:
    /*采用匯編設置棧的值*/
    __asmvoidMSR_MSP(uint32_tulAddr)
    {
    MSRMSP,r0//設置MainStack的值
    BXr14
    }
    
    /*程序跳轉函數*/
    typedefvoid(*Jump_Fun)(void);
    voidIAP_ExecuteApp(uint32_tApp_Addr)
    {
    Jump_FunJumpToApp;
    
    if(((*(__IOuint32_t*)App_Addr)&0x2FFE0000)==0x20000000)//檢查棧頂地址是否合法.
    {
    JumpToApp=(Jump_Fun)*(__IOuint32_t*)(App_Addr+4);//用戶代碼區第二個字為程序開始地址(復位地址)
    MSR_MSP(*(__IOuint32_t*)App_Addr);//初始化APP堆棧指針(用戶代碼區的第一個字用于存放棧頂地址)
    JumpToApp();//跳轉到APP.
    }
    }
  • 在需要跳轉的地方執行這個函數就可以了IAP_ExecuteApp(Application_1_Addr);
  • 其他的代碼請參考BootLoader源代碼

3. APP的編寫

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

流程圖分析

以我例程的App1為例:

  • 先修改向量表, 因為本程序是由BootLoader跳轉過來的, 不修改向量表后面會出現問題;
  • 打印版本信息, 方便查看不同的App版本;
  • 本例程的升級程序采用串口的Ymoderm協議進行傳輸bin文件. 具體的流程圖見下圖所示:

4aa61cf0-744e-11ed-8abf-dac502259ad0.png

程序編寫和分析

所需STM32的資源有:

  • 發送USART數據和printf重定向
  • Flash的讀寫
  • 串口的DMA收發
  • YModem協議相關

Ymodem協議

  • 百度百科[Ymodem協議]
  • 具體流程可自行查找相關文檔, 這兒提供一個我找到的 XYmodem.pdf(文末和源碼一起提供).
  • Ymodem協議相關介紹可參考我的這篇教程 YModem介紹

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

代碼分析

  • 代碼大多數都是通過串口實現Ymodem協議的接收, 這兒就不詳細說明

  • 后面放了我的源代碼, 詳情請參考我的源代碼.

  • 主函數添加修改向量表的指令

4abcb91a-744e-11ed-8abf-dac502259ad0.png

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

4ae05e38-744e-11ed-8abf-dac502259ad0.png

  • YModem相關的文件接收部分

    /**
    *@bieafYModem升級
    *
    *@paramnone
    *@returnnone
    */
    voidymodem_fun(void)
    {
    inti;
    if(Get_state()==TO_START)
    {
    send_command(CCC);
    HAL_Delay(1000);
    }
    if(Rx_Flag)//Receiveflag
    {
    Rx_Flag=0;//cleanflag
    
    /*拷貝*/
    temp_len=Rx_Len;
    for(i=0;iswitch(temp_buf[0])
    {
    caseSOH:///<數據包開始
    {
    staticunsignedchardata_state=0;
    staticunsignedintapp2_size=0;
    if(Check_CRC(temp_buf,temp_len)==1)///
    {
    if((Get_state()==TO_START)&&(temp_buf[1]==0x00)&&(temp_buf[2]==(unsignedchar)(~temp_buf[1])))///
    {
    printf(">Receivestart...
    ");
    
    Set_state(TO_RECEIVE_DATA);
    data_state=0x01;
    send_command(ACK);
    send_command(CCC);
    
    /*擦除App2*/
    Erase_page(Application_2_Addr,40);
    }
    elseif((Get_state()==TO_RECEIVE_END)&&(temp_buf[1]==0x00)&&(temp_buf[2]==(unsignedchar)(~temp_buf[1])))///
    {
    printf(">Receiveend...
    ");
    
    Set_Update_Down();
    Set_state(TO_START);
    send_command(ACK);
    HAL_NVIC_SystemReset();
    }
    elseif((Get_state()==TO_RECEIVE_DATA)&&(temp_buf[1]==data_state)&&(temp_buf[2]==(unsignedchar)(~temp_buf[1])))///
    {
    printf(">Receivedatabag:%dbyte
    ",data_state*128);
    
    /*燒錄程序*/
    WriteFlash((Application_2_Addr+(data_state-1)*128),(uint32_t*)(&temp_buf[3]),32);
    data_state++;
    
    send_command(ACK);
    }
    }
    else
    {
    printf(">Notpasscrc
    ");
    }
    
    }break;
    caseEOT://數據包開始
    {
    if(Get_state()==TO_RECEIVE_DATA)
    {
    printf(">ReceiveEOT1...
    ");
    
    Set_state(TO_RECEIVE_EOT2);
    send_command(NACK);
    }
    elseif(Get_state()==TO_RECEIVE_EOT2)
    {
    printf(">ReceiveEOT2...
    ");
    
    Set_state(TO_RECEIVE_END);
    send_command(ACK);
    send_command(CCC);
    }
    else
    {
    printf(">ReceiveEOT,Buterror...
    ");
    }
    }break;
    }
    }
    }
  • 其中部分函數未在以上代碼中展現, 詳情請參看文末給出的源碼鏈接.

4. 整體測試

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

源代碼

BootLoader源代碼和App1源代碼可以在原作者的gitee獲?。?/span>

https://gitee.com/leafguo/leaf_notes/STM32CubeMX/STM32CubeMx_OTA

代碼的下載

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

4afd4c1e-744e-11ed-8abf-dac502259ad0.png

BootLoader的下載

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

4b142434-744e-11ed-8abf-dac502259ad0.png

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

4b4196ee-744e-11ed-8abf-dac502259ad0.png

App1的下載

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

4b5ced0e-744e-11ed-8abf-dac502259ad0.png

4b8628cc-744e-11ed-8abf-dac502259ad0.png

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

4baef716-744e-11ed-8abf-dac502259ad0.png

生成App2的.bin文件

  • Keil如何生成.bin文件, 請參考這篇博文 Keil如何生成.bin文件

https://blog.csdn.net/weixin_41294615/article/details/104656577

  • 修改代碼, 把版本號改為0.0.2, 并且編譯并且生成.bin文件

  • 生成好之后你會得到一個.bin結尾的文件, 這就是我們待會兒YModem要傳輸的文件

4bc00b64-744e-11ed-8abf-dac502259ad0.png

使用Xshell進行文件傳輸

  • 打開Xshell
  • 代碼中, 串口1進行調試信息的打印, 串口2進行YModem升級的
  • 所以使用Xshell打開串口2進行文件傳輸, 串口1則可以通過串口調試助手查看調試消息

    4beb8c3a-744e-11ed-8abf-dac502259ad0.png

  • 你會看到App的版本成功升級到0.0.2了.
  • 如果你到了這一步.
  • 那么恭喜你! 你已經能夠使用在線升級了!

5. 總結

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


審核編輯 :李倩


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

    關注

    2

    文章

    809

    瀏覽量

    43037
  • STM32
    +關注

    關注

    2309

    文章

    11162

    瀏覽量

    373472
  • IAP
    IAP
    +關注

    關注

    2

    文章

    169

    瀏覽量

    26063

原文標題:干貨 | 詳解 stm32 在線 IAP 升級

文章出處:【微信號:混說Linux,微信公眾號:混說Linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    基于納芯微實時控制MCU NS800RT5039的IAP固件升級指南(2)

    在上期《無需返廠!基于實時控制MCU NS800RT5039 的 IAP 固件升級指南(理論篇)》中,我們已經詳細拆解了 IAP 技術的核心原理、關鍵概念、方案設計邏輯以及實戰中常見問題的避坑要點
    的頭像 發表于 02-06 09:18 ?8995次閱讀
    基于納芯微實時控制MCU NS800RT5039的<b class='flag-5'>IAP</b>固件<b class='flag-5'>升級</b>指南(2)

    基于納芯微實時控制MCU NS800RT5039的IAP固件升級指南(1)

    設備固件升級需拆回原廠、依賴 J-LINK 等仿真器燒錄?這一痛點可通過 IAP(In-Application Programming)升級方案徹底解決。
    的頭像 發表于 02-06 09:13 ?7348次閱讀
    基于納芯微實時控制MCU NS800RT5039的<b class='flag-5'>IAP</b>固件<b class='flag-5'>升級</b>指南(1)

    在CW32F030的IAP應用介紹

    IAP 是 In Application Programing 的首字母縮寫,在應用編程,即在程序運行的過程中進行編程(升級程序, 更新固件)。 IAP 是用戶自己的程序在運行過程中對 Flash
    發表于 01-22 07:20

    請問IAP功能升級流程中有哪些注意事項?

    IAP 功能升級流程中有哪些注意事項?
    發表于 12-23 07:55

    AS32A601型MCU芯片如何進行IAP升級?

    一、什么是IAP? IAP(In Application Programming,在應用編程)是一種技術,旨在實現用戶應用程序的動態更新,而無需使用專門的編程工具或硬件。IAP升級對于
    的頭像 發表于 12-19 11:39 ?2013次閱讀
    AS32A601型MCU芯片如何進行<b class='flag-5'>IAP</b><b class='flag-5'>升級</b>?

    如何在CW32F030上實現IAP功能實現遠程升級?

    IAP 是 In Application Programing 的首字母縮寫,在應用編程,即在程序運行的過程中進行編程(升級程序,更新固件)。IAP 是用戶自己的程序在運行過程中對 Flash 部分
    發表于 12-11 06:15

    使用TFTP實現IAP的方法

    使用 TFTP 實現 IAP 的方法廣泛應用于需要具有固件升級功能的嵌入式應用中(例如,嵌入式 Linux bootloader 中)。TFTP 是一種在 UDP 傳輸層上執行的簡單文件傳輸協議。此
    發表于 12-10 07:21

    基于IAP功能實現遠程升級,如何設計Flash雙Bank熱切換的回滾機制?

    基于IAP功能實現遠程升級時,如何設計Flash雙Bank熱切換的回滾機制?
    發表于 11-21 07:26

    如何使用 Bootloader 通過 BLE 模塊升級 APROM?

    使用具有 IAP 模式功能的 LDROM 中的ISP_UART引導加載程序,通過 ESP32 BLE 模塊升級 APROM 中的固件
    發表于 08-20 08:27

    AT32 MCU如何使用IAP

    。 AT32微控制器的IAP功能允許用戶在產品發布后方便地通過預留的通信口對產品中的固件程序進行更新升級。要實現IAP功能,需要設計兩個項目代碼:一個用于接收更新數據并執行更新;另一個是實際的功能代碼
    發表于 08-08 17:13

    AT32 IAP using the USART

    升級。通常實現 IAP 功能時,即用戶程序運行中作自身的更新操作,需要在設計固件程序時編寫兩個項目代碼,第一個項目程序不執行正常的功能操作,而只是通過某種通信方式(如USB、USART)接收程序或數據
    發表于 07-11 10:51

    stm32cubemax在線升級后,原來建立的工程被刪除了,如何恢復?

    cubemax在線升級后,原來建立的工程被刪除了,如何恢復
    發表于 07-10 08:22

    STM32項目分享:智能家居(機智云)升級

    01—項目簡介1.功能詳解STM32智能家居(機智云)升級版功能如下:檢測功能:監測環境溫濕度、煙霧濃度、一氧化碳、空氣質量、光照強
    的頭像 發表于 07-02 18:04 ?859次閱讀
    <b class='flag-5'>STM32</b>項目分享:智能家居(機智云)<b class='flag-5'>升級</b>版

    有沒有哪位大神提供一個STM32H523或者STM32H563的串口升級IAP程序?

    有沒有哪位大神提供一個STM32H523或者STM32H563的串口升級IAP程序
    發表于 06-12 06:56

    STM32項目分享:STM32智能語音臺燈

    —項目簡介1.功能詳解STM32智能語音臺燈功能如下:1.STM32F103C8T6單片機系統板作為主控單元2.按鍵切換模式,支
    的頭像 發表于 03-15 10:02 ?3044次閱讀
    <b class='flag-5'>STM32</b>項目分享:<b class='flag-5'>STM32</b>智能語音臺燈