You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nucleo L4R5ZI-P开发板HAL_Delay死循环及SDMMC初始化异常求助

问题原因及解决方法

核心原因

  1. SDMMC1初始化失败触发死循环:Nucleo-L4R5ZI-P板载SD卡槽,STM32CubeMX默认启用SDMMC1外设并生成MX_SDMMC1_SD_Init()初始化函数。若未插入SD卡,初始化会因超时触发Error_Handler()死循环,直接卡住程序。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 23:45:16