Arduino(16MHz) timer mechanism
针对多数情况,arduino参考材料中很少关于timer做详细的原理性解释,以下为个人根据大神们的文章抽象为一张流程图,方便大家对arduino中时钟的深入理解。
两个重要的函数原型:
unsigned long micros() {
unsigned long m;
uint8_t oldSREG = SREG; // 狀態寄存器(包括是否允許 Interrupt)
uint8_t t; // 臨時變量
cli(); // 禁止 Interrupt
m = timer0_overflow_count; // timer0 已經 overflow 幾次 ?
t = TCNT0; // timer0 目前的值
if ((TIFR0 & _BV(TOV0)) && (t & 255)) m++; // timer0 目前的TCNT0值不是 0且欠一次中斷
SREG = oldSREG; // 恢復狀態寄存器(注意不一定恢復中斷喔 !)
return ((m *256) + t) * 4; // 最大只能代表約 71.58分鐘
} // micros(
unsigned long millis( ) {
unsigned long m;
uint8_t oldSREG = SREG; //狀態寄存器(包括是否允許 Interrupt); 1clock
// disable interrupts while we read timer0_millis or we might get an
// inconsistent value (e.g. in the middle of a write to timer0_millis)
cli( ); // 禁止中斷; 1 clock
m = timer0_millis; // 讀取記憶體的全域變量 timer0_millis;8 clock
SREG = oldSREG; // 恢復狀態寄存器(注意不一定恢復中斷喔 !);1 clock
return m; // 6 clocks
} // millis( // total 17 clock cycles