2025年记一次CubeMX+STM32+SD+DMA+FATFS文件写入错误的解决

记一次CubeMX+STM32+SD+DMA+FATFS文件写入错误的解决环境 CubeMX 5 2 1 HAL 库 1 15 0 STM32F765IIK 主频 180MHz 关闭 Cache SDMMC2 DMA FATFS R0 12c 测试程序

大家好,我是讯享网,很高兴认识大家。

环境:

CubeMX(5.2.1)

HAL库(1.15.0)

STM32F765IIK(主频180MHz,关闭Cache)

SDMMC2+DMA

FATFS(R0.12c)

 


讯享网

测试程序:

void sdcard_test_task(void *p) { static FATFS fs; FIL fil; uint32_t bw; const char *w = "1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234\r\n" "1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234\r\n" "1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234\r\n" "1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234\r\n" "1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234\r\n" "1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234\r\n" "1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234\r\n" "1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234\r\n" "1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234_1234\r\n"; if (f_mount(&fs, "0:", 1)) { __nop(); return; } while (1) { if (f_open(&fil, "ggg.txt", FA_OPEN_ALWAYS | FA_WRITE) == FR_OK) { f_lseek(&fil, f_size(&fil)); f_write(&fil, w, strlen(w), &bw); f_close(&fil); } else { __nop(); } HAL_Delay(100); } }

讯享网

问题:

程序运行一段时间后f_open一直返回FR_LOCKED错误

 

解决:

重新打开CubeMX,把FATFS的这栏选成Enable即可

其他:

  • 这个版本的CubeMX和HAL库使用SD卡必须打开DMA
  • 产生TXUNDERR错误:

解决办法是打开I,DCache

  • 别忘了栈可能要调大
  • 我在STM32F429I-DISCOVERY这个板子上也试过用CubeMX(5.4.0)生成的代码(HAL库V1.24.1)调试SD卡,也遇到了类似的问题。具体是SD卡可以写但不能读,读出错的原因是SDIO_FLAG_RXOVERR,解决办法是把HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B)中的SDIO_BUS_WIDE_4B改成SDIO_BUS_WIDE_1B
小讯
上一篇 2025-03-31 09:34
下一篇 2025-02-15 18:48

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/129517.html