
本期話題:
(相關資料圖)
現在越來越多的嵌入式設備支持遠程自動升級,不需要再借助下載器。這樣對于設備的維護非常方便。當然若使設備支持遠程升級,需要編寫支持升級的程序代碼,可以稱之為 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();審核編輯:湯梓紅
標簽: