# STM32F103RCT6外挂w25qxx-FatFS-通过USB接PC可访问FatFS内容-标准库 **Repository Path**: alex_csc/STM32F103RCT6-w25qxx-FatFS-Flash ## Basic Information - **Project Name**: STM32F103RCT6外挂w25qxx-FatFS-通过USB接PC可访问FatFS内容-标准库 - **Description**: 通过网上的帖子学到,研究之后做成案例 1、STM32F103RCT6标准库,使用硬件SPI3(PB3 PB4 PB5) 2、W25qxx系列通过SPI挂载成U盘 3、W25qxx内嵌FatFs文件系统, 4、可通过STM32 自带的USB-device接入电脑,查看内容文件 (工程内有两个文件,未完成融合,需要单一查看) - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 2 - **Created**: 2024-05-19 - **Last Updated**: 2025-04-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 内部有两个工程, 都是STM32F103RCT6标准库版本,下载之后请仔细检查驱动所对应的硬件和MCU的配置 烧录第一个工程后,打开串口 115200 复位之后如图片: “U盘程序烧录之后打开查看内容.png” ![输入图片说明](%E4%B8%B2%E5%8F%A3%E5%8A%A9%E6%89%8B%E6%88%90%E5%8A%9F%E6%98%BE%E7%A4%BA%E4%BF%A1%E6%81%AF.png) 之后烧录工程: “利用STM32F103RC的USB将W25Q64模拟成U盘-WJX-自制RCT6核心板-SPI3测试成功” 将单片机USB连接电脑,显示如下图片: ![输入图片说明](U%E7%9B%98%E7%A8%8B%E5%BA%8F%E7%83%A7%E5%BD%95%E4%B9%8B%E5%90%8E%E6%89%93%E5%BC%80%E6%9F%A5%E7%9C%8B%E5%86%85%E5%AE%B9.png) 参考连接: 帖子:STM32F103外挂SPI Flash,内嵌FatFS文件系统,并通过USB接PC可访问FatFS内容 https://blog.csdn.net/xushan239/article/details/79617165 “有几点需要注意的是: Mass_Block_Size的大小只能设置为512,不然PC识别USB大容量存储设备 文件系统的操作单位大小FLASH_SECTOR_SIZE要和Mass_Block_Size一致 最好在文件系统准备好以后再去挂载USB设备 如果单片机在文件系统中创建或者修改文件以后,在PC端是不能被立马查看到的,需要重新插拔。 ” 帖子;stm32--USB(作为U盘)+FatFs的实现 https://www.cnblogs.com/cage666/p/9219458.html USB与FatFs不冲突的方案选择 USB和FatFs都会操作SPIFlash、对文件页表、目录表做出修改。如果同时在程序中开启USB、挂载FatFs,有可能出现同时修改文件页表、一方修改文件数据与另一方修改文件页表冲突、二者操作SPIFlash冲突等情况,导致系统崩溃。 为了避免这个可能会发生的问题,设想了三种方案: 方案1:在需要用FatFs写入时禁用USB中断,检测完毕打开中断。 程序中的现象:程序可以正常运行,USB功能没有崩溃;但可能是由于禁用USB中断后没有清空中断标志位,使能中断后有时会错误地进入中断(不影响程序功能)。 PC端的现象:在程序禁用USB中断后,PC端依旧能看到可移动磁盘,但无法正常对其进行有效操作;使能中断后,PC又可以正常访问可移动磁盘。 选择:这种方法虽然可行性、操作性上没有问题,但这是不合规范的、有风险的,如果有更优方案,应选择更优方案;如果找不到更优方案,只能选择此方案。 方案2:通过三极管,在需要用FatFs写入时断开D+D-。 因需进行硬件修改,暂时无法测试,但这可能是手机上选择充电模式/传文件模式的原理。硬件上直接断开这两根线,相当于拔出了USB线(仅保留供电),理论上完全可行,并且没有风险。 选择:此方案优于方案1,但需要对硬件进行更改,如果有其他方案优先选择不更改硬件的方案。 方案3:仅在需要USB时初始化USB(其他中断控制),其他时候不初始化USB。 实现方式:开机后不初始化USB;在收到设定的某个中断时(比如串口收到"connect")break出原while(1),初始化USB;收到另一个中断信号后(比如串口收到"disconnect"),软件复位单片机。 测试结果:完全可行,USB和FatFs在完全分隔开的两端程序中,完全没有交叉,不会互相影响;也不用担心USB的注销问题,直接软件复位即可。 选择:选择方案3。