#include <msp430.h>
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 output
TA1CCTL0 = CCIE; // CCR0 interrupt enabled
TA1CCR0 = 50000;
TA1CTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, contmode, clear TAR
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, enable interrupts
__no_operation(); // For debugger
}
// Timer1 interrupt service routine
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void)
{
P1OUT ^= 0x01; // Toggle P1.0
TA1CCR0 += 50000; // Add Offset to CCR0
}
//不少初学者看到这段程序总会疑问为什么采用的是连续计数模式,却还设定TACCR0 ,而且在中断服务函数中对TACCR0+50000。 其实解答疑问的关键在触发中断的方式。连续计数模式下,计数器TAR从0计数到65535 ,然后清零再循环计数。首次触发中断是在计数值为50000时,但要想保证下次触发中断仍是经过50000的话,就必须使得TACCR0增加50000,虽然增加50000会使得TACCR0的值因为对65535取模,但正因为计数模式是循环连续计数,使得下一次计数恰在50000个周期后。因此也就实现了方波的周期为100000个计数周期。同理,改变每次增加的数值,也就可以改变方波的周期频率。
本文来自论坛,点击查看完整帖子内容。