STM32CubeMX F4驱动SDIO USB Fatfs文件系统

一、硬件组成及连接
自己画的一块板子,准备玩玩LVGL的,硬件连接图如下:
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第1张图片
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第2张图片
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第3张图片
SD卡座忘记接地了!!!所以后面新增该版将SD卡座接地,因为TF卡插入时SDIO_DETECT应该是低电平,我的板子SD卡槽外壳没接地,无论TF卡有没有插入都是高电平,后面配置中我会把SD_DETECT设置为输入下拉
二、STM32CubeMX配置,版本v6.8 F4库版本:v1.27.1
1、先配置系统时钟,板子上使用的外部8M晶振,打开下载口
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第4张图片
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第5张图片
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第6张图片
2、SDIO配置,4线模式,时钟2分频,打开硬件流控制,配置SDIO发送与接收DMA
时钟我设置的2分频,如果不分频会出现文件能够拷贝进TF卡,复位单片机后再通过电脑打开TF卡就没有之前拷贝的文件
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第7张图片
使用SDIO的发送与接收DMA
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第8张图片
将PA15作为TF插入检测引脚,因为我的板子SD卡槽外壳没有接地,所以先设置为输入下拉模式
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第9张图片
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第10张图片
3、Fatfs配置
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第11张图片

STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第12张图片
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第13张图片
4、USB配置
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第14张图片
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第15张图片
5、中断配置 优先级:SDIO>SDIO_DMA>USB
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第16张图片
三、生成代码
堆栈开大一些
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第17张图片
我比较喜欢LL与HAL库混用
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第18张图片
四、代码改动
1、主函数如下:
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第19张图片
2、改魔术棒配置
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第20张图片
3、代码改动部分
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第21张图片
打开CubeMX的器件库官方例程,看看官方怎么实现的
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第22张图片
仿照官方例程的usbd_storage.c完善我们工程的usbd_storage_if.c
我们工程完善后的函数如下:
先包含头文件
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第23张图片
完善代码

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;
//  return (USBD_OK);
  HAL_SD_CardInfoTypeDef info;
  int8_t ret = USBD_FAIL;

  if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
  {
    BSP_SD_GetCardInfo(&info);

    *block_num =  info.LogBlockNbr  - 1;
    *block_size = info.LogBlockSize;
    ret = USBD_OK;
  }
  return ret;
  /* USER CODE END 3 */
}
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);

//  return (USBD_OK);
  int8_t ret = USBD_FAIL;

  if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
  {
    BSP_SD_ReadBlocks_DMA((uint32_t *)buf, blk_addr, blk_len);
    /* Wait until SD card is ready to use for new operation */
    while (BSP_SD_GetCardState() != SD_TRANSFER_OK)
    {
    }
    ret = USBD_OK;
  }
  return ret;
  /* USER CODE END 6 */
}
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);

//  return (USBD_OK);
  int8_t ret = USBD_FAIL;

  if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
  {
    BSP_SD_WriteBlocks_DMA((uint32_t *)buf, blk_addr, blk_len);

    /* Wait until SD card is ready to use for new operation */
    while (BSP_SD_GetCardState() != SD_TRANSFER_OK)
    {
    }
    ret = USBD_OK;
  }
  return ret;
  /* USER CODE END 7 */
}

在这个文件里包含头文件
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第24张图片
sdio文件添加以下内容
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第25张图片

五、编译下载,运行结果查看
TF插入卡槽,USB插入电脑,正常情况下打开我的电脑会显示U盘
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第26张图片
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第27张图片
再任意拷贝一个文件至U盘,速度会比较慢
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第28张图片
想要拷贝快,以下参数可以提升速度,MSC_MEDIA_PACKET以及堆栈空间
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第29张图片
STM32CubeMX F4驱动SDIO USB Fatfs文件系统_第30张图片

注意!!!
1、程序里面在执行读写TF文件操作时,电脑就不要去操作U盘,同理,电脑操作TF内文件时,程序也不要去操作TF内文件;
思路:程序在读写TF文件时,直接关闭TF卡的USB挂载;电脑操作TF内容时,不挂在TF文件系统;也就是程序里面设置一个U盘模式,U盘模式和正常TF挂载读写互斥即可

你可能感兴趣的:(stm32,单片机,嵌入式硬件)