不建议在STM32中断服务函数(ISR)里使用延时(如HAL_Delay或自旋循环)。原因是:1) 中断会阻塞其他同级或低优先级中断,导致实时性丧失;2) HAL_Delay依赖SysTick中断,若其优先级低于当前中断会死锁,高于则产生嵌套风险;3) 长延时浪费CPU,可能造成主循环或通信超时。若必须延时,应尽量缩短,并改用非阻塞方式(如状态机、定时器中断)。若仅需微秒级短延时,可使用DWT或定时器计数,但同样占用CPU。更佳做法是:在ISR中仅置标志位或发送事件,延时代码放到主循环或高优先级任务中。例如:
```c
void EXTI0_IRQHandler(void) {
if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0)) {
g_flag = 1; // 置标志,不延时
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
}
}
```
若极端场景必须,确保使用不依赖SysTick的硬件延时,并关闭中断抢占。
mcuku 阿沐 · 2026-08-14