STM32 虚拟U盘
2021-05-27 本文已影响0人
wjundong
使用 SRAM 进行简单测试
- Cubemx 设置
USB_OTG_FS
为Device_Only
,USB_DEVICE
设置Class For FS IP
为Mass Storage Class
, 里面详细配置使用默认参数即可. - 到 Project Manager 设置栈大小稍微大些, 因为 USB 协议的函数调用和局部变量较多, 比如设置成 0x10000.
- 在
usbd_storage_if.c
中添加如下代码, 使用 SRAM 作为存储:#define STORAGE_LUN_NBR 1 #define STORAGE_BLK_NBR 200 /* 内存容量一般来说很少, 这里使用 100K 的内存作为实验 */ #define STORAGE_BLK_SIZ 0x200 /* USER CODE BEGIN PRIVATE_DEFINES */ static char msc_data[STORAGE_BLK_NBR * STORAGE_BLK_SIZ]; /* 定义数组用来存放数据 */ /* USER CODE END PRIVATE_DEFINES */ /* 修改下面两个函数 */ int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { /* USER CODE BEGIN 6 */ memcpy(buf, msc_data + STORAGE_BLK_SIZ*blk_addr, blk_len*STORAGE_BLK_SIZ); return (USBD_OK); /* 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 */ memcpy(msc_data + STORAGE_BLK_SIZ*blk_addr, buf, blk_len*STORAGE_BLK_SIZ); return (USBD_OK); /* USER CODE END 7 */ }
使用 NAND FLASH 做测试
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
/* USER CODE BEGIN 6 */
for (int i = 0; i < blk_len; i++)
{
nand_flash_read_page((blk_addr + i) * 64, 0, buf, 4096);
}
return (USBD_OK);
/* 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 */
for (int i = 0; i < blk_len; i++)
{
nand_flash_erase(blk_addr + i);
nand_flash_write_page((blk_addr + i) * 64, 0, buf, 4096);
}
return (USBD_OK);
/* USER CODE END 7 */
}