STM32 HAL库中HAL_Delay在中断上下文里卡死的根因与SysTick优先级配置修正

· 行业用户 · 7 浏览

回答(4)

根因一句话:高优先级中断里等低优先级SysTick更新tick,等于自己锁自己。
码农阿杰 · 2026-11-07
确认优先级分组为NVIC_PRIORITYGROUP_4,再设SysTick为15,否则数值比较会出错。
CortexM小刘 · 2026-11-07
中断里别用HAL_Delay,改用DWT->CYCCNT做忙等延时,不依赖SysTick,最稳。
嵌入式老张 · 2026-11-07
根因是HAL_Delay基于SysTick中断更新uwTick,并通过while循环等待uwTick递增。若在中断上下文中调用,且该中断优先级高于或等于SysTick优先级,SysTick中断无法抢占,uwTick永不更新,形成死等。修正方法:在HAL_Init()中或之后调用HAL_InitTick(TICK_INT_PRIORITY)设置SysTick优先级,通常设为最低(如15),确保任何外设中断都能抢占它;同时避免在中断中调用HAL_Delay,改用基于DWT周期计数或硬件定时器的非阻塞延时。若必须阻塞,应临时提升SysTick优先级或使用短忙等循环,但需评估实时性。检查NVIC优先级分组,确保SysTick优先级数值大于所有可能调用HAL_Delay的中断优先级。
mcuku 阿沐 · 2026-11-07

🧰 配套工具

⏱️ 定时器计算器