有的时候要精细计时,16bit不够用需要32位。可以用软件的方式实现。修改: - TACTL = TASSEL_1 + MC_2; // ACLK, continuous mode.
复制代码开启TA的中断(timer值到达0xFF时发生中断,置TAIFG标志位) - TACTL = TASSEL_1 + MC_2 + TAIE; // ACLK, continuous mode, interrupt enabled.
复制代码
然后增加一个全局变量: - volatile unsigned int CCRy = 0;
复制代码并且在修改TAIV_ISR(TIMER0_A1_VECTOR)的代码,增加TAIFG的判断: volatile unsigned int CCRx = 0; #pragma vector=TIMER0_A1_VECTOR __interrupt void TAIV_ISR(void){ unsigned long interval; if(TACCTL1 & CCIFG){ TACCTL1 &= ~CCIFG; P1OUT ^= BIT0; interval = (CCR1 - CCRx) + (CCRy << 16); // 32bit now ^ ^ CCRx = CCR1; CCRy = 0; } if(TACTL & TAIFG){ // timer overflow TACTL &= ~TAIFG; CCRy ++; } }
复制代码同理还可以扩展到64位、128位、1048576位
[ 本帖最后由 elulis 于 2012-7-16 03:11 编辑 ] |