RT-Thread FAL 组件使用
2025-03-31 来源:jianshu
FAL 组件开源项目地址:https://gitee.com/RT-Thread-Mirror/fal/tree/master
FAL 组件是 RT-Thread 提供的一个操作 Flash 的抽象应用,与 RT-Thread 无依赖,可以裸机使用,EasyFlash 就是在此基础上运行的。
以下介绍如何通过 RT-Thread Studio 来使用 FAL 组件。
首先在设置文件中打开 FAL 组件,并勾选“ FAL 使用 SFUD 驱动程序”,这样就可以使用 SFUD 来帮助驱动 Flash 芯片。

image.png
打开 board.h ,找到下述段落
/*-------------------------- ON_CHIP_FLASH CONFIG BEGIN --------------------------*//** if you want to use on chip flash you can use the following instructions. * * STEP 1 define macro related to the on chip flash * such as BSP_USING_ON_CHIP_FLASH * * STEP 2, modify your stm32xxxx_hal_config.h file to support on chip flash peripherals. define macro related to the peripherals * such as #define HAL_FLASH_MODULE_ENABLED * */#define BSP_USING_ON_CHIP_FLASH/*-------------------------- ON_CHIP_FLASH CONFIG END --------------------------*/
按照提示:
step1,在 board.h 里定义 #define BSP_USING_ON_CHIP_FLASH
step2,在 stm32xxxx_hal_config.h 里定义 #define HAL_FLASH_MODULE_ENABLED
最基本的配置好了,如何使用 FAL 组件呢?
这就涉及到了三个重要文件,用于定义设备表和分区表。
FAL 组件的提供了三个示例文件,fal_cfg.h,fal_flash_sfud_port.c,fal_flash_stm32f2_port.c,想要使用 FAL,就必须更改上述文件构建自己的分区表。
片上 Flash
fal_flash_stm32f2_port.c 主要是定义片上 Flash 的,这个 RT-Thread 提供了相应的驱动,在 ./rt-thread/bsp/stm32/libraries/HAL_Drivers/drv_flash 里都有,我使用的是 drv_flash_f1.c 。
外部 Flash
fal_flash_sfud_port.c 是用于定义外部 Flash,许多人就是在这里无法配置成功。以下是我踩过的一些坑。
不要相信 FAL_USING_NOR_FLASH_DEV_NAME 这个宏定义,因为 FAL 组件提供的示例中使用该宏定义初始化的,所有我们一般都会默认地修改宏定义的内容为自己的芯片型号,但往往就不能初始化成功。不如直接使用,也就是在下图两个框内处使用。

image.png
当然,使用该设备之前,需要用 RTT 的 SPI 设备框架将 Flash 设备挂在到 SPI 总线上,参考 RT-Thread SPI 设备使用 。
// 注册 spi 设备static int rt_hw_spi_flash_init(void){
__HAL_RCC_GPIOC_CLK_ENABLE();
rt_hw_spi_device_attach('spi1', 'spi10', GPIOC, GPIO_PIN_0);
if (RT_NULL == rt_sfud_flash_probe('W25Q64', 'spi10'))
{
return -RT_ERROR;
};
return RT_EOK;}INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);设备表 分区表
设备表和分区表是在 fal_cfg.h 里定义的。
设备表/* ===================== Flash device Configuration ========================= */extern const struct fal_flash_dev stm32_onchip_flash;extern struct fal_flash_dev nor_flash0;/* flash device table */#define FAL_FLASH_DEV_TABLE
{
&stm32_onchip_flash,
&nor_flash0,
}设备表的里的设备名称必须与之前定义的一致,否则会报错。设备名称可以在前面两个文件里找到。
分区表/* ====================== Partition Configuration ========================== */#ifdef FAL_PART_HAS_TABLE_CFG/* partition table */#define FAL_PART_TABLE
{
{FAL_PART_MAGIC_WORD, 'bl', 'onchip_flash', 0, 64*1024, 0},
{FAL_PART_MAGIC_WORD, 'app', 'onchip_flash', 64*1024, 510*1024, 0},
{FAL_PART_MAGIC_WORD, 'easyflash', 'W25Q64', 0, 1024*1024, 0},
{FAL_PART_MAGIC_WORD, 'download', 'W25Q64', 1024*1024, 2*1024*1024, 0},
}#endif /* FAL_PART_HAS_TABLE_CFG */分区表定义可参考下图,我们主要关注的是后面 4 部分,
分区表名称不能重复
设备名称必须与设备表里定义设备的名称一致(.name参数)
分区表相对设备的起始地址
该分区表的大小,以字节为单位。

image.png
片上系统的分区表大小不一定是以字节为单位,这是因为 board.h 里的定义导致的,参考下图,以 1KB 为单位。

image.png
为了一致性,可以将 STM32_FLASH_SIZE 定义为 ((512 * 1024)) 。

image.png
好了,下载可以下载到板子上,输入 fal probe 即可看见分区表信息。

image.png
最终在 main.c 里调用 fal_init() 初始化即可。
上一篇:旋转编码器(霍尔正交波形)
- 深化生态布局:纳芯微与RT-Thread睿赛德达成战略合作,共筑自主可控实时控制MCU/DSP体系
- 基于RT-Thread的物联网温控箱简易实现与技术集锦
- RT-Thread nano在STM32F103上的移植指南
- STM32与ROS通信:RT-Thread与rosserial的集成实践
- STM32 CM3/CM4 ------ startup.s 启动文件分析 ------ GCC RT-Thread Studio 版本
- RT-Thread Studio使用——创建工程并配置外部时钟
- 揭秘RT-Thread上的AUTOSAR CP系统
- 人形机器人敏捷开发新路径:RT-Thread以软件底座破解复杂系统难题
- 基于rt-thread studio实现lwip协议
- RT-Thread 移植 EasyFlash
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析




