iap升级问题 stm32f103r8_STM32的基于串口的IAP固件升级与加密
大家好,我是川楠,最近,在問答頻道上看到有人對IAP升級心存疑惑。恰好,我本人在這方面的做過功課,也實戰(zhàn)使用到很多的項目上,所以我就來為大家做個拋磚引玉吧。
???????? 本次例程,我用的是STM32F103VET6單片機開發(fā)板,這個是我2012年買的,有沒有人和我用的一樣的呢?
? ? ? ? ??
???????? 所謂的IAP( InApplication Programming)即在線應用編程。其主要的應用就是對程序的在線升級更新。比如,我們開發(fā)的產品,在已經(jīng)大量出貨的情況下,突然發(fā)現(xiàn)我們產品的程序有個BUG,在這種情況下,總不能把所有的產品都召回吧,這樣成本太高了。IAP就可以很好避免這個問題。
???????? 如果你的設備上有IAP功能,你可以要求把你的產品接到網(wǎng)口、USB、插個有新程序的TF卡、或者串口等等,就能對產品設備進行固件升級。就像我們的手機刷機一樣。
IAP升級原理
???????? STM32單片機,根據(jù)BOOT電平的設置,其上電啟動的地址也是不一樣的,常用的是從Flash啟動。對應的BOOT電平設置如下:
? ? ? ? ?
在FLASH啟動模式下,上電的啟動地址是:0x0800 0000,也是FLASH的起始地址。
???????? 比如,本次使用的STM32F103VET6單片機,其FLASH大小為512K,RAM尺寸為64K。這里我將程序設計成兩個BOOT程序和APP程序。
BOOT程序:位于FLASH的起始地址,及0x08000000.主要進行對后面APP程序的FLASH扇區(qū)進行編程,上電默認執(zhí)行。
APP程序:位于FLASH的后半段,為用戶實現(xiàn)功能的程序。
???????? 所以這里將512K的FLASH分成了兩部分從0x0800000 -0x0800 FFFF 為BOOT程序區(qū),合計64K;剩下的從0x0801 0000-0x0808 0000為用戶APP程序區(qū),合計448K。
程序的啟動流程是:
單片機上電之后,首先從0x08000000啟動,運行BOOT程序,在BOOT程序中檢測是否需要進行固件升級:
如果需要升級,則按照規(guī)定的方式,從串口接收數(shù)據(jù)對單片機的FLASH進行改寫,改寫完成之后,需要對改寫的固件進行校驗。校驗通過后,則進行程序跳轉。
如果不需要升級,則判斷APP程序的起始地址是否正常,若正常,則進行程序跳轉,運行APP即可。
說了這么多,下面開始實操。
BOOT程序設計
BOOT程序的核心功能有兩個:
1、程序跳轉
2、對APP程序的FLASH扇區(qū)內容進行改寫
程序跳轉很簡單,也就幾句話:
其中的 APP_START 就是我們APP程序的起始地址:0x0801 0000
而FLASH的改寫稍微麻煩些,需要將0x0801 0000 后面的FLASH扇區(qū)進行擦除和重寫。重寫的類容為我們新的APP程序類容。
???????? 這里說明下,新的APP程序數(shù)據(jù),有多種來源方式:可以將新的APP程序的BIN文件放到TF卡中,BOOT程序根據(jù)TF卡的BIN文件,去改寫APP扇區(qū)。也可以用過CAN、RS485、串口、USB等串行接口接收新的APP程序數(shù)據(jù)包,并把數(shù)據(jù)包依次寫到APP扇區(qū)。本次使用的是串口。
配置工程:默認的是ROM1的起始地址為0x0800 0000 SIZE 為0x8 0000
而本次我們分配的BOOT程序為64K,所以需要修改SIZE為0x1 0000
其他的地方編程和我們平時編程是一樣的。
程序編寫成功之后,點擊“LOAD”下載就可以了。
這里需要主要的是:
1、每個單片機的FLASH大小和扇區(qū)是不一樣的,兩個程序的分割點,一定要選擇某個扇區(qū)的起始地址。
2、本次是使用的單片機有256個扇區(qū),每個扇區(qū)為2K,但是并不是所有單片機的PAGE都是一樣大小的,比如STM32F407的扇區(qū)就不是平均分配的。
3、BOOT的功能建議設計為越簡單越好,其主要功能就是為了下載程序。所以,越簡單,其可能出問題的幾率就越小。如果BOOT程序出了問題,那一般只能進行產品召回了。
4、安全很重要。在BOOT程序里,一定要記得,要將其他的控制引腳保持在合適的電平。比如:做小車控制板,在BOOT程序升級的時候,忘記了把運動控制引腳的電平拉低,導致在升級的時候,小車亂跑,容易撞到東西。
========================示例:我設計的BOOT程序升級流程=====================
正常情況下,程序上電啟動之后從MCU起始地址0x0800 0000直接啟動,讀取BKP_DR1寄存器,判斷是否需要固件升級,如果不要升級,則進入固件跳轉,運行APP程序。
當需要更新固件的時候,需要嚴格按照如下的步驟和通訊要求進行操作,具體操作如下:
l ?目標設備上電之后(程序已經(jīng)完成了跳轉),上位機發(fā)送“固件更新命令”,目標設備重新復位啟動,在這個過程中目標設備不能斷電(此時固件更新命令將保存到BKP_DR1備份寄存器中)。
l ?上位機可以使用相關的命令獲取設備的MCU型號、內存、ID、版本、固件起始地址(主要是固件起始地址參數(shù),如果知道可以跳過此步驟)等相關信息。
l ?上位機發(fā)送“開始更新固件”命令,該命令包含固件的起始地址,目標設備收到后需要應答。
l ?上位機開始分包發(fā)送固件數(shù)據(jù)幀,目標設備校驗并保存固件數(shù)據(jù),同時需要應答上位機;如果數(shù)據(jù)校驗失敗,可以要求上位機重傳。
l ?上位機收到應答數(shù)據(jù)幀之后,才能繼續(xù)發(fā)送固件數(shù)據(jù)幀。當上位機發(fā)送完整個固件數(shù)據(jù)幀之后,上位機需要發(fā)送固件數(shù)據(jù)更新完畢命令,目標設備應答,開始重啟,此刻目標設備固件更新完成。
具體流程如下圖所示:
??? 在BootLoader程序中,固件的起始地址、BootLoader版本都在程序的代碼中固化好了;CPUID、內存尺寸直接讀取MCU相關的寄存器即可...
點擊文末“閱讀原文”,查看完整文章!
↓↓↓?爆品推薦:安信可WiFi模塊 ESP8266,僅售4.99
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的iap升级问题 stm32f103r8_STM32的基于串口的IAP固件升级与加密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: app vue 真机运行_uni-app
- 下一篇: 3 左右_3万左右电动迷你小汽车,3万左