参考在潘多拉上使用 SFUD 操做 Flash
及在 STM32F429 上应用文件系统web
SFUD 是一款开源的串行 SPI Flash 通用驱动库。因为现有市面的串行 Flash 种类居多,各个 Flash 的规格及命令存在差别, SFUD 就是为了解决这些 Flash 的差别现状而设计,让咱们的产品可以支持不一样品牌及规格的 Flash,提升了涉及到 Flash 功能的软件的可重用性及可扩展性,同时也能够规避 Flash 缺货或停产给产品所带来的风险。shell
在使用 SFUD 时候须要进行移植,能够参考文件 sfud/port/sfud_port.c。本篇文档将说明如何在智龙开板上使用 SFUD 操做 Flash文件系统,本文准备资料以下:app
这里使用 “spi10” , 进入msh ,用 "list_device"查看,可看到设备。如图所示。框架
驱动中添加代码以下 :svg
#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 组件提供,能够经过检查存储设备的读、写和擦除功能来判断存储设备的驱动程序是否正常。 若是像下图同样提示成功,所示则认为该驱动工做正常。若是没法经过测试,则须要检查驱动程序,使用逻辑分析仪对存储设备的接口波形进行分析。测试过程以下图:code
因为只有块设备类型的设备才能和文件系统对接,因此须要根据 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 挂载成功: