真的太简单了,十分钟就搞定

我卡住了几天,最后发现delay函数的问题,去掉就好了。(评论大佬解释了这一现象)
步骤如下

  1. 使用cube mx 生成基本代码
  2. 调试spi flash
  3. 调试usb
  4. 融合代码

使用cube mx 生成基本代码

确定使用需求



usb

以下配置保持默认配置即可,切记不要胡乱修改参数

ESP32读写flashdemo esp32读写优盘_for循环


ESP32读写flashdemo esp32读写优盘_ESP32读写flashdemo_02

spi

ESP32读写flashdemo esp32读写优盘_stm32_03


ESP32读写flashdemo esp32读写优盘_ESP32读写flashdemo_04

调试spi flash

我使用的flash 是w25q128 spi 通信模式,所以直接找一个别人写好的驱动就可以了。

w25qxx驱动 我使用的是这个驱动,w25q的都能使用。

ESP32读写flashdemo esp32读写优盘_ESP32读写flashdemo_05


ESP32读写flashdemo esp32读写优盘_ESP32读写flashdemo_06


ESP32读写flashdemo esp32读写优盘_for循环_07

使用步骤如readme所述

  • 初始化 W25qxx_Init()
  • 成功后flash属性会存储在w25qxx结构体内
  • 读取数据,有几个函数,分为字节,多字节,页,扇区,块读取等
  • 先擦除再写入,擦除有页,扇区,块等,写入数据也是一样
    更新 2020年9月23日
    关于读和写的问题

    原理解读:
  • 读函数


    读块和写的这些函数原理相同。

调试usb

参考文章即可进行调试usb

ESP32读写flashdemo esp32读写优盘_初始化_08

融合代码

ESP32读写flashdemo esp32读写优盘_for循环_09


更新 2020年9月23日

ESP32读写flashdemo esp32读写优盘_ESP32读写flashdemo_10


关于有人使用 上电后遇到w25qxx读取id错误导致w25qxx初始化失败 的问题解决方案如下:

  1. 重新启动mcu 并等待一会 插入usb
  2. 更改usb外设初始位置,使其在flash驱动后面,这样就不会出现usb打断flash初始化导致的问题
  3. flash驱动初始化放入usb 的 大容量存储初始化之中
    我自己调试时usb一直是插在电脑上,未出现需要格式化的问题,所以建议之后我提出了以上方案进行处理
    usb接到电脑上即可,usb走线不需要任何上拉下拉电阻
    现在就是U盘了,U盘你总会用吧!这还用教!!!

评论提出的问题:
LeoMeEE:
使用博主这篇文章的方法你可能会遇到的问题:

  1. usb与systicks中断冲突,上述w25qxx的代码里用的hal_delay函数来做延时,该延时依赖于中断内的计时变量累加,而stmcube的usb操作全都在中断里,既当usb中断优先级和systicks优先级相同时,usb函数在中断中调用flash的读写函数会造成函数在延时里卡死。(已在文章开头说明)
  2. 上述25qxx代码在的sector读写函数并没有真正的完成多个sector的读写工作,需要自己写for循环来完成多个sector的读写。(已解决)
  3. 如果你遇到stm32的usb模拟u盘每次插入都需要格式化的问题时候,首先检查你的flash读写函数是否工作正常,在博主的这个方案中,上电后遇到w25qxx读取id错误导致w25qxx初始化失败,结果usb调用flash读写函数时无法读出fat文件系统信息导致每次插入都会提示需要格式化。(已解决)
  4. 如果你需要让mcu重启时不拔掉usb数据线还需要重新枚举usb,则可以在上电初始化usb前将PA12(D+)脚拉低65ms,之后拉高65ms,模拟usb插入的电平,这时不需要重新插拔usb,电脑会重新进行usb枚举的过程。以上,博主这篇文章的框架和方向没问题,细节部分需要测试和完善(已回复)