Nucleo L4R5ZI-P开发板HAL_Delay死循环及SDMMC初始化异常求助
问题原因及解决方法
核心原因
- SDMMC1初始化失败触发死循环:Nucleo-L4R5ZI-P板载SD卡槽,STM32CubeMX默认启用SDMMC1外设并生成
MX_SDMMC1_SD_Init()初始化函数。若未插入SD卡,初始化会因超时触发Error_Handler()死循环,直接卡住程序。 - SysTick计数被干扰导致HAL_Delay失效:SDMMC初始化过程中,其中断优先级可能被配置为高于SysTick,或者初始化失败后的死循环占用CPU,导致
HAL_GetTick()无法正常更新系统滴答计数,进而使HAL_Delay()陷入死循环(HAL_Delay依赖uwTick变量的递增)。
解决方法
方法1:禁用不需要的SDMMC1外设(推荐,若无需SD卡功能)
- 打开STM32CubeMX工程,进入Pinout & Configuration界面。
- 在Connectivity分类下找到SDMMC1,右键选择Disable。
- 重新生成代码,工程中将不再包含
MX_SDMMC1_SD_Init()函数,既避免初始化失败,也不会干扰SysTick运行。
方法2:修复SDMMC初始化逻辑(若需要SD卡功能)
- 添加卡检测逻辑:在调用
MX_SDMMC1_SD_Init()前,先检测SD卡是否存在。Nucleo板的SD卡槽一般有卡检测引脚(如PC13),通过读取该GPIO电平判断卡是否插入,仅当卡存在时才执行初始化:// 示例:在main()中MX_SDMMC1_SD_Init()前添加 GPIO_PinState cardDetected = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13); if(cardDetected == GPIO_PIN_RESET) { // 卡检测引脚低电平表示有卡(根据硬件定义调整) if(HAL_OK != MX_SDMMC1_SD_Init()) { // 自定义错误处理,而非进入死循环 Error_Handler_Custom(); } } - 修改Error_Handler逻辑:将默认的死循环改为可反馈的处理,比如:
void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ __disable_irq(); while(1) { // 添加LED闪烁提示错误,而非完全卡死 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15); HAL_Delay(500); } /* USER CODE END Error_Handler_Debug */ }
方法3:调整NVIC优先级确保SysTick正常运行
- 打开STM32CubeMX的NVIC配置界面。
- 找到SysTick,将其抢占优先级设置为比SDMMC1的抢占优先级更高(STM32中优先级数值越小,优先级越高)。
- 重新生成代码,确保SysTick中断不会被SDMMC中断抢占,保证
uwTick变量能持续更新,HAL_Delay()即可正常工作。
内容的提问来源于stack exchange,提问作者Saar
相关产品推荐
相关产品推荐

