使用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 升级固件

详见链接文档

 

posted @ 2020-05-14 12:40  朱果果  阅读(6945)  评论(0编辑  收藏  举报