单片机学习小组
直播中

h1654155275.5748

8年用户 877经验值
私信 关注

如何使用STM32CubeMX生成MSC与SDIO模版实现以SD卡为载体的U盘?

如何使用STM32CubeMX生成MSC与SDIO模版实现以SD卡为载体的U盘?

回帖(1)

陈晶尚

2022-2-22 10:01:19
一、整体步骤




  • 使用STM32CubeMX生成MSC与SDIO模版
  • 在 u***d_storage_if.c 中的 获取容量函数、读函数、写函数中、分别写入SD卡容量信息、SD卡读、SD卡写。


二、STM32CubeMX配置


芯片:STM32F407VG

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























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




三、u***d_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 */
}
四、注意事项




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

更多回帖

发帖
×
20
完善资料,
赚取积分