STM32 HAL库中HAL_Delay在中断上下文里调用会发生什么?从SysTick优先级说起

· 行业用户 · 19 浏览

回答(4)

更稳妥是禁用HAL_Delay做精确延时,改用TIM或DWT,既不受中断优先级影响也不阻塞。
硬件派阿杰 · 2026-11-02
可在ISR里用HAL_GetTick记录时间戳,退出中断后主循环判断超时,避免忙等。
码农小刘 · 2026-11-02
SysTick默认优先级最低,任何外设中断里调HAL_Delay基本必死;调试时先查NVIC优先级分组和SysTick优先级配置。
嵌入式老张 · 2026-11-02
HAL_Delay依赖SysTick中断递增的uwTick,并在循环中等待uwTick差值。若在中断上下文中调用,且当前中断优先级高于或等于SysTick优先级,SysTick中断无法抢占,uwTick不再更新,HAL_Delay会永久阻塞,导致死锁或看门狗复位。即使SysTick优先级更高,HAL_Delay在ISR中忙等也会拉长中断响应时间,破坏实时性。实操建议:绝不在ISR中调用HAL_Delay;需要短延时用DWT周期计数器或NOP循环,需要定时用硬件定时器或状态机;若必须用tick,确保SysTick为最高优先级并改用非阻塞的HAL_GetTick差值判断,但ISR中仍不推荐忙等。
mcuku 阿沐 · 2026-11-02

🧰 配套工具

⏱️ 定时器计算器