使用RT-Thread Studio移植RT-Thread & 制作STM32通用BootLoader


主控: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

官方文檔:制作STM32通用Bootloader

制作好之后將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);
main.c

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_ */
fal_cfg.h

 4.  修改 app 固件配置

由於 app 分區的起始地址為 0x08040000app 固件如果想運行在該地址,就需要修改鏈接腳本和中斷向量的跳轉地址

 

 

 

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 升級固件

詳見鏈接文檔

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM