為了能讓開發者快速掌握 OTA 升級這把利器,RT-Thread 開發團隊提供了通用的 Bootloader。開發者通過該 Bootloader 即可直接使用 RT-Thread OTA 功能,輕鬆實現對設備端固件的管理、升級與維護。
下圖展示了 RT-Thread 通用 Bootloader 的軟體框架:
RT-Thread 通用 Bootloader 有如下特點:
Bootloader 的主要功能是更新 app 分區中的固件。
通用 Bootloader 中的分區表包含如下三個分區:
分區名起始地址分區大小分區位置介紹app自定義自定義片內 Flash存儲 app 固件download自定義自定義片內 Flash 或者片外 SPI Flash存儲待升級固件factory自定義自定義片內 Flash 或者片外 SPI Flash存儲出廠固件
當系統需要升級固件時,Bootloader 將從 download 分區將固件搬運到 app 分區,主要功能流程如下所示:
Bootloader 工作過程如下圖所示:
當系統中的固件損壞,Bootloader 將從 factory 分區將固件搬運到 app 分區,主要功能流程如下所示:
Bootloader 可以通過網頁端在線生成的方式來獲取。開發者根據自己使用的晶片,填寫相關參數,然後點擊生成按鈕,即可在線生成 Bootloader。
Bootloader 在線獲取地址: http://iot.rt-thread.com
進入 Bootloader 生成頁面後,根據頁面提示填寫板卡參數,點擊生成固件按鈕即可在線自動生成 BootLoader,同時也會將生成的固件發送到用戶郵箱中。
下面提供一個示例配置以供參考,開發者則需要根據自己手中板卡的實際情況,勾選和填寫所需功能。
點擊生成按鈕後,等待大約一分鐘即可通過自動下載或者郵件的方式獲取定製的 Bootloader。
以 STM32F407ZGT6 晶片為例講述如何使用 J-Flash 工具燒錄 bootloader.bin 到開發板中,操作步驟如下:
固件燒錄成功後會自動運行 Bootloader,列印出 RT-Thread 的 logo。
以下介紹如何使用 ST-LINK Utility 工具燒錄 bootloader.bin 到開發板中,這需要配合 ST-LINK 進行燒寫,操作步驟如下所示:
本小節介紹如何使用 stm32 系列的 BSP 製作一個可以用於 OTA 升級的,包含 OTA 下載器功能 app 固件。
接下來的示例中所用的 BSP 路徑為 stm32/stm32f407-atk-explorer。
固件中使用的分區表如下所示:
分區名起始地址分區大小分區位置app0x8040000128k片內 Flashdownload0x8020000128k片內 Flashfactory0x8060000128k片內 Flash
製作該 app 固件有如下三個步驟:
在後面的章節中,將按照上述步驟來製作 app 固件。
本小節介紹如何將下載器功能添加到 app 固件中。
添加該功能需要使用 env 工具,本次下載的軟體包在 iot 類別中,需要按照如下步驟操作:
註:如果 BSP 沒有該選項,則需要手動在 board 文件夾的 Kconfig 添加下面定義,保存,然後重新進入 menuconfig 即可。
config BSP_USING_ON_CHIP_FLASH bool &34; default n
本小節將講述如何初始化 FAL 組件,並修改 FAL 分區表。開發者需要對 FAL 進行簡單入門,無需移植,只需要了解如何配置即可,詳細內容可參考 官方文檔。
本次製作的 app 固件將附帶下載器功能,下載器會將固件下載到 download 分區。根據第 4 章開始時的分區表可知,download 分區的地址為 0x8020000,而 app 分區的地址為 0x8040000。
由於 FAL 組件會被 ota_downloader 軟體包自動選中,因此直接添加 FAL 組件的初始化代碼即可。
注意:如果 BSP 中沒有該頭文件,可以在該 BSP 目錄下 /packages/fal-latest/samples/porting 中複製一份進行修改,其中分區地址和大小是根據實際 bootloader 中定義的大小進行設置。下圖中標記處了可能需要修改的地方,請根據個人實際情況進行修改。
由於 app 分區的起始地址為 0x08040000,app 固件如果想運行在該地址,就需要修改連結腳本和中斷向量的跳轉地址。
首先在 main.c 文件中添加如下代碼,這段代碼的功能是重新設定中斷向量跳轉地址為 app 分區的地址。
/** * Function ota_app_vtor_reconfig * Description Set Vector Table base location to the start addr of app(RT_APP_PART_ADDR).*/static int ota_app_vtor_reconfig(void){ #define NVIC_VTOR_MASK 0x3FFFFF80 /* Set the Vector Table base location by user application firmware definition */ SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK; return 0;}INIT_BOARD_EXPORT(ota_app_vtor_reconfig);
然後在 main 函數中添加版本信息列印,如下圖所示:
直接點擊下載程序,固件就會被燒錄到 app 分區。Bootloader 啟動後將跳轉到 app 分區運行,實驗效果如下圖所示:
可以看到串口輸出的信息 The current version of APP firmware is 1.0.0,即當前固件的版本為 1.0.0 。
本小節講述如何使用 RT-Thread OTA 固件打包器對 app 固件進行打包,製作可以被下載到 download 分區的升級固件。固件打包工具可以在 ota_downloader 軟體包下的 tools 文件夾內找到。
固件打包器提供三種固件壓縮方式:fastlz、quicklz 和 gzip,一種固件加密方式 AES256。開發者可以根據實際需求選擇合適的加密壓縮方式。
使用 Ymodem 協議升級固件時,推薦使用 Xshell 終端。
在 msh 命令行中輸入 ymodem_ota 命令後,點擊滑鼠右鍵,然後在菜單欄找到用 YMODEM 發送選項發送文件,如下圖所示:
接下來升級固件就會通過 Ymodem 的方式被下載到 download 分區。
固件被下載到 download 分區後,系統會自動重啟,執行 OTA 升級。
升級完畢後可以看到如下效果:
串口輸出信息為 The current version of APP firmware is 2.0.0 ,說明固件已經被升級到 2.0.0 版本了。
HTTP/HTTPS 固件升級是另外一種固件下載方式,製作下載器時如果開啟了系統中的網絡驅動,即可使用此種方式下載固件。具體步驟與 Ymodem 升級固件 小節大體一致。以下是配置截圖:
在終端輸入 http_ota http://xxx/xxx/rtthreadf.rbl 命令,系統將會從連結 http://xxx/xxx/rtthreadf.rbl` 處下載固件到 download 分區,之後系統會自動重啟,執行 OTA 升級程序。
在生成頁面中選中了 恢復出廠固件引腳 功能後,即開啟了出廠固件恢復功能。開發者可以將製作好的 app 固件燒錄至 factory 分區中,在系統啟動前按下恢復出廠固件引腳(可選擇一個或者兩個引腳作為固件恢復觸發引腳)並保持 10S,即可從 factory 分區中恢復出廠固件到 app 分區中。
恢復出廠按鍵引腳配置如下:
factory 分區的配置如下所示:
按照上圖的配置,factory 分區被設置為從片內 Flash 首地址偏移 0x60000 的位置開始,大小為 128KB,想要使用固件恢復功能,則需要將可用的 app 固件燒錄到該分區中,固件恢復過程如下圖所示: