STM32在线升级OTA,看这一篇就够啦~
本文是博主在學(xué)習(xí)OTA時(shí)參考的文章,原作者leafguo,獲得授權(quán)后整理發(fā)布,原文鏈接如下:
STM32CubeMx開發(fā)之路—在線升級(jí)OTA(1/4)—基礎(chǔ)知識(shí)
簡(jiǎn)介
本文主要講解在線升級(jí)(OTA)的基礎(chǔ)知識(shí), 主要是針對(duì)IAP OTA從原理分析, 分區(qū)劃分, 到代碼編寫和實(shí)驗(yàn)驗(yàn)證等過程闡述這一過程. 幫助大家加深對(duì)OTA的認(rèn)識(shí).
1. OTA基礎(chǔ)知識(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ǔ)的就是代碼
接下來就可以進(jìn)入正題了.
進(jìn)行分區(qū)
既然我們寫的程序都會(huì)變成二進(jìn)制文件存放到Flash中, 那么我們就可以進(jìn)一步對(duì)我們程序進(jìn)行分區(qū).
我使用的是F103RB-NUCLEO開發(fā)板,他的Flash一共128頁, 每頁1K.見下圖:
以它為例, 我將它分為三個(gè)區(qū).BootLoader區(qū)、 App1區(qū)、 App2區(qū)(備份區(qū))具體劃分如下圖:
- BootLoader區(qū)存放啟動(dòng)代碼
- App1區(qū)存放應(yīng)用代碼
- App2區(qū)存放暫存的升級(jí)代碼
總體流程圖
- 先執(zhí)行BootLoader程序, 先去檢查APP2區(qū)有沒有程序, 如果有就將App2區(qū)(備份區(qū))的程序拷貝到App1區(qū), 然后再跳轉(zhuǎn)去執(zhí)行App1的程序.
- 然后執(zhí)行App1程序, 因?yàn)锽ootLoader和App1這兩個(gè)程序的向量表不一樣, 所以跳轉(zhuǎn)到App1之后第一步是先去更改程序的向量表. 然后再去執(zhí)行其他的應(yīng)用程序.
- 在應(yīng)用程序里面會(huì)加入程序升級(jí)的部分, 這部分主要工作是拿到升級(jí)程序, 然后將他們放到App2區(qū)(備份區(qū)), 以便下次啟動(dòng)的時(shí)候通過BootLoader更新App1的程序.
流程圖如下圖所示:
2. BootLoader的編寫
本節(jié)主要講解在線升級(jí)(OTA)的BooLoader的編寫,我將以我例程的BootLoader為例, 講解BootLoader(文末會(huì)提供免費(fèi)的代碼下載鏈接),其他的大體上原理都差不多。
流程圖分析
以我例程的BootLoader為例:
我將App2區(qū)的最后一個(gè)字節(jié)(0x0801FFFC)用來表示App2區(qū)是否有升級(jí)程序, STM32在擦除之后Flash的數(shù)據(jù)存放的都是0xFFFFFFFF, 如果有, 我們將這個(gè)地址存放0xAAAAAAAA. 具體的流程圖見下圖所示
程序編寫和分析
所需STM32的資源有:
- printf的使用, 可以參考以前的博文STM32CubeMx開發(fā)之路—3發(fā)送USART數(shù)據(jù)和printf重定向
- Flash的讀寫, 可以參考以前的博文STM32CubeMX開發(fā)之路—8Flash讀寫
- 程序跳轉(zhuǎn)指令:可以參考如下代碼:
- 在需要跳轉(zhuǎn)的地方執(zhí)行這個(gè)函數(shù)就可以了IAP_ExecuteApp(Application_1_Addr);
- 其他的代碼請(qǐng)參考BootLoader源代碼
源碼
BootLoader源代碼 STM32F103rb_delay_us.zip
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文件. 具體的流程圖見下圖所示:
程序編寫和分析
所需STM32的資源有:
- printf的使用, 詳情可參考 STM32CubeMx開發(fā)之路—3發(fā)送USART數(shù)據(jù)和printf重定向
- Flash的讀寫, 詳情可參考 STM32CubeMX開發(fā)之路—8Flash讀寫
- 串口的DMA收發(fā), 詳情可參考 STM32CubeMx開發(fā)之路—4采用DMA方式收發(fā)數(shù)據(jù)
- YModem協(xié)議相關(guān)的, 詳情可參考 YModem介紹
Ymodem協(xié)議
- 百度百科Ymodem協(xié)議
- 具體流程可自行查找相關(guān)文檔, 這兒提供一個(gè)我找到的 XYmodem.pdf.
- Ymodem協(xié)議相關(guān)介紹可參考我的這篇教程 YModem介紹.
代碼分析
-
代碼大多數(shù)都是通過串口實(shí)現(xiàn)Ymodem協(xié)議的接收, 這兒就不詳細(xì)說明
-
后面放了我的源代碼, 詳情請(qǐng)參考我的源代碼.
-
主函數(shù)添加修改向量表的指令
- 打印版本信息以及跳轉(zhuǎn)指令
- YModem相關(guān)的文件接收部分
- 其中部分函數(shù)未在以上代碼中展現(xiàn), 詳情請(qǐng)參看下面的源代碼(免費(fèi)).
源碼
App1源代碼 STM32F103rb_App1.zip
4. 整體測(cè)試
本節(jié)主要對(duì)前三節(jié)的教程做測(cè)試驗(yàn)證 BootLoader + App的升級(jí)功能。
源代碼
- BootLoader源代碼 STM32F103rb_delay_us.zip
- App1源代碼 STM32F103rb_App1.zip
代碼的下載
- 由下圖可知兩份代碼的下載區(qū)域是不一樣的,所以他們下載的區(qū)域也不一樣。
BootLoader的下載
- BootLoader的代碼默認(rèn)是最開始的所以不需要特別設(shè)置代碼的下載位置
- 按照下圖, 修改擦除方式為Erase Sectors, 大小限制在0X5000(20K)
- 燒錄代碼
- 運(yùn)行, 通過串口1打印輸出, 會(huì)看到以下打印消息
- 說明BootLoader已經(jīng)成功運(yùn)行
App1的下載
- App1稍微復(fù)雜一點(diǎn), 需要將代碼的起始位置設(shè)置為0x08005000
- 同時(shí)也要修改擦除方式為Erase Sectors, 見下圖
- 燒錄代碼
- 運(yùn)行, 通過串口1打印輸出, 會(huì)看到以下打印消息
- 說明BootLoader已經(jīng)成功跳轉(zhuǎn)到版本號(hào)為0.0.1的App1
生成App2的.bin文件
-
Keil如何生成.bin文件, 請(qǐng)參考這篇博文 Keil如何生成.bin文件
-
修改代碼, 把版本號(hào)改為0.0.2, 并且編譯并且生成.bin文件
-
生成好之后你會(huì)得到一個(gè).bin結(jié)尾的文件, 這就是我們待會(huì)兒YModem要傳輸?shù)奈募?/p>
使用Xshell進(jìn)行文件傳輸
- 打開Xshell
- 代碼中, 串口1進(jìn)行調(diào)試信息的打印, 串口2進(jìn)行YModem升級(jí)的
- 所以使用Xshell打開串口2進(jìn)行文件傳輸, 串口1則可以通過串口調(diào)試助手查看調(diào)試消息, 具體過程如下
- 你會(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文件傳輸過去, 那其他的部分原理都差不多.
原作者備注:提供一下個(gè)人微信號(hào) Hleafleafleaf,歡迎加好友,共同學(xué)習(xí)!共同進(jìn)步!
總結(jié)
以上是生活随笔為你收集整理的STM32在线升级OTA,看这一篇就够啦~的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 搭建ota服务器_OTA配置服
- 下一篇: ESP32 HttpServer模式下