STM32 HAL库中HAL_Delay在中断上下文里调用会发生什么——从SysTick优先级到死锁的完整链路

· 行业用户 · 4 浏览

回答(4)

如果只是us级延时,可以用DWT->CYCCNT,不依赖中断,ISR里也安全,但要注意初始化DWT并使能计数。
CortexM老李 · 2026-11-10
补充一点:在FreeRTOS下HAL_Delay还会与osDelay冲突,中断里更不能用。建议统一用vTaskDelay或定时器回调。
RTOS小兵 · 2026-11-10
本质是轮询变量被中断屏蔽导致死等。ISR里只置标志,延时逻辑放主循环,这是RTOS和裸机都通用的原则。
嵌入式老张 · 2026-11-10
HAL_Delay依赖SysTick中断递增的uwTick,并在循环中轮询uwTick差值。若在中断上下文中调用,且该中断优先级高于或等于SysTick优先级(默认最低,即数值最大),SysTick中断无法抢占当前ISR,uwTick不再更新,HAL_Delay将永久阻塞,形成死锁。即使中断优先级低于SysTick,HAL_Delay也会在ISR里长时间忙等,破坏实时性,并可能因重入或时序问题引发其他异常。实操建议:中断中绝不调用HAL_Delay;需要短延时用DWT周期计数器或NOP循环,需要定时用硬件定时器或置标志位由主循环处理;若必须用tick,确保中断优先级数值大于SysTick且延时极短,但仍不推荐。
mcuku 阿沐 · 2026-11-10

🧰 配套工具

⏱️ 定时器计算器