利用STM32CubeMX软件生成USB_DEVICE_SD卡虚拟U盘

本文介绍如何使用STM32F429NIH6单片机通过USB_OTG_FS接口模拟U盘,并实现基本的读写操作。文章详细描述了配置步骤,包括创建工程、配置USB接口、设置USB设备类为大容量存储等。用户需实现关键函数以完成SD卡数据的读取和写入。

一、测试平台:
MCU:STM32F429NIH6
工具:STM32CubeMX软件
编译软件:MDK

二、配置步骤
(1).打开STM32CubeMX软件,创建新的工程文件,先生成一个的串口的收发例程,需要实现将串口收到的数据发送的出来,生成串口的例程这里不再详细介绍。
(2).生成一个SDIO的SD卡读写例程,实现对SD卡的读写,这里不做介绍。
(3).配置USB_OTG_FS,由于电路板上USB管脚连接的是PA11和PA12,所以这里配置USB_OTG_FS,Mode项配置Device Only,同时开启中断。
在这里插入图片描述
(4).配置USB_DEVICE,Class For FS IP项选择 Mass Storage Class,其他参数保持默认即可。
在这里插入图片描述
(5).需要用户实现的只有USB虚拟U盘相关的函数,都在usbd_storage_if.c文件中。需要实现以下几个函数,其中中文注释的四个为必须实现的,其它的可选

获取容量的函数

int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  /* USER CODE BEGIN 3 */
  UNUSED(lun);

//  *block_num  = STORAGE_BLK_NBR;
//  *block_size = STORAGE_BLK_SIZ;
  *block_num  = uSdHandle.SdCard.BlockNbr;
  *block_size =  uSdHandle.SdCard.BlockSize;
  return (USBD_OK);
  /* USER CODE END 3 */
}

在这里插入图片描述
判断U盘状态函数:

int8_t STORAGE_IsReady_FS(uint8_t lun)
{
  /* USER CODE BEGIN 4 */
  UNUSED(lun);
	
  uint8_t state = 0;
  state = HAL_SD_GetState(&uSdHandle) ;
  if(HAL_SD_STATE_READY != state)
  {
	  return USBD_FAIL ;
  }
  
  return (USBD_OK);
  /* USER CODE END 4 */
}

在这里插入图片描述
U盘读数据函数:

int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 6 */
  UNUSED(lun);
  UNUSED(buf);
  UNUSED(blk_addr);
  UNUSED(blk_len);
	
	HAL_SD_ReadBlocks(&uSdHandle, buf, blk_addr,  blk_len, 5000);
	int n = 5000;
	while( HAL_SD_GetCardState(&uSdHandle) != HAL_SD_CARD_TRANSFER ){ if(n-- == 0) break; } ;
	
  return (USBD_OK);
  /* USER CODE END 6 */
}

在这里插入图片描述
U盘写数据函数:

int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 7 */
  UNUSED(lun);
  UNUSED(buf);
  UNUSED(blk_addr);
  UNUSED(blk_len);
	
  int8_t state = HAL_SD_WriteBlocks(&uSdHandle, buf, blk_addr, blk_len, 5000);
  int n = 5000;
  while( HAL_SD_GetCardState(&uSdHandle) != HAL_SD_CARD_TRANSFER ){ if(n-- == 0) break; } ;
	
  return (USBD_OK);
  /* USER CODE END 7 */
}

在这里插入图片描述

### 配置STM32CubeMX以启用USB MSC模式支持SD存储功能 在STM32CubeMX中配置USB Mass Storage Class(MSC)模式,使STM32设备能够作为U被主机系统识别并访问SD内容,需完成以下关键步骤: 选择合适的MCU型号后,进入“Pinout & Configuration”界面,找到并启用`USB_OTG_FS`或`USB_OTG_HS`模块。对于大多数开发板而言,使用`USB_OTG_FS`已足够满足需求。将该外设配置为**Device Only**模式,并在“USB Device”子项中选择**Mass Storage Class (MSC)**[^1]。 接下来,在“Configuration”选项中打开“USB_DEVICE”设置,确保选中了MSC类,并生成相应的中间件代码。此时,STM32CubeMX会自动添加`usbd_storage_if.c`和`usbd_storage_if.h`文件至项目结构中,这些文件用于实现与存储介质(如SD)的接口逻辑。 为了使USB MSC功能正常工作,还需配置SD的底层驱动。通常情况下,推荐使用SDIO接口连接SD,并在STM32CubeMX中启用SDIO控制器及相关DMA通道。此外,应同时启用FATFS模块以实现文件系统的管理功能。在完成所有硬件外设配置后,生成初始化代码并导入到IDE中进行后续开发[^1]。 在实际应用中,开发者需要修改`usbd_storage_if.c`中的核心函数,例如`STORAGE_Read()`和`STORAGE_Write()`,以实现对SD的读写操作。具体而言,这些函数内部应调用SD的读写API,并通过FATFS层进行扇区级别的数据传输。以下是一个简化的示例代码片段: ```c int8_t STORAGE_Read_FS(uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { // 调用SD读取函数,例如HAL_SD_ReadBlocks() if (BSP_SD_ReadBlocks(buf, blk_addr, blk_len, HAL_SD_BLOCKSIZE) != MSD_OK) { return -1; } return 0; } int8_t STORAGE_Write_FS(uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { // 调用SD写入函数,例如HAL_SD_WriteBlocks() if (BSP_SD_WriteBlocks(buf, blk_addr, blk_len, HAL_SD_BLOCKSIZE) != MSD_OK) { return -1; } return 0; } ``` 上述函数需正确对接SD的实际读写流程,并确保符合MSC协议的数据格式要求。一旦USB设备成功枚举,主机系统(如Windows)将识别该设备为U,并允许用户直接对SD中的文件进行访问和修改[^2]。 最后,在主程序中启动USB设备通信。通常情况下,只需调用`MX_USB_DEVICE_Init()`函数即可初始化USB设备堆栈并开始监听主机请求。随后,设备将作为一个标准的MSC设备运行,用户可像操作普通U一样对SD执行读写操作。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值