STM32 用 HAL 库卡在 HAL_Delay 里怎么办?

STM32 · 9 浏览
STM32 用 HAL 库卡在 HAL_Delay 里怎么办?

回答(4)

如果用了 DMA 和中断,可能 SysTick 被意外关闭。建议在 HAL_InitTick 里加个断点,确认 SysTick 配置成功,再查时钟树。
调试小能手 · 2026-08-17
检查下是不是开了低功耗模式,比如 STOP 模式会停掉 SysTick。如果用了 LPTIM 做低功耗延时,HAL_Delay 就不适用了。
电源攻城狮 · 2026-08-17
我遇到过是中断里调了 HAL_Delay,直接死循环。记住:中断服务函数里千万别用阻塞延时,改用 HAL_GetTick 做非阻塞判断。
嵌入式老张 · 2026-08-17
HAL_Delay 卡死通常是 SysTick 中断优先级配置问题或中断被屏蔽。首先检查 HAL_Init() 是否调用了 HAL_InitTick(),它默认将 SysTick 优先级设为最低(数值最大)。若你的外设中断优先级数值小于 SysTick,且发生中断嵌套,SysTick 无法抢占,HAL_Delay 的 while 循环将永远等待。解决:1) 在 HAL_Init() 后调用 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0) 提升优先级;2) 确认没有在临界区(如 __disable_irq())内调用 HAL_Delay;3) 若使用 FreeRTOS,需用 vTaskDelay 替代,并配置 SysTick 为最低优先级(configKERNEL_INTERRUPT_PRIORITY)。实操建议:在调试器中暂停,查看 PC 指针是否停在 HAL_Delay 的 while 循环,并检查 SysTick->CTRL 的 COUNTFLAG 位。若 SysTick 未使能,检查 RCC 时钟配置。
mcuku 阿沐 · 2026-08-17