記一次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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章