W25Q128在RTT下的文件系统
参考:RT_thread挂载W25Q文件系统; RT_Thread基于STM32F407 FAL组件使用(片内FLASH+W25Q128
因为要做TFTP的验证测试,先要在板子上实现文件系统,所以就对W25Q128进行在RTT下的文件系统移植。
当按照RT-Thread中使用SPI操作FLASH(W25Q128),并在W25Q128上挂载文件系统操作后出现了以下错误
然而这个问题并不是如https://github.com/MrShuimitao/RT-Thread-stm32f769-qspi中所说,SFUD_FLASH_EXT_INFO_TABLE不支持;实际情况是,SPI2上挂载了3个设备(2个ADE7913,还有W25Q128),在APP中用到了ADE7913而没有用到W25Q128,在BOOT中仅去掉ADE7913的驱动还不行,当将2个ADE7913的CS引脚设置成输出且置高之后,W25Q128可以识别但是还是挂载失败:
后经指点挂载函数的时机不对,当将INIT_COMPONENT_EXPORT(dfs_mount_init);改用NIT_ENV_EXPORT(dfs_mount_init);后就成功了
同时对于SPI设备,不需要显式将Fnxx_hal_msp.c中的HAL_SPI_MspInit()拷贝到board.c,因为这个已经通过__weak进行调用路径说明了,只需要将Fnxx_hal_msp.c加到工程下即可调用。
同时关于SPI的MSB/LSB maser/slave, mode0~3,SPI-CLK等参数也不是非得调用rt_spi_configure(&pspi_dev, &spicfg)进行参数设置,默认也是可以得。
0XEF13,表示芯片型号为W25Q80
0XEF14,表示芯片型号为W25Q16
0XEF15,表示芯片型号为W25Q32
0XEF16,表示芯片型号为W25Q64
0XEF17,表示芯片型号为W25Q128
0XEF18,表示芯片型号为W25Q256
W25Q80挂载文件系统要注意:被挂载的分区的容量不能小于128*最小擦除单位(4096B)=512K否则MKFS格式化文件系统时会失败,跟踪发现返回FR_MKFS_ABORTED错误:
“4096扇区,挂载成FAT,要格式化成功,至少要800KB以上。
且还要修改格式化参数。所以建议4MB以下的FLASH不要用FAT,用littlefs”
同时因为dfs_mkfs只需要操作一次,一般第一次操作芯片会挂载失败进入else分支,进行格式化,重启后下一次就成功了(如果系统严重依赖文件系统必须软件显式软重启);但是还是有偶尔重启还会失败(这对批量烧写很是个问题),但在格式化后再挂载失败几率就大大减少。

1 int dfs_mount_init(void) 2 { 3 uint8_t tmp =0; 4 struct fal_blk_device *blk_dev; 5 /* fal init */ 6 fal_init(); 7 /* create block device */ 8 blk_dev = (struct fal_blk_device *) fal_blk_device_create(FS_PARTITION_NAME); 9 if (blk_dev == RT_NULL) 10 rt_kprintf("Can't create a block device on '%s' partition.\n", FS_PARTITION_NAME); 11 else 12 rt_kprintf("Create a block device successful on the %s partition of flash .\n", FS_PARTITION_NAME); 13 14 if (dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == 0) 15 { 16 rt_kprintf("mount %s OK\r\n", FS_PARTITION_NAME); 17 } 18 else 19 { 20 //mkfs("elm", FS_PARTITION_NAME); 21 dfs_mkfs("elm",FS_PARTITION_NAME); 22 if (dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == 0)/*减少靠重启挂载失败几率*/ 23 { 24 rt_kprintf("mount %s OK\r\n", FS_PARTITION_NAME); 25 }else{ 26 rt_kprintf("mount failed so reset mcu!\r\n");/*2次挂载失败就重启*/ 27 rt_hw_cpu_reset(); 28 } 29 } 30 return RT_EOK; 31 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2017-08-28 模拟器件之晶体三极管
2017-08-28 电源芯片:
2017-08-28 模拟器件之三极管场效应管
2017-08-28 模拟器件之二极管