真的太简单了,十分钟就搞定
我卡住了几天,最后发现delay函数的问题,去掉就好了。(评论大佬解释了这一现象)
步骤如下
- 使用cube mx 生成基本代码
- 调试spi flash
- 调试usb
- 融合代码
使用cube mx 生成基本代码
确定使用需求
usb
以下配置保持默认配置即可,切记不要胡乱修改参数。
spi
调试spi flash
我使用的flash 是w25q128 spi 通信模式,所以直接找一个别人写好的驱动就可以了。
w25qxx驱动 我使用的是这个驱动,w25q的都能使用。
使用步骤如readme所述
- 初始化 W25qxx_Init()
- 成功后flash属性会存储在w25qxx结构体内
- 读取数据,有几个函数,分为字节,多字节,页,扇区,块读取等
- 先擦除再写入,擦除有页,扇区,块等,写入数据也是一样
更新 2020年9月23日
关于读和写的问题
原理解读: - 读函数
读块和写的这些函数原理相同。
调试usb
参考文章即可进行调试usb
融合代码
更新 2020年9月23日
关于有人使用 上电后遇到w25qxx读取id错误导致w25qxx初始化失败 的问题解决方案如下:
- 重新启动mcu 并等待一会 插入usb
- 更改usb外设初始位置,使其在flash驱动后面,这样就不会出现usb打断flash初始化导致的问题
- flash驱动初始化放入usb 的 大容量存储初始化之中
我自己调试时usb一直是插在电脑上,未出现需要格式化的问题,所以建议之后我提出了以上方案进行处理
usb接到电脑上即可,usb走线不需要任何上拉下拉电阻
现在就是U盘了,U盘你总会用吧!这还用教!!!
评论提出的问题:
LeoMeEE:
使用博主这篇文章的方法你可能会遇到的问题:
- usb与systicks中断冲突,上述w25qxx的代码里用的hal_delay函数来做延时,该延时依赖于中断内的计时变量累加,而stmcube的usb操作全都在中断里,既当usb中断优先级和systicks优先级相同时,usb函数在中断中调用flash的读写函数会造成函数在延时里卡死。(已在文章开头说明)
- 上述25qxx代码在的sector读写函数并没有真正的完成多个sector的读写工作,需要自己写for循环来完成多个sector的读写。(已解决)
- 如果你遇到stm32的usb模拟u盘每次插入都需要格式化的问题时候,首先检查你的flash读写函数是否工作正常,在博主的这个方案中,上电后遇到w25qxx读取id错误导致w25qxx初始化失败,结果usb调用flash读写函数时无法读出fat文件系统信息导致每次插入都会提示需要格式化。(已解决)
- 如果你需要让mcu重启时不拔掉usb数据线还需要重新枚举usb,则可以在上电初始化usb前将PA12(D+)脚拉低65ms,之后拉高65ms,模拟usb插入的电平,这时不需要重新插拔usb,电脑会重新进行usb枚举的过程。以上,博主这篇文章的框架和方向没问题,细节部分需要测试和完善(已回复)