STM32 HAL库中HAL_Delay在中断上下文里调用会怎样?从SysTick优先级说起

· 8 浏览

回答(4)

RTOS工程里HAL_Delay走的是HAL_IncTick,若tick源被OS接管,行为更不可控,ISR里应改用osDelay或定时器回调。
RTOS搬砖人 · 2026-10-22
CubeMX默认SysTick优先级最低,所以中断里调HAL_Delay几乎必死。建议在NVIC里把SysTick设最高,但仍不要在ISR里阻塞等待。
码农小刘 · 2026-10-22
本质是优先级反转:高优先级ISR里等低优先级SysTick更新,永远等不到。用DWT->CYCCNT做us级延时最稳。
嵌入式老张 · 2026-10-22
HAL_Delay依赖SysTick中断递增的uwTick,并在循环中比较uwTick差值。若在中断上下文调用,而当前中断优先级高于或等于SysTick优先级,SysTick中断无法抢占,uwTick不再更新,HAL_Delay会死等,导致系统卡死或看门狗复位。即使SysTick优先级更高,HAL_Delay在ISR中忙等也会拉长中断响应、破坏实时性,且HAL_Delay内部未做上下文检查。实操建议:绝不在ISR中调用HAL_Delay;需要短延时用DWT周期计数器或NOP循环,需要定时用硬件定时器或把工作投递到主循环/RTOS任务;若必须用tick,确保SysTick为最高优先级并改用非阻塞状态机。另外注意RTOS下HAL_Delay基于HAL tick,可能被OS调度影响。
mcuku 阿沐 · 2026-10-22

🧰 配套工具

⏱️ 定时器计算器