主控:STM32F407VET6
環境:RT-Thread Studio ,STM32CubeMX, ENV,RT-Thread v.4.0.2
概述:通過Studio創建芯片對應的內核工程,添加軟件包,修改配置文件,在線生成對應的RT-Boot,實現OTA固件升級
一. 創建RT-Thread內核工程
根據自己的芯片和外設創建RTT內核工程
進入工程后,查看RT-Thread Setting ,可以發現串口功能已經配置好,
修改main函數,看看系統是否能跑起來
🔨編譯,下載到板子,STM32F4系列默認下載地址0x08000000
(LOG_D打印日志,可以i打印指定內容並輸出文件位置與系統時鍾的信息)
二、制作Bootloader
官方在線制作網址:http://iot.rt-thread.com/#/addBootloader
制作好之后將RT-Boot.bin燒寫到片內flash的首地址0x0800 0000
三、制作app固件
本小節介紹如何使用 stm32 系列的 BSP 制作一個可以用於 OTA 升級的,包含 OTA 下載器功能 app 固件。
制作該 app 固件有如下三個步驟:
- 為 BSP 添加下載器功能,下載需要的軟件包並修改 FAL 分區表
- 修改 stm32 BSP 中斷向量表跳轉地址
- 修改 BSP 鏈接腳本
1、添加下載器功能
本小節介紹如何將下載器功能添加到 app 固件中。
添加該功能需要使用 env 工具
下載 ota_downloader 軟件包,選中 Ymodem 功能與下載調試功能,保存后,fal分區功能自動添加到軟件包
也可以通過studio的軟件包圖形界面配置軟件包
2. 配置 FAL 分區
本小節將講述如何初始化 FAL 組件,並修改 FAL 分區表。
本次制作的 app
固件將附帶下載器功能,下載器會將固件下載到 download
分區
download
分區的地址為 0x8020000,而 app
分區的地址為 0x8040000。
3. 初始化 FAL
由於 FAL 組件會被 ota_downloader 軟件包自動選中,因此直接添加 FAL 組件的初始化代碼即可。
1) 在main函數中添加fal初始化代碼,添加版本打印,修改中斷向量表的跳轉基地址

1 /* 2 * Copyright (c) 2006-2019, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2019-09-09 RT-Thread first version 9 */ 10 11 #include <rtthread.h> 12 #include <board.h> 13 #include <rtdevice.h> 14 15 16 #define DBG_TAG "main" 17 #define DBG_LVL DBG_LOG 18 #include <rtdbg.h> 19 20 #include "fal.h" 21 22 #define APP_VERSION "1.0.0" 23 24 /* PLEASE DEFINE the LED0 pin for your board, such as: PA5 */ 25 #define LED0_PIN GET_PIN(E, 3) 26 27 int main(void) 28 { 29 int count = 1; 30 /* set LED0 pin mode to output */ 31 rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); 32 33 fal_init(); 34 35 rt_kprintf("The current version of APP firmware is %s\n", APP_VERSION); 36 37 while (count++) 38 { 39 /* set LED0 pin level to high or low */ 40 rt_pin_write(LED0_PIN, count % 2); 41 //LOG_D("Hello RT-Thread!"); 42 rt_thread_mdelay(1000); 43 } 44 45 return RT_EOK; 46 } 47 48 /** 49 * Function ota_app_vtor_reconfig 50 * Description Set Vector Table base location to the start addr of app(RT_APP_PART_ADDR). 51 */ 52 static int ota_app_vtor_reconfig(void) 53 { 54 #define NVIC_VTOR_MASK 0x3FFFFF80 55 /* Set the Vector Table base location by user application firmware definition */ 56 SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK; 57 58 return 0; 59 } 60 INIT_BOARD_EXPORT(ota_app_vtor_reconfig);
2) 修改 fal_cfg.h
文件中的分區表,使分區表中 download 分區的起始地址和大小與 Bootloader 中的 download 分區一致。
注意:如果 BSP 中沒有該頭文件,可以在該 BSP 目錄下 /packages/fal-latest/samples/porting
中復制一份進行修改,其中分區地址和大小是根據實際 bootloader 中定義的大小進行設置。下圖中標記處了可能需要修改的地方,請根據個人實際情況進行修改。

1 /* 2 * Copyright (c) 2006-2018, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0D 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2018-12-5 SummerGift first version 9 */ 10 11 #ifndef _FAL_CFG_H_ 12 #define _FAL_CFG_H_ 13 14 #include <rtthread.h> 15 #include <board.h> 16 17 #define RT_APP_PART_ADDR 0x08040000 //app begin address 18 19 #define FLASH_SIZE_GRANULARITY_16K (4 * 16 * 1024) 20 #define FLASH_SIZE_GRANULARITY_64K (64 * 1024) 21 #define FLASH_SIZE_GRANULARITY_128K (7 * 128 * 1024) 22 23 #define STM32_FLASH_START_ADRESS_16K STM32_FLASH_START_ADRESS 24 #define STM32_FLASH_START_ADRESS_64K (STM32_FLASH_START_ADRESS_16K + FLASH_SIZE_GRANULARITY_16K) 25 #define STM32_FLASH_START_ADRESS_128K (STM32_FLASH_START_ADRESS_64K + FLASH_SIZE_GRANULARITY_64K) 26 27 extern struct fal_flash_dev stm32_onchip_flash_16k; 28 extern struct fal_flash_dev stm32_onchip_flash_64k; 29 extern struct fal_flash_dev stm32_onchip_flash_128k; 30 31 /* flash device table */ 32 #define FAL_FLASH_DEV_TABLE \ 33 { \ 34 &stm32_onchip_flash_16k, \ 35 &stm32_onchip_flash_64k, \ 36 &stm32_onchip_flash_128k, \ 37 } 38 /* ====================== Partition Configuration ========================== */ 39 #ifdef FAL_PART_HAS_TABLE_CFG 40 41 /* partition table */ 42 #define FAL_PART_TABLE \ 43 { \ 44 {FAL_PART_MAGIC_WROD, "download", "onchip_flash_128k", 0 , (128 * 1024) , 0},\ 45 {FAL_PART_MAGIC_WROD, "app", "onchip_flash_128k", (1*128*1024) , FLASH_SIZE_GRANULARITY_128K - (128 * 1024), 0},\ 46 } 47 48 #endif /* FAL_PART_HAS_TABLE_CFG */ 49 #endif /* _FAL_CFG_H_ */
4. 修改 app 固件配置
由於 app
分區的起始地址為 0x08040000
,app
固件如果想運行在該地址,就需要修改鏈接腳本和中斷向量的跳轉地址
5. 編譯一下,報錯
未定義錯誤,看看那幾個東西在哪里出現過,根據文件夾的包含關系
fal_flash.c ——> fal.h ——> fal_cfg.h ——> extern struct fal_flash_dev stm32_onchip_flash_16k;
——>extern struct fal_flash_dev stm32_onchip_flash_64k;
——>extern struct fal_flash_dev stm32_onchip_flash_128k;
這三個結構體被聲明為外部變量,在編譯的時候,編譯器會去其他文件尋找定義,我們將工程文件導入source insight工程查找一下。發現在driver目錄下的dr v_flash_f4.c中定義,
明明定義了,為什么會顯示未定義錯誤,內容顯示灰色。說明此部分內容外部頭文件包含進去
BSP_USING_ON_CHIP_FLASH未定義,導致以下內容失效。
因為在配置軟件包時,並沒有配置on_chip_flash,studio生成的工程目錄下的config文件中沒有on_chipflash,
在rtconfig.h中添加這個宏定義
定義保存后,編譯解決,但是又出現新的問題
類型沖突
進入drv_flash_f4.c,
變量被定義為const類型,只能在模塊內引用,但是fal_cfg.h中,聲明變量是外部變量,要去引用,由此報錯,去掉const即可
重新編譯,成功
將RT-Boot燒寫到flash后,燒入RTT,運行
打包 app 固件
本小節講述如何使用 RT-Thread OTA 固件打包器對 app 固件進行打包,制作可以被下載到 download 分區的升級固件。固件打包工具可以在 ota_downloader 軟件包下的 tools 文件夾內找到
在對固件進行打包操作前,先修改 、main.c
中 APP_VERSION 宏的值為 2.0.0 作為參照,然后重新編譯一遍生成新的 rtthread.bin 文件,修改內容如下圖所示,不要下載,不要下載
執行 OTA
Ymodem 升級固件
詳見鏈接文檔