- STM32CubeMx開發之路—在線升級OTA(1/4)—基礎知識
- STM32CubeMx開發之路—在線升級OTA(2/4)—BootLoader
- STM32CubeMx開發之路—在線升級OTA(3/4)—App
- STM32CubeMx開發之路—在線升級OTA(4/4)—測試
運行環境
Windows10
STM32CubeMX
Version 5.4.0
Keil5(MDK5)
Version 5.28.0.0
硬件開發板
F103RB-NUCLEO
簡介
本例程主要講解在線升級(OTA)的BooLoader
的編寫.我將以我例程的BootLoader爲例, 講解BootLoader
(後面會提供免費的代碼下載鏈接), 其他的大體上原理都差不多.
流程圖分析
以我歷程的BootLoader爲例:
- 我將
App2區
的最後一個字節(0x0801FFFC
)用來表示App2區
是否有升級程序, STM32在擦除之後Flash的數據存放的都是0xFFFFFFFF
, 如果有, 我們將這個地址存放0xAAAAAAAA
. 具體的流程圖見下圖所示
程序編寫和分析
所需STM32的資源有:
- printf的使用, 可以參考以前的博文STM32CubeMx開發之路—3發送USART數據和printf重定向
- Flash的讀寫, 可以參考以前的博文STM32CubeMX開發之路—8Flash讀寫
- 程序跳轉指令:可以參考如下代碼:
/* 採用彙編設置棧的值 */
__asm void MSR_MSP (uint32_t ulAddr)
{
MSR MSP, r0 //設置Main Stack的值
BX r14
}
/* 程序跳轉函數 */
typedef void (*Jump_Fun)(void);
void IAP_ExecuteApp (uint32_t App_Addr)
{
Jump_Fun JumpToApp;
if ( ( ( * ( __IO uint32_t * ) App_Addr ) & 0x2FFE0000 ) == 0x20000000 ) //檢查棧頂地址是否合法.
{
JumpToApp = (Jump_Fun) * ( __IO uint32_t *)(App_Addr + 4); //用戶代碼區第二個字爲程序開始地址(復位地址)
MSR_MSP( * ( __IO uint32_t * ) App_Addr ); //初始化APP堆棧指針(用戶代碼區的第一個字用於存放棧頂地址)
JumpToApp(); //跳轉到APP.
}
}
- 在需要跳轉的地方執行這個函數就可以了
IAP_ExecuteApp(Application_1_Addr);
- 其他的代碼請參考`BootLoader源代碼
源碼
BootLoader源代碼
STM32F103rb_delay_us.zip
備註:提供一下個人微信號 Hleafleafleaf,歡迎加好友,共同學習!共同進步!