RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)

备注:RT_Thread 版本为V4.0.2, 使用芯片型号为STM32F407VGT6,基于官方例程中stm32f407_st_discovery例程实现。

目录

  • 第一部分(片内FLASH)
    • 一、Kconfig配置
    • 二、menuconfig配置
    • 三、CubMX引脚配置
    • 四、工程内部配置
  • 第二部分(片外FLASH W2Q128)
    • 一、menuconfig配置
    • 二、CubeMx配置
    • 三、工程内部配置

第一部分(片内FLASH)

一、Kconfig配置

因为FAL需要Flash支持,所以要添加如下代码,到board下的kconfig中

	menuconfig BSP_USING_ON_CHIP_FLASH
		bool "Enable on-chip FLASH"
		default n

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第1张图片

二、menuconfig配置

在ENV中进入menuconfig配置界面

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第2张图片
1、进入 → Hardware Drivers Config → On-chip Peripheral Drivers选中Enable on-chip FLASH

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第3张图片

2、进入RT-Thread online packages → system packages选中 fal: Flash Abstraction Layer implement. Manage flash device and partition. —>

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第4张图片

3、进入 fal: Flash Abstraction Layer implement. Manage flash device and partition.中配置版本为最新版本

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第5张图片

4、保存配置后退出并生成新工程(我设置ENV工具退出后自动生成模式,如未设置ENV工具则手动生成工程即可。ENV工具使用配置链接.)

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第6张图片

三、CubMX引脚配置

在打开工程之前还有一步需要配置,即配置相关引脚,官方工程默认的串口USART1使用的是PB6,PB7根据自己电路板更改为适合自己使用的引脚。更改方法为进入stm32f407-st-discovery\board\CubeMX_Config,打开CubeMX配置,更改PA9,PA10(我的板子)为串口引脚,然后点击GENERATE CODE等待完成即可。注意:Cube生成的工程并不是我们要用的工程,我们只调用其生成的底层库。
官方默认配置:

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第7张图片
更改后:

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第8张图片

四、工程内部配置

1、打开project工程,并对target进行配置根据自己所用晶振进行修改:

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第9张图片
选中图中选项可以F12跳到定义:

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第10张图片
添加porting文件夹到工程,其包含fal_cfg.h,为fal配置文件其在stm32f407-st-discovery\packages\fal-v0.5.0\samples文件夹下:

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第11张图片
2、对fal_cfg.h文件进行适配修改

在fal_cfg.h中定义内部FLASH结束地址:

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第12张图片
修改 FAL_FLASH_DEV_TABLE 只保留片内flash参数:

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第13张图片
3、对drv_flash_f4.c进行适配修改

注释掉drv_flash_f4.c中关于具体页读写相关函数(若想要细分之后根据自己FLASH具体情况进行添加):

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第14张图片

4、添加官方例程,并进行适配性修改

官方例程所在位置:

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第15张图片

添加例程到程序中:

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第16张图片

删除多于程序(只保留图中程序),对其进行修改:

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第17张图片

5、最后添加fal_init()进行初始化,并编译工程,下载到芯片

初始化fal_init():

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第18张图片

下载后提示分区信息:

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第19张图片

第二部分(片外FLASH W2Q128)

在上面基础上进行的增加修改。

一、menuconfig配置

1、进入→ RT-Thread Components → Device Drivers配置SPI总线使能

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第20张图片

2、进入 online packages → system packages → fal: Flash Abstraction Layer implement. Manage flash device and partition.使能SFUD设备并更改设备名

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第21张图片

3、进入→ Hardware Drivers Config → On-chip Peripheral Drivers使能SPI总线

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第22张图片

4、进入Hardware Drivers Config → On-chip Peripheral Drivers → Enable SPI BUS使能SPI1总线

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第23张图片

5、保存配置后退出并生成新工程

二、CubeMx配置

1、更改PB3/PB4/PB5为SPI1的SCK/MISO/MOSI引脚(根据自己板子更改合适引脚)

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第24张图片

2、设置PB3/PB4/PB5引脚输出速度为非常高(这是一个坑,官方默认是低则会导致初始化外部flash失败)并重新生成工程

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第25张图片

三、工程内部配置

1、按第一部分四中第1步对工程target进行初步配置

2、修改fal_cfg.h(在第一部分基础上进行的修改)

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第26张图片

3、添加官方例程并进行适配性修改

官方例程所在位置:

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第27张图片

添加到工程中:

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第28张图片
添加程序将设备挂载到SPI总线上,并将其添加到自动初始化列表:

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第29张图片

// 注册 spi 设备
static int rt_hw_spi_flash_init(void)
{
	int err;
    __HAL_RCC_GPIOB_CLK_ENABLE();
    rt_hw_spi_device_attach("spi1", "spi10", GPIOB, GPIO_PIN_0);
    if (RT_NULL == rt_sfud_flash_probe(FAL_USING_NOR_FLASH_DEV_NAME, "spi10"))
    {
        return -RT_ERROR;
    };
    return RT_EOK;
	
}
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);

上述函数中rt_hw_spi_device_attach实现了spi10设备的注册,即将spi10挂载到spi1总线上,同时我们可以通过对spi10这个名字访问W25Q128设备。
rt_sfud_flash_probe是必须的,通过读取sfud信息,知道了它是一个spi flash设备,它的容量,擦写大小等。并将W25Q128设备的解析为块设备(Block Device)。

4、最后编译工程并下载到芯片

RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128)_第30张图片

你可能感兴趣的:(RT-Thread,FAL组件,嵌入式,物联网,rtos,flash)