倉庫地址:
https://github.com/loogg/agile_upgrade_mcu_demos
一般 Bootloader 實現的邏輯如下:
這種方式適合于簡單的裸機程序或可控的 OS 程序(即所有外設硬件都可把控),在準備環境的時候將其全部關閉。
但對于一些復雜的或者 OS 中輪子已造好的程序,有一些因素不花時間研究無法把控,在準備環境時很可能就會遺漏一些未關閉導致出各種各樣的問題。
這里提供一種 萬能 方法:
- 利用芯片中的不受軟件復位影響的可供用戶使用的寄存器 (如 STM32 中的備份寄存器)。
- 在需要跳入 APP 運行時將該寄存器賦值然后軟件復位。
- 在 OS 還沒初始化時判斷該寄存器值,如果需要跳轉只需要簡單的準備環境即可跳轉。
該方法可以使 Bootloader 就作為一個 OS 應用程序開發,需要跳轉的時候就操作一下寄存器并軟件復位即可。
該倉庫下所有的 Bootloader 例子均使用此方法。
以正點原子探索者開發板的 STM32F4 為例,將 system_stm32f4xx.c 文件的 SystemInit 函數修改:
1voidboot_start_application(void);
2voidSystemInit(void)
3{
4boot_start_application();
boot_start_application的實現為:
1typedefvoid(*boot_app_func)(void);
2voidboot_start_application(void){
3__HAL_RCC_PWR_CLK_ENABLE();
4HAL_PWR_EnableBkUpAccess();
5RTC_HandleTypeDefRTC_Handler={0};
6RTC_Handler.Instance=RTC;
7uint32_tbkp_data=HAL_RTCEx_BKUPRead(&RTC_Handler,BOOT_BKP);
8HAL_RTCEx_BKUPWrite(&RTC_Handler,BOOT_BKP,0);
9if(bkp_data!=0xA5A5)return;
10boot_app_funcapp_func=NULL;
11uint32_tapp_addr=BOOT_APP_ADDR;
12if(((*(__IOuint32_t*)(app_addr+4))&0xff000000)!=0x08000000)return;
13/*棧頂地址在128KRAM間*/
14if(((*(__IOuint32_t*)app_addr)-0x20000000)>=(STM32_SRAM_SIZE*1024))return;
15app_func=(boot_app_func)*(__IOuint32_t*)(app_addr+4);
16/*Configuremainstack*/
17__set_MSP(*(__IOuint32_t*)app_addr);
18/*jumptoapplication*/
19app_func();
20}
設置寄存器并軟件復位的實現為:
1staticvoidboot_app_enable(void){
2__disable_irq();
3RTC_HandleTypeDefRTC_Handler={0};
4RTC_Handler.Instance=RTC;
5HAL_RTCEx_BKUPWrite(&RTC_Handler,BOOT_BKP,0xA5A5);
6HAL_NVIC_SystemReset();
7}
版權聲明:本文為RT-Thread論壇用戶「Cfly」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://club.rt-thread.org/ask/article/08aa702381dd4310.html
———————End———————
RT-Thread線下入門培訓
5月 - 成都、武漢、西安
1.免費2.動手實驗+理論3.主辦方免費提供開發板4.自行攜帶電腦,及插線板用于筆記本電腦充電5.參與者需要有C語言、單片機(ARM Cortex-M核)基礎,請提前安裝好RT-Thread Studio 開發環境
立即掃碼報名
(4月-青島、北京 就在本周六)
報名鏈接
https://jinshuju.net/f/UYxS2k
巡回城市:青島、北京、西安、成都、武漢、鄭州、杭州、深圳、上海、南京
你可以添加微信:rtthread2020 為好友,注明:公司+姓名,拉進RT-Thread官方微信交流群!
-
RT-Thread
+關注
關注
31文章
1274瀏覽量
39938
原文標題:Bootloader 萬能實現邏輯
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論