参考在潘多拉上使用 SFUD 操作 Flash
及在 STM32F429 上应用文件系统
SFUD 是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多,各个 Flash 的规格及命令存在差异, SFUD 就是为了解决这些 Flash 的差异现状而设计,让我们的产品能够支持不同品牌及规格的 Flash,提高了涉及到 Flash 功能的软件的可重用性及可扩展性,同时也可以规避 Flash 缺货或停产给产品所带来的风险。
在使用 SFUD 时候需要进行移植,可以参考文件 sfud/port/sfud_port.c。本篇文档将说明如何在智龙开板上使用 SFUD 操作 Flash文件系统,本文准备资料如下:
这里使用 “spi10” , 进入msh ,用 "list_device"查看,可看到设备。如图所示。
驱动中添加代码如下 :
#ifdef RT_USING_SPI1
{
static struct rt_spi_device spi_device0;
static struct rt_spi_device spi_device1;
static struct rt_spi_device spi_device2;
static struct ls1c_spi_cs spi_cs10;
static struct ls1c_spi_cs spi_cs11;
static struct ls1c_spi_cs spi_cs12;
/* spi10: CS0 w25Q256*/
spi_cs10.cs = LS1C_SPI_CS_0;
rt_spi_bus_attach_device(&spi_device0, "spi10", "spi1", (void*)&spi_cs10);
spi_cs11.cs = LS1C_SPI_CS_1;
rt_spi_bus_attach_device(&spi_device1, "spi11", "spi1", (void*)&spi_cs11);
spi_cs12.cs = LS1C_SPI_CS_2;
rt_spi_bus_attach_device(&spi_device2, "spi12", "spi1", (void*)&spi_cs12);
}
#endif
这部分内容在初始的工程中已经配好。 如图所示。
注意要将文件系统的最大sector修改为4096。如图所示。
其余的配置请参考上面的官网文档。
开启 SPI 设备驱动, 在 RT-Thread Components → Device Drivers 界面中选中 Using Serial Flash Universal Driver 选项,如图所示。
为了确保该驱动工作正常,可以使用 sf 命令对该设备做 benchmark 测试。该功能由 sfud 组件提供,可以通过检查存储设备的读、写和擦除功能来判断存储设备的驱动程序是否正常。 如果像下图一样提示成功,所示则认为该驱动工作正常。如果无法通过测试,则需要检查驱动程序,使用逻辑分析仪对存储设备的接口波形进行分析。测试过程如下图:
由于只有块设备类型的设备才能和文件系统对接,所以需要根据 SPI Device 找到 SPI Flash 设备,并创建与其对应的 Block Device。
这里需要使用到万能 SPI Flash 驱动库:SFUD ,RT-Thread 已经集成了该组件,在上面的配置过程中我们已经开启这个功能。此时只需要使用 SFUD 提供的 rt_sfud_flash_probe 函数即可。该函数将执行如下操作:
根据名为 spi10 的 SPI Device 设备找到对应的 Flash 存储设备。
初始化 Flash 设备。
在 Flash 存储设备上创建名为 W25Q256 的 Block Device。
如果开启了组件自动初始化功能,该函数会被自动执行,否则需要手动调用运行。启动时自动加载,同时挂载到根目录的SPI目录下,代码如下 :
#ifdef RT_USING_SFUD
#include "spi_flash_sfud.h"
static int rt_hw_spi_flash_init(void)
{
if (RT_NULL == rt_sfud_flash_probe("W25Q256", "spi10"))
{
return -RT_ERROR;
};
return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
int mnt_init(void)
{
if (dfs_mount("W25Q256", "/spi", "elm", 0, 0) == 0)
{
rt_kprintf("W25Q256 mount successful!\n");
}
else
{
rt_kprintf("W25Q256 mount failed!\n");
}
return RT_EOK;
}
INIT_APP_EXPORT(mnt_init);
#endif
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVI8RON2-1590906220720)(figures/出现设备w25q256.png)]
由于第一次使用 spi flash, 没有文件系统存储设备, 会看到 spi flash mount to /spi failed! 的提示。这是因为此时在 SPI Flash 中还没有创建相应类型的文件系统,这就用到了创建文件系统 shell 命令:mkfs。
mkfs 命令的功能是在指定的存储设备上创建指定类型的文件系统。使用格式为:mkfs [-t type] device 。第一次挂载文件系统前需要使用 mkfs 命令在存储设备上创建相应的文件系统,否则就会挂载失败。如果要在 W25Q256 设备上创建 elm 类型的文件系统,就可以使用 mkfs -t elm W25Q256 命令,使用方法如下图:
重启后,W25Q256 挂载成功: