RT-Thread FAL 组件使用

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 --------------------------*/

按照提示:

  1. step1,在 board.h 里定义 #define BSP_USING_ON_CHIP_FLASH
  2. 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 FAL 组件使用)