STM32的开源Bootloader框架-RT-FOTA移植
简介
原仓库地址:基于STM32的开源Bootloader框架-RT-FOTA
这是一个基于 RT-Thread 的 STM32 bootloader,兼容 RTT 官方的 rbl 文件,即 RTT 官方的固件打包工具生成的压缩加密文件,具体的介绍可以参见STM32 通用 Bootloader。因为基于 RT-Thread 实时操作系统,此 bootloader 移植非常方便,且扩展性很强。
主要功能
- 支持RTT官方的RBL打包软件,使用方式也一致。目前支持包括CRC32、AES256、quicklz和fastlz功能;
- 支持命令行模式(FINSH组件)和出厂固件恢复;
- 支持FLASH分区(FAL组件);
- 支持功能扩展(RTT组件);
移植过程
参考
主要参考相关 RTT 组件的说明和 RT-FOTA 仓库的说明
硬件
STM32F407VET6
板载外设 | 备注 |
---|---|
UART1 | PA9\PA10 |
SPI1 FLASH(W25Q128) | PB3\PB4\PB5\PB14 |
BSP 制作
参考 STM32系列BSP制作教程完成制作
- 复制通用模板
- 使用 CubeMX 工具配置工程
- 修改 BSP 中的 Kconfig 文件
- 修改构建工程相关文件
- 重新生成工程
主要在 cubeMX 中修改晶振和频率配置,打开串口1和SPI1,并按照教程复制并替换频率配置代码,修改链接脚本中的 FLASH 大小和 RAM 大小,其中 FLASH 大小为512K,RAM大小为128K.
加入 travis CI
language: c
notifications:
email: false
branches:
only:
- master
before_script:
# travis has changed to 64-bit and we require 32-bit compatibility libraries
- sudo apt-get update
- "sudo apt-get -qq install gcc-multilib libc6:i386 libgcc1:i386 libstdc++5:i386 libstdc++6:i386 libsdl-dev scons || true"
- "[ $RTT_TOOL_CHAIN = 'sourcery-arm' ] && wget -q https://github.com/RT-Thread/toolchains-ci/releases/download/arm-2017q2-v6/gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2 && sudo tar xjf gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2 -C /opt && export RTT_EXEC_PATH=/opt/gcc-arm-none-eabi-6-2017-q2-update/bin && /opt/gcc-arm-none-eabi-6-2017-q2-update/bin/arm-none-eabi-gcc --version || true"
- export RTT_ROOT=${PWD}/rt-thread
- "[ x$RTT_CC == x ] && export RTT_CC='gcc' || true"
env:
- RTT_TOOL_CHAIN='sourcery-arm'
#stage: compile
script:
- scons -c
- scons -C .
加入徽标:
移植 FAL 组件
FAL (Flash Abstraction Layer) Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API (框架图如下所示),并具有以下特性:
- 支持静态可配置的分区表,并可关联多个 Flash 设备;
- 分区表支持自动装载 。避免在多固件项目,分区表被多次定义的问题;
- 代码精简,对操作系统 无依赖 ,可运行于裸机平台,比如对资源有一定要求的 Bootloader;
- 统一的操作接口。保证了文件系统、OTA、NVM(例如:EasyFlash) 等对 Flash 有一定依赖的组件,底层 Flash 驱动的可重用性;
- 自带基于 Finsh/MSH 的测试命令,可以通过 Shell 按字节寻址的方式操作(读写擦) Flash 或分区,方便开发者进行调试、测试;
使用 Env 打开 FAL 组件支持,注意勾选 SFUD 驱动
此时会强制打开 SFUD 驱动
重新生成工程,此时 SFUD 的移植文件fal_flash_sfud_port.c
已经自动加入工程,我们需要手动加入内部 FLASH 的驱动移植文件fal_flash_stm32f4_port.c
最后自定义fal_cfg.h
的内容,完成分区表的设置
/* ===================== Flash device Configuration ========================= */
extern const struct fal_flash_dev stm32f4_onchip_flash;
extern struct fal_flash_dev nor_flash0;
/* flash device table */
#define FAL_FLASH_DEV_TABLE \
{ \
&stm32f4_onchip_flash, \
&nor_flash0, \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE \
{ \
{FAL_PART_MAGIC_WROD, "app", "onchip_flash", 128 * 1024, 384 * 1024, 0}, \
{FAL_PART_MAGIC_WROD, "fm_area", FAL_USING_NOR_FLASH_DEV_NAME, 0, 1024 * 1024, 0}, \
{FAL_PART_MAGIC_WROD, "df_area", FAL_USING_NOR_FLASH_DEV_NAME, 1024 * 1024, 1024 * 1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */
#endif /* _FAL_CFG_H_ */
移植完成后可以使用相关的指令进行测试
加入 SignalLed 组件
SignalLed 是一个非常好用的LED指示组件,移植没有需要特别注意的地方,根据说明使用即可。
加入 ota_downloader 组件
此组件用于串口更新固件,主要用到ymodem_ota,其中注意需要修改一下#define DEFAULT_DOWNLOAD_PART
的定义,把它定义为默认要下载的分区。
加入 fastlz、quicklz、tinycrypt 组件
主要用于解压解密,直接加入即可。
测试
开机
进入命令模式
Ymodem 更新固件
fc
大佬好,我想在STM32H743上移植,但是按照这个方法实现不了,所以具体要在什么地方进行修改才能实现呢
datasheep
如果是移植,需要参考原RT-FOTA作者的仓库: https://gitee.com/spunky_973/rt-fota
fc
如果可以的话,我想把串口打印出来的信息发给你,你帮我看看哪里弄错了
datasheep
可以发我邮箱看看:jassyliu96@gmail.com