目录

 

一、整体步骤

二、STM32CubeMX配置

三、usbd_storage_if.c 中的修改

四、注意事项


一、整体步骤

  1. 使用STM32CubeMX生成MSC与SDIO模版

  2. 在 usbd_storage_if.c 中的 获取容量函数、读函数、写函数中、分别写入SD卡容量信息、SD卡读、SD卡写。

二、STM32CubeMX配置

芯片:STM32F407VG

基本上只需要使用STM32CubeMX给的默认配置就行了

 

 

 

  • 使用到USB,所以堆空间需要分配大一点

三、usbd_storage_if.c 中的修改

/* 这里可以放入SD卡的初始化函数 */
int8_t STORAGE_Init_FS(uint8_t lun)
{
  /* USER CODE BEGIN 2 */
  return (USBD_OK);
  /* USER CODE END 2 */
}

/* 获取SD卡容量信息 */
int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  /* USER CODE BEGIN 3 */
	HAL_SD_CardInfoTypeDef info;
	if(HAL_SD_GetCardState(&hsd) ==  HAL_SD_CARD_TRANSFER)
	{
		HAL_SD_GetCardInfo(&hsd, &info);
		*block_num = info.LogBlockNbr;
		*block_size = info.LogBlockSize;

		return  USBD_OK;
	}
	return  USBD_FAIL;
  /* USER CODE END 3 */
}

/* 这里可以写入SD卡状态判断 */
int8_t STORAGE_IsReady_FS(uint8_t lun)
{
  /* USER CODE BEGIN 4 */
  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 */
    int8_t ret = USBD_FAIL;
    if( HAL_SD_ReadBlocks(&hsd, buf, blk_addr,  blk_len, HAL_MAX_DELAY) == HAL_OK )
    {
    	ret = USBD_OK;

        while(HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY);
        while( HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER );
    }

    return ret;
  /* 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 */
    int8_t ret = USBD_FAIL;
    if( HAL_SD_WriteBlocks(&hsd, buf, blk_addr, blk_len, HAL_MAX_DELAY) == HAL_OK )
    {
    	ret = USBD_OK;

        while(HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY);
        while( HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER );
    }

    return ret;
  /* USER CODE END 7 */
}

四、注意事项

  1. 首先SD可以开启DMA读取或者单纯的SD的中断,但是其中优先级一定要为SD > SD DMA Rx/Tx > USB,不然当SD卡在读写的时候被其他中断打断,会直接导致U盘掉盘,中途卡顿。
  2. 由于是全速FS,USB通信速率最高为12Mbps,所以理论上的读写速度是位于1.5MB/s的。但实际上,经过本人测试,读速度在700KB/s左右,写速度在400KB/s左右。如果需要提高读写速度,则可以把 usbd_conf.h 中的 MSC_MEDIA_PACKET 设置大一点,并且将STM32的堆空间设置的更大一点,这样可以尽可能的接近理论速率。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐