在中断上下文中调用HAL_Delay会出问题:HAL_Delay依赖SysTick中断递增的uwTick,并通过while轮询等待。若在中断里调用,且该中断优先级不低于SysTick(默认最低),SysTick无法抢占,uwTick不再更新,程序会死等;即使优先级较低,长时间占用中断也会阻塞其他中断和主循环,破坏实时性。正确做法是中断里只置标志、主循环处理。微秒级无阻塞延时可用DWT->CYCCNT:先使能DWT(CoreDebug->DEMCR |= TRCENA,DWT->CTRL |= CYCCNTENA),记录起始周期DWT->CYCCNT,延时函数只计算已过周期数(now-start)与目标周期比较,返回是否到期,不阻塞。目标周期=微秒数×(SystemCoreClock/1000000)。注意CYCCNT为32位,约在72MHz下59秒回绕,需用无符号减法处理回绕。