Arduino(16MHz) timer mechanism

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值