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

环境:

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
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值