HAL库通过FATFS和SDIO+DMA写入SD卡数据错误

HAL库F4版本 1.28.1

最近在使用HAL库配置SDIO+DMA并通过FATFS向SD卡写入数据,但是发现写入的数据经常有错误,不是少了一部分就是多了一部分,写入的数据为csv格式,通过循环向缓冲区写入"100100,12.345678\r\n"数据来观察问题,测试代码大概如下:

cpp 复制代码
DoubleBuffer_Write(&DoubleBuffer, "100100,12.345678\r\n", (sizeof("100100,12.345678\r\n")-1));  //写入双缓冲区
if(DoubleBuffer.ready == true)
{
	DoubleBuffer.ready = false;
	res = f_write(&SDFile, DoubleBuffer.buf_proc, DoubleBuffer.proc_len, &bytesWritten);  // 批量写入文件
	if (res != FR_OK) {
	} 
	else 
	{
		res = f_sync(&SDFile);     
	}
							
}

循环写入后将写入SD卡的数据导出,观察到写入数据经常发生错误,如下:

排除掉缓冲区的问题后,将问题定位到HAL库的FATFS和SDIO+DMA驱动上,

上网查阅相关资料也发现在stm32标准库中该驱动确实存在问题,

带FatFS的SD卡写数据出错情况测试记录,及其解决办法 - 第2页 - 文件系统 - 硬汉嵌入式论坛 - Powered by Discuz!

F4系列标准库库SDIO的FatFS例子修改一个bug,可提升4线SDIO的DMA稳定性 - STM32F429 - 硬汉嵌入式论坛 - Powered by Discuz! 继续提升STM32F4的4线SDIO DMA方式的读写稳定性,发布新版案例(2020-06-30) - STM32F429 - 硬汉嵌入式论坛 - Powered by Discuz!

但是说明了HAL库中关于驱动的问题都已经解决了,那为什么我向SD卡写入的时候还存在问题呢?最后在cubemx中发现我的SDIO TX的DMA突发传输配置有问题, 我的写缓冲区是char类型,而我的cubemx配置的内存date witdh为word类型如下:

由于DMA 每次取 4 字节写入,而我的缓冲区是字节排列,这就导致可能访问未分配内存,这也解释了我上面数据错乱的问题,而且每次错乱的部分都不超过三字节;后面修改DMA配置的内存date witdh为char类型,和缓冲区保持一致,如下:

后再次测试,连续写入1M字节未出现任何问题;

/**********************************补充**************************/

后面测试,当DMA配置的内存date witdh仍然保持为word类型时,如果char类型写入缓冲区大小小于512字节时写入也不会出现错误,大于512字节时就会出现和前面描述的一样的错误情况;原因未知。

相关推荐
天空'之城2 小时前
C 语言工业级通用组件手写 24:互补滤波
c语言·开发语言·互补滤波·嵌入式算法·工业级组件
芯岭技术3 小时前
Wi-Fi+BLE双模无线芯片 BK7238,低功耗、高性能,集成MCU和Flash
单片机·嵌入式硬件
云空3 小时前
《ARM Cortex‑M 系列完整梳理》
stm32·单片机·嵌入式硬件·mcu
单片机杂货铺4 小时前
基于单片机的智能花盆浇水系统控制器设
stm32·单片机·嵌入式硬件·毕业设计·51单片机·硬件工程
Hello_Damon_Nikola6 小时前
TM1637芯片从入门到精通
单片机·嵌入式硬件
智购科技自动售卖机厂家10 小时前
从STM32到RK3588——自动售货机嵌入式主控方案的架构演进~YH
stm32·嵌入式硬件·物联网·架构·lua·零售·symfony
stevenseahang11 小时前
C语言标准演化史:从K&R到GNU,谁才是正统?
c语言·gnu·可移植性·标准演化·ansic
振南的单片机世界11 小时前
2MHz/50MHz玄机:GPIO速度档选错,信号直接“烂尾”
arm开发·stm32·单片机·嵌入式硬件
Run_Teenage11 小时前
嵌入式:理解STM32文档和社区生态,工具链的选择与安装
stm32·单片机·嵌入式硬件
别动我齐刘海11 小时前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github