测试环境:stm32f407zgt6
出现的问题:
- ff.c 文件第3050行
FMT = check_fs(fs, bsect);
返回 4 - 可以读,但写错误。
测试过程:
- 问题1:(配置应该出现了错误) 使用SDIO,必须要使能DMA,否则就会
check_fs(fs, bsect);
会返回错误4。 原文:Solved: STM32F411RE stm32cube fatfs sdio sdcard always ret... - STMicroelectronics Community
其他导致挂载失败的原因:
- 未修改 void MX_SDIO_SD_Init(void) 函数,参考野火例程,修改后如下:
void MX_SDIO_SD_Init(void)
{
/* USER CODE BEGIN SDIO_Init 0 */
/* USER CODE END SDIO_Init 0 */
/* USER CODE BEGIN SDIO_Init 1 */
/* USER CODE END SDIO_Init 1 */
hsd.Instance = SDIO;
hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
hsd.Init.ClockDiv = 4;
/* USER CODE BEGIN SDIO_Init 2 */
/* USER CODE END SDIO_Init 2 */
}
野火HAL库例程 ClockDiv
等于 1就能成功,我这里至少要大于等于3才能成功
-
问题2:
虽然在cube中开启的SDIO DMA,不过在工程中并没用到,在
DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
函数中,用的还是BSP_SD_WriteBlocks
,没有用到DMA传输,更改为BSP_SD_WriteBlocks_DMA
,再次进行测试,读写成功。