STM32單片機實現Bootloader跳轉的關鍵步驟

2023-08-14 10:02:57 來源:一起學嵌入式

本期話題


(相關資料圖)

現在越來越多的嵌入式設備支持遠程自動升級,不需要再借助下載器。這樣對于設備的維護非常方便。當然若使設備支持遠程升級,需要編寫支持升級的程序代碼,可以稱之為 BootLoader。也就是說,將設備的程序代碼分為兩部分:BootLoader 和 APP。BootLoader 負責升級 APP 以及引導APP運行。APP 負責實現設備的業務處理功能,也就是設備的核心功能代碼。對于Cortex-M 系列的單片機來說,若要實現 BootLoader 安全跳轉到 APP,需要進行一些配置。本文就以 STM32單片機為例,來聊一聊實現 BootLoader 跳轉的關鍵配置步驟。

聊一聊:

在程序開發設計階段,要根據具體應用情況,對程序存儲的 Flash 進行分區。即,BootLoader 存儲的位置以及需要分配的空間大小,以及 APP 的存儲的位置和大小。這個存儲位置直接關系到程序的執行和跳轉。最簡單的一種升級方案是:一個 BootLoader 和 一個 APP ,BootLoader 實現跳轉和升級APP 的功能。本文以這個升級方案為例進行介紹。對于 STM32 單片機來說,程序啟動的映射地址為 0x8000000。可以將 BootLoader 存儲在 0x8000000 地址,分配的空間可以根據芯片具體的Flash大小進行調整。比如 0x10000,64K 字節。APP 存儲的地址,安排在 BootLoader 后邊,即存儲地址為 0x8010000,Flash 剩余的空間都可以分配給APP。BootLoader 工程配置BootLoader 的工程需要進行一些配置,以MDK為例,如下圖所示,BootLoader 程序存放的 FLASH 地址為 0x8000000,大小為 0x10000。

在跳轉APP的程序代碼需要注意以下幾點:

檢查棧頂地址是否合法,也就是 APP 存放的起始地址是否合法, if(((*(__IO uint32_t *)APP_FLASH_ADDR) & 0x2FFE0000) == 0x20000000)

屏蔽總中斷,防止在程序跳轉過程中,中斷干擾出現異常

獲取APP程序起始地址,代碼區第二個字(起始地址+4 Flash 位置存儲的數據)

初始化堆棧指針(用戶代碼區的第一個字用于存放棧頂地址)

利用 APP 起始地址,轉化為函數指針類型,執行跳轉

其具體的跳轉代碼如下:

/* 定義類型 */typedef void (*pFunction)(void);/* APP flash address */#define APP_FLASH_ADDR       (0x8010000)void jump_to_app(void){ uint32_t JumpAddress; pFunction Jump_To_Application; /* 檢查棧頂地址是否合法 */ if(((*(__IO uint32_t *)APP_FLASH_ADDR) & 0x2FFE0000) == 0x20000000) {  /* 屏蔽所有中斷,防止在跳轉過程中,中斷干擾出現異常 */  __disable_irq();  /* 用戶代碼區第二個 字 為程序開始地址(復位地址) */  JumpAddress = *(__IO uint32_t *) (APP_FLASH_ADDR + 4);  /* Initialize user application"s Stack Pointer */  /* 初始化APP堆棧指針(用戶代碼區的第一個字用于存放棧頂地址) */  __set_MSP(*(__IO uint32_t *) APP_FLASH_ADDR);  /* 類型轉換 */  Jump_To_Application = (pFunction) JumpAddress;  /* 跳轉到 APP */  Jump_To_Application(); }}
APP 工程配置APP 的工程需要進行一些配置,以MDK為例,如下圖所示,APP 程序存放的 FLASH 地址為 0x8010000,大小為 0x30000。

APP程序代碼需要進行如下配置:

修改APP 內部 Flash 向量表重定位SCB->VTOR

APP運行后,初始化函數中,開啟中斷,否則程序會運行異常

正常來說,在啟動文件中執行調用 SystemInit() 函數,這個函數會配置 Flash 的接口信息。SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET。

修改宏定義 VECT_TAB_OFFSET 的值為 0x10000。

APP程序啟動之后,需要先使能全局中斷,可將下邊的代碼放在初始化的地方:

/* 使能中斷 */__enable_irq();
最后設備運行期間,APP 在運行處理業務功能。如果要升級 APP ,需要從 APP 切換到 BootLoader 中。

那么,如何實現 APP 跳轉到 BootLoader 呢?有兩種方法:

硬件方式,設備斷電重啟或復位按鍵

軟件方式,通過軟件控制復位MCU

軟件方式,可以在APP代碼中添加控制指令,當APP接收到跳轉指令(或者升級指令))后,復位 MCU。如下代碼可以復位MCU:

/* 復位芯片 */HAL_NVIC_SystemReset();
審核編輯:湯梓紅

標簽:

上一篇:無穩態多諧振蕩器電路圖 多諧振蕩電路解析
下一篇:最后一頁