注:以下修改适用于你使用了STM32H743+SDMMC+QSPI+MDMA+FATFS+Cache缓存的情况。
在读写SD卡时,发现f_write函数返回FR_INT_ERR,然后打断点调试发现底层函数返回值没有问题:
使用读卡器发现数据实际已经写入;这让我百思不得其解,怀疑是什么原因导致数据没有同步;于是想到了会不会是STM32H7的Cache缓存的问题,然后上网找资料,看到了一篇文章:文章链接
经过这篇文章提示,于是看了代码,确实开启了Cache;尝试关闭后:
果然写入返回错误的问题解决了:
关闭Cacheh后,SDRAM的内存映射读写也变慢了,影响了其他模块性能,问题还未完全解决。
于是想办法在不关闭缓存机制的情况下,能够保证数据的一致性了,然后根据SCB_EnableDCache这个函数跳转,发现了一个SCB_CleanDCache函数,该函数是清除数据Cache的,然后尝试使用了一下,在DMA读写之前调用,重写了下面函数:
测试发现也是可以的,其他模块也没有受到影响,到此,问题全部解决。
QSPI FALSH读写也是一样,也是MDMA与Cache数据不一致导致的,解决方法可以参考上面SD卡。
修改读写部分函数(底层驱动基于野火开发板例程修改):
参照SDMMC的磁盘读写(sd_diskio.c文件),完成以下修改:
最后注意时钟树的选择:
DTCM内存池,DTCM共128KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!
ITCM内存池,DTCM共64 KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!
之前我QSPI 时钟选择是HCLK3,所以 QSPI按照SD卡改了也不行,更改时钟选择就行了。