一般 Bootloader 實現的邏輯如下:
這種方式適合于簡單的裸機程序或可控的 OS 程序(即所有外設硬件都可把控),在準備環境的時候將其全部關閉。
但對于一些復雜的或者 OS 中輪子已造好的程序,有一些因素不花時間研究無法把控,在準備環境時很可能就會遺漏一些未關閉導致出各種各樣的問題。
這里提供一種 萬能 方法:
- 利用芯片中的不受軟件復位影響的可供用戶使用的寄存器 (如 STM32 中的備份寄存器)。
- 在需要跳入 APP 運行時將該寄存器賦值然后軟件復位。
- 在 OS 還沒初始化時判斷該寄存器值,如果需要跳轉只需要簡單的準備環境即可跳轉。
該方法可以使 Bootloader 就作為一個 OS 應用程序開發,需要跳轉的時候就操作一下寄存器并軟件復位即可。
該倉庫下所有的 Bootloader 例子均使用此方法。
以正點原子探索者開發板的 STM32F4 為例,將 system_stm32f4xx.c 文件的 SystemInit 函數修改:
void boot_start_application(void);
2void SystemInit(void)
3{
4 boot_start_application();
boot_start_application的實現為:
typedef void (*boot_app_func)(void);
2void boot_start_application(void) {
3 __HAL_RCC_PWR_CLK_ENABLE();
4 HAL_PWR_EnableBkUpAccess();
5 RTC_HandleTypeDef RTC_Handler = {0};
6 RTC_Handler.Instance = RTC;
7 uint32_t bkp_data = HAL_RTCEx_BKUPRead(&RTC_Handler, BOOT_BKP);
8 HAL_RTCEx_BKUPWrite(&RTC_Handler, BOOT_BKP, 0);
9 if (bkp_data != 0xA5A5) return;
10 boot_app_func app_func = NULL;
11 uint32_t app_addr = BOOT_APP_ADDR;
12 if (((*(__IO uint32_t *)(app_addr + 4)) & 0xff000000) != 0x08000000) return;
13 /* 棧頂地址在 128K RAM 間 */
14 if (((*(__IO uint32_t *)app_addr) - 0x20000000) >= (STM32_SRAM_SIZE * 1024)) return;
15 app_func = (boot_app_func) * (__IO uint32_t *)(app_addr + 4);
16 /* Configure main stack */
17 __set_MSP(*(__IO uint32_t *)app_addr);
18 /* jump to application */
19 app_func();
20}
設置寄存器并軟件復位的實現為:
static void boot_app_enable(void) {
2 __disable_irq();
3 RTC_HandleTypeDef RTC_Handler = {0};
4 RTC_Handler.Instance = RTC;
5 HAL_RTCEx_BKUPWrite(&RTC_Handler, BOOT_BKP, 0xA5A5);
6 HAL_NVIC_SystemReset();
7}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
寄存器
+關注
關注
31文章
5363瀏覽量
120991 -
bootloader
+關注
關注
2文章
235瀏覽量
45700 -
STM32F4
+關注
關注
3文章
194瀏覽量
28144 -
裸機
+關注
關注
0文章
39瀏覽量
6422
發布評論請先 登錄
相關推薦
自作萬能充電寶
自作萬能充電寶,可AC220V輸入充電,AC220V有直接輸出5VUSB接口。可5v輸入充電,還可太陽能充電。有蓄電池供電,由USB輸出5V。 還可給電池充電,有萬能電池座。萬能電池座
發表于 11-03 11:45
電子萬能試驗機與液壓萬能試驗機的區別
電子萬能材料試驗機主要采用伺服電機作為動力源,絲杠、絲母作為執行部件,實現試驗機移動橫梁的速度控制。在傳動控制上,目前主要有兩種形式,同步帶 和減速機。國內來說,長春地區的試驗機廠家多采用同步帶
發表于 07-04 16:06
怎樣去設計基于STM32的紅外萬能遙控器
連載目錄:01、基于STM32的紅外萬能遙控器完整教程視情況更新。。。基于STM32的紅外萬能遙控器完整教程一、概述實現的功能參考文檔二、項目的邏輯三、硬件主控模塊接線方式四、代碼結構
發表于 08-16 06:49
萬能遙控器設置方法_萬能遙控器代碼
電視是每個家庭必不可少的家用電器,所以我們在使用遙控器的時間也會比較多。但如果遙控器換了怎么辦,很多人都會想到配一個萬能遙控器,那么萬能遙控器怎么設置,它的萬能遙
發表于 09-14 18:08
?18.8w次閱讀
Bootloader 萬能實現邏輯
倉庫地址: https://github.com/loogg/agile_upgrade_mcu_demos 一般 Bootloader 實現的邏輯如下: 這種方式適合于簡單的裸機程序或可控的 OS
評論