STM32 中断服务函数里能延时吗?

STM32 · 9 浏览
STM32 中断服务函数里能延时吗?

回答(4)

非要延时几十微秒,可以用`for(i=0;i<100;i++);`但编译器会优化掉,得用volatile或者__NOP()。不过还是建议设计上避免。
硬件小白 · 2026-08-14
如果只是滤个抖动,可以用定时器输入捕获或硬件滤波器,别用软件延时占着中断。代码简单,系统也稳。
码农阿杰 · 2026-08-14
补充一点:HAL_Delay在中断里用会卡死,因为SysTick中断优先级默认最低,进不了中断就永远超时。我有次坑了好久,切记!
老陈嵌入式 · 2026-08-14
不建议在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

🧰 配套工具

⏱️ 定时器计算器