前言
前面写了《RT-Thread使用——SPI驱动SD/TF卡挂载文件系统》这篇文章,本文在这篇文章的基础上,实现虚拟U盘,这样就可以方便地访问stm32写进SD卡中的文件了。
平台
芯片:STM32F405RGT6
RT-Thread版本:4.1.0(发行版)
硬件连接:SPI3连接SD卡,片选引脚PC2
配置ENV
- 添加USB组件,将设备作为大容量存储设备(MSC)
- 使能USB
对应的Kconfig设置如下
配置完成后,scons生成工程即可。
配置CubeMX
- 配置USB_OTG_FS,模式配置为Device_Only
- 设置为大容量存储设备类型
- 配置时钟,USB时钟频率为48MHz
配置完成后,生成工程。
添加代码
- 在CubeMX生成的工程中,复制main.c中的SystemClock_Config函数,并替换rt-thread工程中board.c中的SystemClock_Config函数。
- main函数中加入初始化文件系统的代码(详情参考之前的文章《RT-Thread使用——SPI驱动SD/TF卡挂载文件系统》)
if(dfs_elm_init() == RT_EOK)
{
rt_kprintf("[FS]dfs elm init ok\n");
}
配置到这里,直接编译并下载代码运行的话,USB连接电脑后,会报“disk open error”的错误
网上查了资料后,在这篇博文中找到了解决方向,即博文中所提到的“block只能被打开一次”。
解决的办法是在usb mstorage.c 的_function_enable函数那里在open前先做判断,如果已经open了,则不需要再open了
if(!(data->disk->open_flag & RT_DEVICE_OFLAG_OPEN))
{
if(rt_device_open(data->disk, RT_DEVICE_OFLAG_RDWR) != RT_EOK)
{
rt_kprintf("disk open error\n");
return -RT_ERROR;
}
}
到这里,代码就修改添加完毕。
运行程序
编译并下载完程序后,USB连接板子和电脑,就可以看到U盘了,并且可以打开和复制U盘中的文件。不过与前面提到的文章一样,存在一个问题,在stm32中修改文件,或者电脑端修改U盘中的文件,不会同步。目前的使用需求是复制文件即可,后续有空再优化了。