1.在此说明一下,这是学习记录,其中肯定有很多问题
2.通过CubeMX选中USB_Device
2.1选择Middleware,注意选中MSC后改一下USB的缓冲大小为4096就是最后一个选项
3.将生成的文件夹拷贝到board下的对应板子工程
4.然后时这两个函数实现,就是加粗部分(说句实话实现SPI调了很久,在其他地方好好的,到了USB中断就不能用,其中就有SPI需要延时获取SPI写状态,因为USB在中断中跳不出去,HAL_Delay()直接不能用。说到这里插一句SPI使用的是直接读写的方式不是中断或者DMA)
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
/ USER CODE BEGIN 6 /
if (blk_len == 0)
{
return (USBD_FAIL);
}
*if(w25q128_read(blk_addrSTORAGE_BLK_SIZ,buf,blk_len*STORAGE_BLK_SIZ) == 0)
return (USBD_OK);**
return (USBD_FAIL);
/ USER CODE END 6 /
}
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
/ USER CODE BEGIN 7 /
if (blk_len == 0)
{
return USBD_FAIL;
}
*if(w25q128_erase_write(blk_addrSTORAGE_BLK_SIZ,buf,blk_len*STORAGE_BLK_SIZ) == 0)
return (USBD_OK);**
return USBD_FAIL;
/ USER CODE END 7 /
}
5.这里写函数一定要注意,SPI写入数据时,当遇到不是地址中不是0xFF数据时,写入是无效的,所以USB写入函数这里一定要带有擦除方式写入,至于怎么擦除,就看各位的SPI实现了
6.我添加了个中间文件
6.1就封装了usb的初始化和其中断实现
7.总结下调试过程当中的坑:
先把上面写入和擦除函数里的SPI实现注释掉,一跑肯定就跑起来了(反正我是没遇到跑不起来的情况),此时电脑上面就能检测到U盘插入了,但是格式化是不成功的。
然后就是各种SPI读写的对接,真心话,我觉得最大的坑就是说好的有中断嵌套呢,完全就不是那么回事,当然也有可能水平低,没找到正真原因