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 .

加入徽标:

Build Status

移植 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 更新固件

  • 分享:
评论
还没有评论
    发表评论 说点什么