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