STM32CubeMX F4驱动SDIO USB Fatfs文件系统

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

在这里插入图片描述
在这里插入图片描述
4、USB配置
在这里插入图片描述
在这里插入图片描述
5、中断配置 优先级:SDIO>SDIO_DMA>USB
在这里插入图片描述
三、生成代码
堆栈开大一些
在这里插入图片描述
我比较喜欢LL与HAL库混用
在这里插入图片描述
四、代码改动
1、主函数如下:
在这里插入图片描述
2、改魔术棒配置
在这里插入图片描述
3、代码改动部分
在这里插入图片描述
打开CubeMX的器件库官方例程,看看官方怎么实现的
在这里插入图片描述
仿照官方例程的usbd_storage.c完善我们工程的usbd_storage_if.c
我们工程完善后的函数如下:
先包含头文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/f9ac1d511de348569d4a85cd85dd5e9b.png
完善代码

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 */
}

在这个文件里包含头文件
在这里插入图片描述
sdio文件添加以下内容
在这里插入图片描述

五、编译下载,运行结果查看
TF插入卡槽,USB插入电脑,正常情况下打开我的电脑会显示U盘
在这里插入图片描述
在这里插入图片描述
再任意拷贝一个文件至U盘,速度会比较慢
在这里插入图片描述
想要拷贝快,以下参数可以提升速度,MSC_MEDIA_PACKET以及堆栈空间
在这里插入图片描述
在这里插入图片描述

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

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值