前言
- 在学习USB协议中,学习到mass storage device的时候,想要通过stm32cubemax配置stm32f407的模拟U盘并且通过源码学习相关协议。前期很顺利,window能够正常识别U盘,但是总是无法格式化,网上看了很多例程,配置步骤都是一模一样都无法正常格式化。搞了2天左右,突然灵光一现,是不是U盘容量设置太小了,导致格式化的时候有些映射表之类的无法正常写入。由于是通过RAM模拟U盘的,因此一开始只是配置了20×512的大小,后来改为64×512=32k后就正常了。因此记录下具体操作过程和问题点。
一、使用cubemx配置USB MASS STORAGE DEVICE
1、添加USB组件
选择USB设备
选择st自己的第三方组件,Mass Storage class,都采用默认选项即可,有特殊需要可以自己根据说明配置
配置时钟,USB的总线频率一定要是48MHZ
生成keil工程,栈配置大一些
配置mass storage的盘符数量、块数量、块大小
在usbd_storage_it.c文件中,把需要自己实现的接口补充完整。我这边为了偷懒,直接用单片机自身的RAM模拟U盘的,因此只需要实现这两个函数。如果用单片机内部flash或外部flash,需要把这个文件中其他函数自己实现。
PC识别到U盘后,提示需要格式化
格式化完成后,在线仿真可以看到数据区域写入了一些数据。应该是磁盘头部信息,映射表之类的,具体没有细究,有空研究一下。
二、遇到的问题
1、格式化失败
由于一开始太抠门,怕RAM不够,块数量配置的太小,导致PC识别到的U盘容量太小,格式化的时候总是失败。我估计是磁盘格式化的时候对最小容量有要求,需要写入头部信息,因此无法正常格式化。一开始配置的磁盘容量如下:
导致格式化失败
实际也没有写入任何数据
后面把块数量改为64,块大小还是512,总容量32k后,就正常了
源码连接
总结
遇到问题,有时候虽然会灵光一闪解决了,但这是建立在之前不放弃,不断找资料、看代码、思考解决方法的基础上的。