一般 Bootloader 實(shí)現(xiàn)的邏輯如下:
這種方式適合于簡(jiǎn)單的裸機(jī)程序或可控的 OS 程序(即所有外設(shè)硬件都可把控),在準(zhǔn)備環(huán)境的時(shí)候?qū)⑵淙筷P(guān)閉。
但對(duì)于一些復(fù)雜的或者 OS 中輪子已造好的程序,有一些因素不花時(shí)間研究無(wú)法把控,在準(zhǔn)備環(huán)境時(shí)很可能就會(huì)遺漏一些未關(guān)閉導(dǎo)致出各種各樣的問(wèn)題。
這里提供一種 萬(wàn)能 方法:
- 利用芯片中的不受軟件復(fù)位影響的可供用戶使用的寄存器 (如 STM32 中的備份寄存器)。
- 在需要跳入 APP 運(yùn)行時(shí)將該寄存器賦值然后軟件復(fù)位。
- 在 OS 還沒(méi)初始化時(shí)判斷該寄存器值,如果需要跳轉(zhuǎn)只需要簡(jiǎn)單的準(zhǔn)備環(huán)境即可跳轉(zhuǎn)。
該方法可以使 Bootloader 就作為一個(gè) OS 應(yīng)用程序開(kāi)發(fā),需要跳轉(zhuǎn)的時(shí)候就操作一下寄存器并軟件復(fù)位即可。
該倉(cāng)庫(kù)下所有的 Bootloader 例子均使用此方法。
以正點(diǎn)原子探索者開(kāi)發(fā)板的 STM32F4 為例,將 system_stm32f4xx.c 文件的 SystemInit 函數(shù)修改:
void boot_start_application(void);
2void SystemInit(void)
3{
4 boot_start_application();
boot_start_application的實(shí)現(xiàn)為:
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 /* 棧頂?shù)刂吩?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}
設(shè)置寄存器并軟件復(fù)位的實(shí)現(xiàn)為:
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}
-
寄存器
+關(guān)注
關(guān)注
31文章
5325瀏覽量
120044 -
bootloader
+關(guān)注
關(guān)注
2文章
234瀏覽量
45556 -
STM32F4
+關(guān)注
關(guān)注
3文章
194瀏覽量
28000 -
裸機(jī)
+關(guān)注
關(guān)注
0文章
39瀏覽量
6349
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論