解决办法:MX_SDIO_SD_Init里的hsd.Init.BusWide改为SDIO_BUS_WIDE_1B;
SDIO配置图:
在这里配置好之后
cubemx会生成如下代码:
/**
* @brief SDIO Initialization Function
* @param None
* @retval None
*/
static 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_4B;
hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
hsd.Init.ClockDiv = 1;
if (HAL_SD_Init(&hsd) != HAL_OK)
{
Error_Handler();
}
if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SDIO_Init 2 */
/* USER CODE END SDIO_Init 2 */
}
这时候程序会卡死在MX_SDIO_SD_Init()不往下执行,排查了很长时间,最后看到一个博主的文章之后恍然大悟
然后对比了正点原子的代码后发现确实是这里出的问题,正点原子代码:
/**
* @brief 初始化SD卡
* @param 无
* @retval 返回值:0 初始化正确;其他值,初始化错误
*/
uint8_t sd_init(void)
{
uint8_t SD_Error;
/* 初始化时的时钟不能大于400KHZ */
g_sdcard_handle.Instance = SDIO;
g_sdcard_handle.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; /* 上升沿 */
g_sdcard_handle.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; /* 不使用bypass模式,直接用HCLK进行分频得到SDIO_CK */
g_sdcard_handle.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; /* 空闲时不关闭时钟电源 */
g_sdcard_handle.Init.BusWide = SDIO_BUS_WIDE_1B; /* 1位数据线 */
g_sdcard_handle.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; /* 关闭硬件流控 */
g_sdcard_handle.Init.ClockDiv = SDIO_TRANSF_CLK_DIV; /* SD传输时钟频率最大25MHZ */
SD_Error = HAL_SD_Init(&g_sdcard_handle);
if (SD_Error != HAL_OK)
{
return 1;
}
HAL_SD_GetCardInfo(&g_sdcard_handle, &g_sd_card_info_handle); /* 获取SD卡信息 */
SD_Error = HAL_SD_ConfigWideBusOperation(&g_sdcard_handle, SDIO_BUS_WIDE_4B); /* 使能宽总线模式 */
if (SD_Error != HAL_OK)
{
return 2;
}
return 0;
}
配置的时候用的1位,但是初始化用的4位,不清楚哪里出了问题,如果有想法请评论区告知。
参考链接:STM32CubeMX教程28 SDIO - 使用FatFs文件系统读写SD卡_stm32cubemx fatfs-CSDN博客博主写的非常详细,建议看看