CubeMX+STM32F407+FatFS+SDIO_DMA+SD FR_DISK_ERR 错误解决方法_sdio不用fatfs方式读写文件(1)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

只说解决方法不介绍软件环境的就是耍流氓!
软件环境:STM32CubeMX V4.25.0+STM32Cube FW_F4 V1.21.0
软件环境非常重要,检查下自己不是这个版本就不要照着操作了,解决方法仅供参考,如果版本一致,100%问题会解决
简单介绍下遇到的问题
按照网上能搜到的说法,使用CubeMX配置SDIO+FatFS,DMA方式读写SD卡,执行

f_mount(&SDFatFS, (TCHAR const*)SDPath, 1);

f_open(&SDFile, "STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE);

这两步都正常,并且可以创建文件,但是到这一步

retSD = f_write(&SDFile, wtext, sizeof(wtext), (void *) & byteswritten);//写入内容

retSD返回值为1,查错误代码为
FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */

然后就在各种博客各种论坛找各种解决方法,都得不到解决,
插入下之前尝试过哪些操作吧:
怀疑时钟频率太高,分频系数设置为200,失败
怀疑SDIO_BUS_WIDE_4B有问题改为SDIO_BUS_WIDE_1B,失败
怀疑SDIO_IRQn中断与DMA中断冲突,改中断优先级,失败
怀疑DMA_PRIORITY_LOW中断优先级太低,改为DMA_PRIORITY_HIGH,失败
怀疑SD卡格式有问题不支持,各种格式化,FAT,FAT32,各种单元大小组合,失败
怀疑SD卡兼容性不好,更换SD卡,失败
怀疑FatFS设置有问题,设置各种选项测试,失败
怀疑SDIO管脚配置没有开上拉,设置上拉,失败
怀疑SDIO没初始化,再次初始化,失败
踩坑完毕

最后在ST官方的例子中找到解决方法,耗时两天时间终于解决了,如果你看到这篇博客,那么恭喜你,各种坑我都帮你踩过了,你节省了两天时间,不煽情,直接看代码

CubeMX(正确)设置如下
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

其它保持默认

代码变更部分
fatfs.c

void MX_FATFS_Init(void) 
{
  /*## FatFS: Link the SD driver ###########################*/
  retSD = FATFS_LinkDriver(&SD_Driver, SDPath);

  /* USER CODE BEGIN Init */
  /* additional user code for init */     
	f_mount(&SDFatFS, (TCHAR const*)SDPath, 1);//挂载SD卡

  /* USER CODE END Init */
}

重点来了
在bsp_driver_sd.c里增加以下代码

/* USER CODE BEGIN BeforeCallBacksSection */
/* can be used to modify previous code / undefine following code / add code */
/* USER CODE END BeforeCallBacksSection */
/**
  * @brief SD Abort callbacks
  * @param hsd: SD handle
  * @retval None
  */
void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd)
{
  BSP_SD_AbortCallback();
}

/**
  * @brief Tx Transfer completed callback
  * @param hsd: SD handle
  * @retval None
  */
void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
{
  BSP_SD_WriteCpltCallback();
}

/**
  * @brief Rx Transfer completed callback
  * @param hsd: SD handle
  * @retval None
  */
void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
{
  BSP_SD_ReadCpltCallback();
}

/* USER CODE BEGIN CallBacksSection_C */
/**
  * @brief BSP SD Abort callback
  * @retval None
  */
__weak void BSP_SD_AbortCallback(void)
{

}

/**
  * @brief BSP Tx Transfer completed callback
  * @retval None
  */
__weak void BSP_SD_WriteCpltCallback(void)
{

}

/**
  * @brief BSP Rx Transfer completed callback
  * @retval None


![img](https://img-blog.csdnimg.cn/img_convert/715a3667716294f3e07b10ef22825cc2.png)
![img](https://img-blog.csdnimg.cn/img_convert/067a9500348c96375b003377e6ae4f57.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32CubeMX是一个用于配置STM32微控制器的图形化工具。它可以帮助我们快速配置SD卡、DMAFATFS文件系统。 在开始配置之前,我们需要先连接SD卡到STM32微控制器,并确保正确配置SD卡的GPIO引脚,使其与STM32SDIO接口连接。 首先,打开STM32CubeMX并选择相应的微控制器型号。然后,点击"Pinout & Configuration"选项卡,在左侧的"Peripherals"下选择SDIO,然后在右侧选择SDIO的引脚和模式。确保使能SDIO的时钟和数据信号引脚,并选择正确的模式,如4线模式。 接下来,点击"Middleware"选项卡,在右侧的"STemWin"下选择"FATFS"。然后,在"FATFs 1"下选择"SDIO"作为SD卡的字节访问连接器,并在"Volume1 size"中指定SD卡的容量。 再次点击"Middleware"选项卡,在右侧的"FATFS"下选择"DMA",以启用DMA传输。在"Mode"中选择"POLLING" 或"DMA"作为传输模式,并选择一个可用的DMA通道,例如DMA2-Stream3。 最后,点击"Project"选项卡,在右侧的"Project Name"下输入项目名称,然后点击"Save"按钮保存配置。 现在,我们已经完成了STM32CubeMX配置。生成代码并导入到我们的IDE中,例如Keil或者STM32CubeIDE。 在代码中,我们需要初始化SDIODMA,并创建FATFS实例,在主循环中使用FATFS函数完成SD卡的读写操作。我们可以使用FATFS提供的函数来打开、写入、读取和关闭文件,以及创建、删除和重命名目录。 这就是使用STM32CubeMX配置SD卡、DMAFATFS的步骤。通过使用STM32CubeMX,我们可以快速而方便地配置SD卡、DMAFATFS,从而实现SD卡的读写操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值