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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

詳解stm32在線IAP升級(jí)

jf_BxU6dNQb ? 來源:CSDN ? 作者:CSDN ? 2022-12-05 11:48 ? 次閱讀

本文主要講解在線升級(jí)IAP的基礎(chǔ)知識(shí), 主要是針對(duì)IAP原理分析,分區(qū)劃分, 到代碼編寫實(shí)驗(yàn)驗(yàn)證等過程闡述這一過程. 幫助大家加深對(duì)在線升級(jí)的認(rèn)識(shí)。

1.在線升級(jí)知識(shí)

什么是BootLoader?

BootLoader可以理解成是引導(dǎo)程序, 它的作用是啟動(dòng)正式的App應(yīng)用程序. 換言之,BootLoader是一個(gè)程序,App也是一個(gè)程序,BootLoader程序是用于啟動(dòng)App程序的.

STM32中的程序在哪兒?

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

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

接下來就可以進(jìn)入正題了.

進(jìn)行分區(qū)

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

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

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

  • BootLoader區(qū)存放啟動(dòng)代碼
  • App1區(qū)存放應(yīng)用代碼
  • App2區(qū)存放暫存的升級(jí)代碼

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

總體流程圖

  • 先執(zhí)行BootLoader程序, 先去檢查APP2區(qū)有沒有程序, 如果有就將App2區(qū)(備份區(qū))的程序拷貝到App1區(qū), 然后再跳轉(zhuǎn)去執(zhí)行App1的程序.
  • 然后執(zhí)行App1程序, 因?yàn)?/span>BootLoaderApp1這兩個(gè)程序的向量表不一樣, 所以跳轉(zhuǎn)到App1之后第一步是先去更改程序的向量表. 然后再去執(zhí)行其他的應(yīng)用程序.
  • 在應(yīng)用程序里面會(huì)加入程序升級(jí)的部分, 這部分主要工作是拿到升級(jí)程序, 然后將他們放到App2區(qū)(備份區(qū)), 以便下次啟動(dòng)的時(shí)候通過BootLoader更新App1的程序. 流程圖如下圖所示:

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

2. BootLoader的編寫

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

流程圖分析

以我例程的BootLoader為例:

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

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

程序編寫和分析

所需STM32的資源有:

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

3. APP的編寫

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

流程圖分析

以我例程的App1為例:

  • 先修改向量表, 因?yàn)楸境绦蚴怯葿ootLoader跳轉(zhuǎn)過來的, 不修改向量表后面會(huì)出現(xiàn)問題;
  • 打印版本信息, 方便查看不同的App版本;
  • 本例程的升級(jí)程序采用串口的Ymoderm協(xié)議進(jìn)行傳輸bin文件. 具體的流程圖見下圖所示:

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

程序編寫和分析

所需STM32的資源有:

  • 發(fā)送USART數(shù)據(jù)和printf重定向
  • Flash的讀寫
  • 串口的DMA收發(fā)
  • YModem協(xié)議相關(guān)

Ymodem協(xié)議

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

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

代碼分析

  • 代碼大多數(shù)都是通過串口實(shí)現(xiàn)Ymodem協(xié)議的接收, 這兒就不詳細(xì)說明

  • 后面放了我的源代碼, 詳情請(qǐng)參考我的源代碼.

  • 主函數(shù)添加修改向量表的指令

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

  • 打印版本信息以及跳轉(zhuǎn)指令

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

  • YModem相關(guān)的文件接收部分

    /**
    *@bieafYModem升級(jí)
    *
    *@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:///<數(shù)據(jù)包開始
    {
    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://數(shù)據(jù)包開始
    {
    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;
    }
    }
    }
  • 其中部分函數(shù)未在以上代碼中展現(xiàn), 詳情請(qǐng)參看文末給出的源碼鏈接.

4. 整體測(cè)試

本節(jié)主要對(duì)前三節(jié)的教程做測(cè)試驗(yàn)證BootLoader+App的升級(jí)功能。

源代碼

BootLoader源代碼和App1源代碼可以在原作者的gitee獲取:

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

代碼的下載

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

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

BootLoader的下載

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

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

  • 燒錄代碼
  • 運(yùn)行, 通過串口1打印輸出, 會(huì)看到以下打印消息
  • 說明BootLoader已經(jīng)成功運(yùn)行

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

App1的下載

  • App1稍微復(fù)雜一點(diǎn), 需要將代碼的起始位置設(shè)置為0x08005000
  • 同時(shí)也要修改擦除方式為Erase Sectors, 見下圖

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

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

  • 燒錄代碼
  • 運(yùn)行, 通過串口1打印輸出, 會(huì)看到以下打印消息
  • 說明BootLoader已經(jīng)成功跳轉(zhuǎn)到版本號(hào)為0.0.1的App1

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

生成App2的.bin文件

  • Keil如何生成.bin文件, 請(qǐng)參考這篇博文 Keil如何生成.bin文件

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

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

  • 生成好之后你會(huì)得到一個(gè).bin結(jié)尾的文件, 這就是我們待會(huì)兒YModem要傳輸?shù)奈募?/span>

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

使用Xshell進(jìn)行文件傳輸

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

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

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

5. 總結(jié)

通過本幾節(jié)的教程,想必你已經(jīng)會(huì)使用在線升級(jí)了,只要原理知道了其他的問題都可以迎刃而解了,除了使用YModem協(xié)議傳輸.bin文件,你還可以通過藍(lán)牙、WIFI等其他協(xié)議傳輸,只要能夠?qū)?bin文件傳輸過去,那其他的部分原理都差不多。


審核編輯 :李倩


聲明:本文內(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ìn)制
    +關(guān)注

    關(guān)注

    2

    文章

    803

    瀏覽量

    42148
  • STM32
    +關(guān)注

    關(guān)注

    2289

    文章

    11011

    瀏覽量

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

    關(guān)注

    2

    文章

    165

    瀏覽量

    24834

原文標(biāo)題:干貨 | 詳解 stm32 在線 IAP 升級(jí)

文章出處:【微信號(hào):混說Linux,微信公眾號(hào):混說Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問STM32CubeIDE能直接在軟件中升級(jí)嗎?

    STM32CubeIDE能直接在軟件中升級(jí)嗎?
    發(fā)表于 05-14 06:06

    請(qǐng)問STM32CubeIDE能直接在軟件中升級(jí)嗎?

    STM32CubeIDE能直接在軟件中升級(jí)嗎?
    發(fā)表于 04-27 08:42

    STM32項(xiàng)目分享:STM32智能語音分類垃圾桶

    01—項(xiàng)目簡(jiǎn)介1.功能詳解STM32智能語音分類垃圾桶功能如下:1.STM32F103C8T6單片機(jī)系統(tǒng)板作為主控單元2.舵機(jī)驅(qū)動(dòng)垃
    的頭像 發(fā)表于 03-15 10:02 ?1077次閱讀
    <b class='flag-5'>STM32</b>項(xiàng)目分享:<b class='flag-5'>STM32</b>智能語音分類垃圾桶

    STM32項(xiàng)目分享:STM32智能語音臺(tái)燈

    —項(xiàng)目簡(jiǎn)介1.功能詳解STM32智能語音臺(tái)燈功能如下:1.STM32F103C8T6單片機(jī)系統(tǒng)板作為主控單元2.按鍵切換模式,支
    的頭像 發(fā)表于 03-15 10:02 ?1064次閱讀
    <b class='flag-5'>STM32</b>項(xiàng)目分享:<b class='flag-5'>STM32</b>智能語音臺(tái)燈

    CUBEMX在線升級(jí),保存在軟件子目錄下的工程文件夾自動(dòng)給刪掉了,為什么?

    這是識(shí)別了不是軟件的文件夾自動(dòng)刪掉?我已經(jīng)重新試過一次了,退回6.12版本然后在線升級(jí),果然新建的工程文件升級(jí)后 被刪掉了
    發(fā)表于 03-07 08:08

    KMPHM在線監(jiān)測(cè)平臺(tái)賦能設(shè)備管理升級(jí)#在線監(jiān)測(cè)#振動(dòng)監(jiān)測(cè)

    在線監(jiān)測(cè)
    KM預(yù)測(cè)性維護(hù)專家
    發(fā)布于 :2025年03月06日 14:51:51

    STM32/GD32開發(fā)板基本串口RS232\\RS485通信及CAN接口 usbhid升級(jí) U盤升級(jí) sd卡升級(jí)升級(jí)學(xué)習(xí)方案開發(fā)板

    STM32F103/STM32F407/gd32F103/GD32F303開發(fā)板,例程用標(biāo)準(zhǔn)庫(kù)開發(fā)。基本串口RS232\\RS485通信及CAN接口 usbhid升級(jí) U盤升級(jí) sd卡
    發(fā)表于 02-27 14:56

    STM32F103上位機(jī)升級(jí),RS485升級(jí)、CAN升級(jí)

    STM32F103_IAP開發(fā)板,用STM32F103RCT6主控芯片,例程用標(biāo)準(zhǔn)庫(kù)開發(fā)。基本串口RS232\\RS485通信及CAN接口升級(jí)學(xué)習(xí)方案開發(fā)板。 升級(jí)方案分兩種:用外置F
    發(fā)表于 01-03 08:57

    如何開發(fā)不帶Flash API 的Bootloader實(shí)現(xiàn)在線升級(jí)

    電子發(fā)燒友網(wǎng)站提供《如何開發(fā)不帶Flash API 的Bootloader實(shí)現(xiàn)在線升級(jí).pdf》資料免費(fèi)下載
    發(fā)表于 09-12 09:41 ?0次下載
    如何開發(fā)不帶Flash API 的Bootloader實(shí)現(xiàn)<b class='flag-5'>在線</b><b class='flag-5'>升級(jí)</b>

    F28M35x串口在線升級(jí)設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《F28M35x串口在線升級(jí)設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 09-02 10:58 ?0次下載
    F28M35x串口<b class='flag-5'>在線</b><b class='flag-5'>升級(jí)</b>設(shè)計(jì)

    使用CUBE IDE無法通過IAP跳轉(zhuǎn)APP進(jìn)行軟件升級(jí)怎么解決?

    本人使用的是cubeide 1.7.0版本,單片機(jī)是STM32F407VET6.在這個(gè)IDE工具下,成功實(shí)現(xiàn)STM32F103RCT6單片機(jī)的升級(jí),卻無法實(shí)現(xiàn)F407這款芯片的升級(jí),我
    發(fā)表于 07-31 07:48

    【GD32F303紅楓派開發(fā)板使用手冊(cè)】第二十九講 USB-IAP升級(jí)實(shí)驗(yàn)

    USB IAP升級(jí)本例程中使用的是Custom HID中的IAP設(shè)備類,其設(shè)備類協(xié)議的實(shí)現(xiàn)與HID的類似,主要包括GET_REPORT/GET_IDLE/GET_PROTOCOL
    的頭像 發(fā)表于 07-04 09:54 ?1004次閱讀
    【GD32F303紅楓派開發(fā)板使用手冊(cè)】第二十九講 USB-<b class='flag-5'>IAP</b><b class='flag-5'>升級(jí)</b>實(shí)驗(yàn)

    詳解工業(yè)網(wǎng)關(guān)在線探測(cè)功能及用途

    詳解工業(yè)網(wǎng)關(guān)在線探測(cè)功能及用途 工業(yè)網(wǎng)關(guān)作為工業(yè)物聯(lián)網(wǎng)(IIoT)架構(gòu)中的關(guān)鍵組件,扮演著橋梁的角色,它連接了現(xiàn)場(chǎng)的各類傳感器、執(zhí)行器以及更高級(jí)別的云平臺(tái)或企業(yè)系統(tǒng)。在線探測(cè)功能是工業(yè)網(wǎng)關(guān)諸多能力中
    的頭像 發(fā)表于 06-20 13:55 ?603次閱讀
    <b class='flag-5'>詳解</b>工業(yè)網(wǎng)關(guān)<b class='flag-5'>在線</b>探測(cè)功能及用途

    請(qǐng)問ESP32是否支持串口在線升級(jí)

    請(qǐng)問ESP32是否支持串口在線升級(jí)。對(duì)OTA升級(jí)例程進(jìn)行修改,將http傳輸改為串口傳輸,是否可行。
    發(fā)表于 06-18 06:30
    主站蜘蛛池模板: 午夜福利理论片在线播放 | 性一交一无一伦一精一品 | 男同志vdieos免费 | 村妇偷人内射高潮迭起 | 欧美xx69| 在线视频中文字幕 | 蜜臀久久99精品久久久久久做爰 | 无码成人AAAAA毛片含羞草 | 亚洲AV无码专区国产乱码网站 | 吃胸亲吻吃奶摸下面免费视频 | 伦理片在线线手机版韩国免费观看 | 欧美黄色一级 | xxx免费观看 | 蝴蝶中文综合娱乐网2 | 在线观看国产精选免费 | 成人在线免费视频播放 | 青草精品国产福利在线视频 | 免费人成网站永久 | 色百度网址大全 | 国产激情文学 | JIZZ19学生第一次 | A级超碰视频在线观看 | 伊人第一路线 | 久久久无码AV精品亚洲A片软件 | 精品视频在线一区 | 欧美乱妇狂野欧美在线视频 | 无限资源在线观看8 | xxxx18动漫 | 亚洲高清一区二区三区电影 | 小蝌蚪视频在线观看免费观看WWW | 国产超碰精久久久久久无码AV | 老湿机一区午夜精品免费福利 | 99热只有这里有精品 | 国产一区二区三区乱码在线观看 | 动漫美女被到爽了流漫画 | 欧美高清18 | 成人毛片在线播放 | 国产露脸无码A区久久 | 摸董事长的裤裆恋老小说 | ppypp日本欧美一区二区 | 久久中文字幕乱码免费 |

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品