Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
STM32F1
w25q128
文件系统
基于RT-Thread:W25Q128虚拟U盘与文件系统的自由切换
发布于 2022-05-19 17:24:34 浏览:2890
订阅该版
需求:将W25Q128部分空间搭载文件系统,并虚拟成U盘可通过USB连接至电脑实现文件拷贝 硬件:STM32F103ZET6 + W25Q128 说明:默认W25Q128已调通,可搭载文件系统 [RT-Thread:W25Q128虚拟U盘并搭载文件系统](https://blog.csdn.net/weixin_41738023/article/details/113446959) [RT-Thread:STM32F407虚拟U盘,无法识别拔出问题解决方案](https://blog.csdn.net/weixin_41738023/article/details/113442189) - 1、W25Q128分区 使用fal组件给spi flash 分区(如何分区见fal介绍),分区表如下,调试时usb_disk暂分4M空间 ![image.png](https://oss-club.rt-thread.org/uploads/20220519/a923171fc7575b1317983c248c839d0c.png) 注:每个分区的起始地址需要是1024的整数倍 ![image.png](https://oss-club.rt-thread.org/uploads/20220524/8bfcec490ca0612d42cac460c729a54f.png) - 2、在env中使能USB 使用menuconfig打开配置环境 ![image.png](https://oss-club.rt-thread.org/uploads/20220519/06c2cde332479872c9273ecf2eace9a3.png.webp) - 3、开启大容量存储设备 ![image.png](https://oss-club.rt-thread.org/uploads/20220519/2676ed1f33c5a5f0b3003a59b489c7fa.png.webp) 保存配置后,更新、编译工程,会发现工程多了usb相关文件,如下图: ![image.png](https://oss-club.rt-thread.org/uploads/20220519/750ae55bcf1118e382723dd1808ae53f.png) - 4、开启USB时钟 这一步注意一点USB时钟必须为48MHZ,使用STM32CubeMX配置 ![image.png](https://oss-club.rt-thread.org/uploads/20220519/6ab94f5d929391e0a714e7847ce07a6b.png.webp) ![image.png](https://oss-club.rt-thread.org/uploads/20220519/caeb91c6b8818ed68e58e1544937a2b8.png) 经过测试,事实上,上面两图中的USB以及USB DEVICE配置根本没用到,只需要配置好USB的时钟 ![image.png](https://oss-club.rt-thread.org/uploads/20220519/b9a8e80076360d7c358ac8cbe46f9235.png) ![image.png](https://oss-club.rt-thread.org/uploads/20220519/95eb5e7bf1874fed24523572d9914db3.png) - 5、工程修改 我这取消了函数stm_usbd_register()的自启动,把它放在了main函数里测试, ![image.png](https://oss-club.rt-thread.org/uploads/20220519/0e3205282f1076b95e01f9f2c8a90650.png) stm_usbd_register启动usbd线程大概流程如下: ![image.png](https://oss-club.rt-thread.org/uploads/20220519/f9c240cf251289eeb901466f43f45820.png) 编译工程无误后下载,运行程序得到如下所示: 可见usb_disk分区已被创建成Block Device且当前未被占用 ![image.png](https://oss-club.rt-thread.org/uploads/20220519/a6709d718835778f5a23aedb03b8bda4.png) 连接USB后,再次list_device,如下所示,发现usb_disk分区被USB占用 ![image.png](https://oss-club.rt-thread.org/uploads/20220519/ea5d37cd9929419ab4931a9b68e2c3d3.png) 且电脑成功识别到U盘,可在内创建文件 ![image.png](https://oss-club.rt-thread.org/uploads/20220519/5016a1a334d903a59ac11d19b7586e44.png) ![image.png](https://oss-club.rt-thread.org/uploads/20220519/ac42c710139d9589c16cb6b01356c5f2.png.webp) - 6、如何解除USB占用? 和电脑断开连接后,发现USB并未解除占用 ![image.png](https://oss-club.rt-thread.org/uploads/20220519/56a45b71ee299a221902e927a1e5ae88.png) 分析中断函数发现 ![image.png](https://oss-club.rt-thread.org/uploads/20220519/35375de1812af8f4d4fa5cc81533dfb8.png) ![image.png](https://oss-club.rt-thread.org/uploads/20220519/1be79181a6fc6e87965e31cb104f97cc.png) ![image.png](https://oss-club.rt-thread.org/uploads/20220519/6259472787a5e2f86ef62dde3411945d.png) 这里需要调用函数HAL_PCD_DisconnectCallback(hpcd),阅读代码发现该函数中已实现具体功能,流程如下图示: ![image.png](https://oss-club.rt-thread.org/uploads/20220519/24a6f1041e7f8539e396759c7940b7b6.png.webp) 注:第三步截图有误 最终会调用函数_function_disable(ufunction_t func)来解除占用 ![image.png](https://oss-club.rt-thread.org/uploads/20220519/e8dfba8abb92400df7b76eaf8a17b58b.png) 因此可以在解除占用后将文件系统挂载到usb_disk分区,如下图所示: ![image.png](https://oss-club.rt-thread.org/uploads/20220523/abd1e9c577e6d46bbf0a5ce08fd77189.png.webp) 注:我的工程中将elm挂载到usb_disk分区的根目录,系统启动时手动调用函数 int rt_spi_w25q128_init(void); ``` //w25q128初始化 int rt_spi_w25q128_init(void) { struct fal_blk_device *blk_dev; struct statfs elm_stat; //step1:给spi2总线上注册0号从设备,片选PB12 rt_hw_spi_device_attach(SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, GPIOB, GPIO_PIN_12); //step2:将W25Q128挂载到spi2总线上,设备名spi20 if (rt_sfud_flash_probe(W25Q_FLASH_NAME,"spi20")) { rt_kprintf("[D/w25q128]rt sfud flash probe success!\n"); } else { rt_kprintf("[E/w25q128]rt sfud flash probe failed!\n"); return RT_ERROR; } //step3:验证spi驱动以及W25Q128驱动是否正常 if (rt_device_find("W25Q128") != RT_NULL) { rt_kprintf("[D/w25q128]W25Q128 successfully mounted to bus spi2 \n"); } else { rt_kprintf("[E/w25q128]find W25Q128 failed!\n"); goto NEXT_STEP; } //step4:flash抽象层初始化,分区管理 fal_init(); //step5:创建块设备usb_disk blk_dev = (struct fal_blk_device *)fal_blk_device_create(USB_DISK_DEV_NAME); FLASH_MOUNT: //挂载elm到usb_disk分区根目录 "/" if(dfs_mount(USB_DISK_DEV_NAME, "/", "elm", 0, 0) == 0)//挂载elm文件系统到根目录 { rt_kprintf("[D/w25q128]elm fs mount to '/' success.\n"); } else { rt_kprintf("[E/w25q128]elm fs mount to '/' failed!\n"); //首次挂载文件系统需要将usb_disk分区格式化elm文件系统 if(dfs_mkfs("elm", USB_DISK_DEV_NAME) == 0) rt_kprintf("[D/w25q128]make elm fs success.\n"); goto FLASH_MOUNT; } //获取文件系统信息 if(statfs("/", &elm_stat) == 0) rt_kprintf("[D/w25q128]elm fs block size: %d, total blocks: %d, free blocks: %d.\n", elm_stat.f_bsize, elm_stat.f_blocks, elm_stat.f_bfree); NEXT_STEP: return RT_EOK; } ``` 为了方便操作,将文件系统挂载和卸载再次封装了一下 ``` //usb_disk分区挂载文件系统 void usb_disk_mount(void) { if(rt_device_find("usb_disk") != RT_NULL) { FLASH_MOUNT: /* mount elmfat file system to usb_disk */ if(dfs_mount("usb_disk", "/", "elm", 0, 0) == 0)//挂载文件系统到根目录 { rt_kprintf("[D/w25q128]elmfs mount to usb_disk '/' success.\n"); } else { rt_kprintf("[E/w25q128]elmfs mount to usb_disk '/' failed!\n"); /* make a elmfat format filesystem */ if(dfs_mkfs("elm", "usb_disk") == 0)//将usb_disk分区格式化elm文件系统 { rt_kprintf("[D/w25q128]make elmfs success.\n"); } goto FLASH_MOUNT; } } } //usb_disk分区卸载文件系统 void usb_disk_unmount(void) { if(rt_device_find("usb_disk") != RT_NULL) { /*卸载文件系统*/ if(dfs_unmount("/") == 0) { rt_kprintf("[D/w25q128]elmfs unmount success!\n"); } else { rt_kprintf("[E/w25q128]elmfs unmount failed!\n"); } } } ``` - 7、如何解除文件系统占用? 连接到电脑后,应立即卸载文件系统,再使能U盘功能。调用过程如下: ![image.png](https://oss-club.rt-thread.org/uploads/20220523/34416beb592cca0042ad6cec79558041.png) 到此即实现了U盘和文件系统的自由切换 ![image.png](https://oss-club.rt-thread.org/uploads/20220524/deb5a381baabf1ffdf60fbeb57024ede.png.webp)
9
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Panyh220213
rm -rf/*
文章
1
回答
1
被采纳
0
关注TA
发私信
相关文章
1
【文件系统】目录查询
2
文件系统Posix 接口 的close API疑问
3
dfs_mount挂载文件系统路径的路径必须为‘/’才能成功
4
SD卡连续读写文件报错
5
文件系统挂载断言机制
6
文件系统是否支持挂载NFS网络文件系统
7
文件系统挂载失败!!!
8
dfs_filesystem_lookup() 返回NULL
9
webnet 是否可以做全动态网页,使用内存池来加快速度
10
“文件系统装在表”报错
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
6
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部