環境:
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