Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
STM32F1
w25q128
文件系统
基于RT-Thread:W25Q128虚拟U盘与文件系统的自由切换
发布于 2022-05-19 17:24:34 浏览:2934
订阅该版
需求:将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空间  注:每个分区的起始地址需要是1024的整数倍  - 2、在env中使能USB 使用menuconfig打开配置环境  - 3、开启大容量存储设备  保存配置后,更新、编译工程,会发现工程多了usb相关文件,如下图:  - 4、开启USB时钟 这一步注意一点USB时钟必须为48MHZ,使用STM32CubeMX配置   经过测试,事实上,上面两图中的USB以及USB DEVICE配置根本没用到,只需要配置好USB的时钟   - 5、工程修改 我这取消了函数stm_usbd_register()的自启动,把它放在了main函数里测试,  stm_usbd_register启动usbd线程大概流程如下:  编译工程无误后下载,运行程序得到如下所示: 可见usb_disk分区已被创建成Block Device且当前未被占用  连接USB后,再次list_device,如下所示,发现usb_disk分区被USB占用  且电脑成功识别到U盘,可在内创建文件   - 6、如何解除USB占用? 和电脑断开连接后,发现USB并未解除占用  分析中断函数发现    这里需要调用函数HAL_PCD_DisconnectCallback(hpcd),阅读代码发现该函数中已实现具体功能,流程如下图示:  注:第三步截图有误 最终会调用函数_function_disable(ufunction_t func)来解除占用  因此可以在解除占用后将文件系统挂载到usb_disk分区,如下图所示:  注:我的工程中将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盘功能。调用过程如下:  到此即实现了U盘和文件系统的自由切换 
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
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
GD32
ADC
flashDB
编译报错
socket
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
12
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
xiaorui
3
个答案
3
次被采纳
winfeng
2
个答案
2
次被采纳
三世执戟
12
个答案
1
次被采纳
本月文章贡献
arthurly888
5
篇文章
2
次点赞
catcatbing
3
篇文章
5
次点赞
jinchanchan
3
篇文章
4
次点赞
lizimu
2
篇文章
9
次点赞
alight
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部