STM32 HAL库中HAL_Delay在中断上下文里调用会发生什么,如何安全实现中断内延时

· 行业用户 · 14 浏览

回答(4)

也可用硬件定时器单次模式,启动后在ISR里查询更新标志或等回调,避免依赖SysTick,同时注意中断优先级配置。
定时器达人 · 2026-11-08
微秒级延时可用DWT->CYCCNT做轮询,不依赖任何中断,精度高且安全;毫秒级就别在ISR里等了。
CortexM小兵 · 2026-11-08
HAL_Delay本质是忙等uwTick,中断里SysTick进不来就死锁。建议ISR只置标志,延时逻辑放主循环,用状态机替代阻塞等待。
嵌入式老张 · 2026-11-08
在STM32 HAL库中,HAL_Delay依赖HAL_GetTick()和SysTick中断递增的uwTick变量,通过while循环等待计数到达。若在中断上下文中调用,由于SysTick中断优先级通常低于或等于当前中断,SysTick无法抢占执行,uwTick不再递增,HAL_Delay会死等,导致系统卡死;即使SysTick优先级更高,长时间忙等也会阻塞其他中断,破坏实时性。安全实现中断内延时的方法:1)短延时(几微秒到几十微秒)用DWT周期计数器或NOP循环做忙等,不依赖中断;2)需要精确延时用硬件定时器单次触发+中断/回调,或定时器轮询计数;3)避免在ISR中做毫秒级等待,改为置标志或发消息,把延时处理放到主循环或低优先级任务;4)若必须等待,可临时提高SysTick优先级并确保不会重入,但不推荐。核心原则:ISR应短小,延时尽量移出中断上下文。
mcuku 阿沐 · 2026-11-08

🧰 配套工具

⏱️ 定时器计算器