前言
- 硬件平台:stm32f407discovery。
- 分区定义:
通用bootloader包含三个分区,本次实验中按如下规则定义:
分区名 | 起始地址 | 分区大小 | 分区位置 | 介绍 |
---|---|---|---|---|
app | 0x8040000 | 128k | 片内 Flash | 存储 app 固件 |
download | 0x8020000 | 128k | 片内 Flash | 存储待升级固件 |
factory | 0x8060000 | 128k | 片内 Flash | 存储出厂固件 |
获取bootloader
Bootloader 在线获取地址: http://iot.rt-thread.com
-
登录
-
新建产品
-
进入固件升级模块
-
生成bootloader
a.根据芯片及板子参数填写硬件配置。
b.根据分区定义填写分区配置表。
c.配置加密加密和压缩,点击生成按钮,等待下载完成。
烧录bootloader
使用STM32 ST-LINK Utility。
- 打开bootloader文件
- 连接
- 烧录
- 验证
使用xshell,新建串口会话。
复位板子,可以看到串口日志,到此bootloader烧录完成。
APP生成
- 新建rtthread项目
- 添加相关功能
a.添加OTA软件包,使用Ymodem下载方式。
b.添加 BSP Flash 驱动。
默认没有找到Enable on-chip flash选项,根据参考资料,编辑F4_APP_Demo\rt-thread\components\drivers下的kconfig文件,添加如下代码:
config BSP_USING_ON_CHIP_FLASH
bool "Enable on-chip FLASH"
default n
c.重新启动Settings。
d.添加 BSP Flash 驱动。
-
编译工程
报错:没有fal_cfg.h。
添加fal_cfg.h至工程,复制packages\fal-v0.5.0\samples\porting下的fla_cfg.h至\packages\fal-v0.5.0\inc下.重新编译,报错如下,需修改fal_cfg.h。
修改后如下:#ifndef _FAL_CFG_H_ #define _FAL_CFG_H_ #include <rtconfig.h> #include <board.h> #define RT_APP_PART_ADDR 0x08040000 #define FLASH_SIZE_GRANULARITY_16K (4 * 16 * 1024) #define FLASH_SIZE_GRANULARITY_64K (1 * 64 * 1024) #define FLASH_SIZE_GRANULARITY_128K (7 * 128 * 1024) #define STM32_FLASH_START_ADRESS_16K STM32_FLASH_START_ADRESS #define STM32_FLASH_START_ADRESS_64K (STM32_FLASH_START_ADRESS_16K + FLASH_SIZE_GRANULARITY_16K) #define STM32_FLASH_START_ADRESS_128K (STM32_FLASH_START_ADRESS_64K + FLASH_SIZE_GRANULARITY_64K) /* ===================== Flash device Configuration ========================= */ extern const struct fal_flash_dev stm32_onchip_flash_16k; extern const struct fal_flash_dev stm32_onchip_flash_64k; extern const struct fal_flash_dev stm32_onchip_flash_128k; /* flash device table */ #define FAL_FLASH_DEV_TABLE \ { \ &stm32_onchip_flash_16k, \ &stm32_onchip_flash_64k, \ &stm32_onchip_flash_128k, \ } /* ====================== Partition Configuration ========================== */ #ifdef FAL_PART_HAS_TABLE_CFG /* partition table */ #define FAL_PART_TABLE \ { \ {FAL_PART_MAGIC_WORD, "download", "onchip_flash_128k", 0, 128*1024, 0}, \ {FAL_PART_MAGIC_WORD, "app", "onchip_flash_128k", 1*128*1024, FLASH_SIZE_GRANULARITY_128K - 128*1024, 0}, \ } #endif /* FAL_PART_HAS_TABLE_CFG */ #endif /* _FAL_CFG_H_ */
-
初始化 FAL及携带版本信息
-
修改 app 固件配置
由于 app 分区的起始地址为 0x08040000,app 固件如果想运行在该地址,就需要修改链接脚本和中断向量的跳转地址。
a.修改链接脚本。
b.修改中断向量表的跳转基地址为 0x8040000。
在 main.c 文件中添加如下代码,这段代码的功能是重新设定中断向量跳转地址为 app 分区的地址。
static int ota_app_vtor_reconfig(void) { #define NVIC_VTOR_MASK 0x3fffff80 SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK; return 0; } INIT_BOARD_EXPORT(ota_app_vtor_reconfig);
-
下载运行APP
串口打印出了版本信息,至此APP烧录至MCU完成。
打包固件
- 修改软件版本为2.0.0
#define APP_VER "2.0.0"
- 打包
打包器“rt_ota_packaging_tool.Exe”位于packages\ota_downloader-latest\tools\ota_packager下。
使用Ymodem进行OTA升级
使用xshell工具进行Ymodem。
- 配置Ymodem命令
首次使用需要配置Ymodem命令为”ymodem_ota”
- 传输文件
传输刚才打包完成的rtthread.rbl文件。
- OTA成功