备注:RT_Thread 版本为V4.0.2, 使用芯片型号为STM32F407VGT6,基于官方例程中stm32f407_st_discovery例程实现。
因为FAL需要Flash支持,所以要添加如下代码,到board下的kconfig中
menuconfig BSP_USING_ON_CHIP_FLASH
bool "Enable on-chip FLASH"
default n
在ENV中进入menuconfig配置界面
1、进入 → Hardware Drivers Config → On-chip Peripheral Drivers选中Enable on-chip FLASH
2、进入RT-Thread online packages → system packages选中 fal: Flash Abstraction Layer implement. Manage flash device and partition. —>
3、进入 fal: Flash Abstraction Layer implement. Manage flash device and partition.中配置版本为最新版本
4、保存配置后退出并生成新工程(我设置ENV工具退出后自动生成模式,如未设置ENV工具则手动生成工程即可。ENV工具使用配置链接.)
在打开工程之前还有一步需要配置,即配置相关引脚,官方工程默认的串口USART1使用的是PB6,PB7根据自己电路板更改为适合自己使用的引脚。更改方法为进入stm32f407-st-discovery\board\CubeMX_Config,打开CubeMX配置,更改PA9,PA10(我的板子)为串口引脚,然后点击GENERATE CODE等待完成即可。注意:Cube生成的工程并不是我们要用的工程,我们只调用其生成的底层库。
官方默认配置:
1、打开project工程,并对target进行配置根据自己所用晶振进行修改:
添加porting文件夹到工程,其包含fal_cfg.h,为fal配置文件其在stm32f407-st-discovery\packages\fal-v0.5.0\samples文件夹下:
在fal_cfg.h中定义内部FLASH结束地址:
修改 FAL_FLASH_DEV_TABLE 只保留片内flash参数:
注释掉drv_flash_f4.c中关于具体页读写相关函数(若想要细分之后根据自己FLASH具体情况进行添加):
4、添加官方例程,并进行适配性修改
官方例程所在位置:
添加例程到程序中:
删除多于程序(只保留图中程序),对其进行修改:
5、最后添加fal_init()进行初始化,并编译工程,下载到芯片
初始化fal_init():
下载后提示分区信息:
在上面基础上进行的增加修改。
1、进入→ RT-Thread Components → Device Drivers配置SPI总线使能
2、进入 online packages → system packages → fal: Flash Abstraction Layer implement. Manage flash device and partition.使能SFUD设备并更改设备名
3、进入→ Hardware Drivers Config → On-chip Peripheral Drivers使能SPI总线
4、进入Hardware Drivers Config → On-chip Peripheral Drivers → Enable SPI BUS使能SPI1总线
5、保存配置后退出并生成新工程
1、更改PB3/PB4/PB5为SPI1的SCK/MISO/MOSI引脚(根据自己板子更改合适引脚)
2、设置PB3/PB4/PB5引脚输出速度为非常高(这是一个坑,官方默认是低则会导致初始化外部flash失败)并重新生成工程
1、按第一部分四中第1步对工程target进行初步配置
2、修改fal_cfg.h(在第一部分基础上进行的修改)
3、添加官方例程并进行适配性修改
官方例程所在位置:
添加到工程中:
添加程序将设备挂载到SPI总线上,并将其添加到自动初始化列表:
// 注册 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、最后编译工程并下载到芯片