本帖最后由 adlu 于 2016-6-2 17:53 编辑 我使用的是STM32F407ZETx芯片,用Cube配置生成一个虚拟的U盘很容易就实现了。 配置完生成MDK工程后,直接编译下载运行,用USB线连接PC后,可以模拟出一个32M的U盘。 不过U盘没有实际的存储空间,也不能进行实际的读写操作,因为块读写函数直接 返回OK,没有进行任何实际操作。 要实现对板上的SD卡进行读写,即实现读卡器功能,就要实现usbd_storage_if.c文件中下面结构体指定的几个函数, USBD_StorageTypeDef USBD_Storage_Interface_fops_FS = { STORAGE_Init_FS,//初始化存储器 STORAGE_GetCapacity_FS, // 获取存储器容量 STORAGE_IsReady_FS, // 检测存储器是否就绪 STORAGE_IsWriteProtected_FS, // 检测存储去是否写保护 STORAGE_Read_FS, // 读块 STORAGE_Write_FS, // 写块 STORAGE_GetMaxLun_FS, // 获取可用卷数量 (int8_t *)STORAGE_Inquirydata_FS, // 这是一个数据结构 }; 从名称就可指定其用途。 但我把SD卡操作的代码写入相应函数后,没有实现正常的读卡器功能。 不知道怎么回事。 实现代码见续帖。 |
stm32 USB的CDC类传输掉数据
STM32F105 USB接收数据不断进入中断,出现“死机”现象
关于STM32CubeMX配置的USB例程电脑无法识别问题
STM32F407 USB-HS-OTG是否不外接PHY可以做虚拟串口?
如何做一个USB从机键盘用stm32f407
用STM32F4 Cube MX生成的USB Device C代码的BUG
USB Device + FatFS + SDIO 模拟U盘意外只读问题
USB Device + FatFS + SDIO 问题
STM32H7配置成USB DEVICE时,连接电脑时不进入中断
STM32F446 USB和串口1 冲突
int8_t STORAGE_Init_FS (uint8_t lun)
{
/* USER CODE BEGIN 2 */
MX_SDIO_SD_Init();
return (USBD_OK);
/* USER CODE END 2 */
}
int8_t STORAGE_GetCapacity_FS (uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
/* USER CODE BEGIN 3 */
*block_num = SDCardInfo.CardCapacity / STORAGE_BLK_SIZ;
*block_size = STORAGE_BLK_SIZ;
return (USBD_OK);
/* USER CODE END 3 */
}
{
/* USER CODE BEGIN 4 */
static int8_t prev_status = 0;
int8_t ret = -1;
if(prev_status < 0)
{
MX_SDIO_SD_Init();
prev_status = 0;
}
if(HAL_SD_GetStatus(&hsd) == SD_TRANSFER_OK)
{
ret = 0;
}
return ret;
// return (USBD_OK);
/* USER CODE END 4 */
}
int8_t STORAGE_IsWriteProtected_FS (uint8_t lun)
{
/* USER CODE BEGIN 5 */
return (USBD_OK);
/* USER CODE END 5 */
}
uint8_t *buf,
uint32_t blk_addr,
uint16_t blk_len)
{
/* USER CODE BEGIN 6 */
int8_t res=0;
res = HAL_SD_ReadBlocks_DMA(&hsd, (uint32_t *)buf,
(uint64_t)blk_addr*STORAGE_BLK_SIZ,
STORAGE_BLK_SIZ,
blk_len);
return (res);
/* 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 */
int8_t res=0;
res = HAL_SD_WriteBlocks_DMA(&hsd, (uint32_t *)buf,
(uint64_t)blk_addr*STORAGE_BLK_SIZ,
STORAGE_BLK_SIZ,
blk_len);
return (res);
/* USER CODE END 7 */
}
int8_t STORAGE_GetMaxLun_FS (void)
{
/* USER CODE BEGIN 8 */
return (STORAGE_LUN_NBR - 1);
/* USER CODE END 8 */
}
问题我没有解决,收回你的膝盖
等待大神解决
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分