一、整体步骤
- 使用STM32CubeMX生成MSC与SDIO模版
- 在 u***d_storage_if.c 中的 获取容量函数、读函数、写函数中、分别写入SD卡容量信息、SD卡读、SD卡写。
二、STM32CubeMX配置
芯片:STM32F407VG
基本上只需要使用STM32CubeMX给的默认配置就行了
三、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的堆空间设置的更大一点,这样可以尽可能的接近理论速率。
一、整体步骤
- 使用STM32CubeMX生成MSC与SDIO模版
- 在 u***d_storage_if.c 中的 获取容量函数、读函数、写函数中、分别写入SD卡容量信息、SD卡读、SD卡写。
二、STM32CubeMX配置
芯片:STM32F407VG
基本上只需要使用STM32CubeMX给的默认配置就行了
三、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的堆空间设置的更大一点,这样可以尽可能的接近理论速率。
举报