一、测试平台:
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 */
}