STM32CubeMx + SD Card + FatFs 读写SD卡死等问题

本文记录了在使用STM32CubeMx和FatFs进行SD卡读写时遇到的问题及解决过程。在配置SDIO DMA后,发现`f_open`函数在`ReadStatus`未置1的情况下卡住,通过修改回调函数解决了这个问题。然而,写操作失败,因为`HAL_SD_TxCpltCallback`未被调用。在`SD_DMATransmitCplt`中加入相关代码使状态恢复正常,实现了SD卡读写的正常运行。另外,注意到`HAL_SD_TxCpltCallback`是弱函数,可以重新定义。
摘要由CSDN通过智能技术生成

Cube Mx使用较新版本 Version:4.24.0

MDK v5.20

STM32F429ZGT6

两年以前记得试过SD卡读写,好像不是单纯的Read和Write,应该是用了文件系统,很顺利的试验成功了,所以源码和记录都没留,这次要做一个新的板子,真所谓苦难重重啊,到现在32.768K的晶振一直没起振,由原来的10P电容换了6P的,还是不行,应该说偶尔可以,但生产代码中MX_RTC_Init() 依然死在里面,LSE未就绪啊~, 言归正传,写了一个试验SD卡的程序,f_open 死在路上了,经调试发现ReadStatus 始终不会置1,唯一修改其值的方法BSP_SD_ReadCpltCallback根本没人调用,先是怀疑自己配置,在方法SD_read中直接调用了BSP_SD_ReadBlocks_DMA,可见,不用DMA不行,配置SDIO的DMA,如下


通过调试,还是不行,现在的中断函数已经被调用了HAL_DMA_IRQHandler,中断方法中传输完成调用hdma->XferM1CpltCallback(hdma); 而在读取方法中设置回调 hsd->hdmarx->XferCpltCallback = SD_DMAReceiveCplt; 在SD_DMAReceiveCplt方法中最后调用了HAL的回调HAL_SD_RxCpltCallback(hsd);而此方法又空,和希望的回调基本同名BSP_SD_ReadCpltCallback。所以把读写都放到此方法里(文件stm32f4xx_hal_sd.c 头加入extern void BSP_SD_ReadCpltCallback(void); extern void BSP_SD_WriteCpltCallback(void);)至此,Open方法过去了,但写方法一直失败,原因是HAL_SD_TxCpltCallback居然没地方调用,放到方法SD_DMATransmitCplt里,写一次后返回HAL_OK,但hsd->State一直是busy,导致下次读直接返回HAL_ERROR,再次在方法SD_DMATransmitCplt中添加hsd->State = HAL_SD_STATE_READY;至此SD卡读写正常。

总结一下生成代码后的改动:

stm32f4xx_hal_sd.c

 //dp:add at2018.6.20
extern void BSP_SD_ReadCpltCallback(void);
extern void BSP_SD_WriteCpltCallback(void);
/**
  * @brief Tx Transfer completed callbacks
  * @par
  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32CubeMX是一个用于配置STM32微控制器的图形化工具。它可以帮助我们快速配置SD卡、DMA和FATFS文件系统。 在开始配置之前,我们需要先连接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。 在代码中,我们需要初始化SDIO和DMA,并创建FATFS实例,在主循环中使用FATFS函数完成SD卡读写操作。我们可以使用FATFS提供的函数来打开、写入、读取和关闭文件,以及创建、删除和重命名目录。 这就是使用STM32CubeMX配置SD卡、DMA和FATFS的步骤。通过使用STM32CubeMX,我们可以快速而方便地配置SD卡、DMA和FATFS,从而实现SD卡读写操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值