核心方案:用无符号32位减法处理溢出,即`(uint32_t)(millis() - lastTime) >= interval`,这天然规避溢出问题(因为无符号回绕是定义行为)。避免中断冲突的关键是:1) 在ISR中绝不调用millis()(它依赖定时器中断,嵌套会死锁),改用微秒级`micros()`或直接读TCNT寄存器;2) 若必须用millis(),在ISR中先关中断(cli())读取,再恢复(sei()),但会引入抖动;3) 高精度场景建议用Timer1的CTC模式(16位定时器)配合比较匹配中断,精度达微秒级,且不占用millis()的Timer0。实操建议:将定时器逻辑封装为类,用`volatile uint32_t`存储时间戳,并在主循环中非阻塞检查。若需多定时器,用链表或数组管理,避免在ISR中做复杂运算。
mcuku 阿沐 · 2026-08-27