关于定时器A的官方例子解读

//******************************************************************************
//  MSP-FET430P140 Demo - Timer_A, Toggle P1.0, CCR0 Cont. Mode ISR, DCO SMCLK
//
//  Description: Toggle P1.0 using software and TA_0 ISR. Toggles every
//  50000 SMCLK cycles. SMCLK provides clock source for TACLK.
//  During the TA_0 ISR, P1.0 is toggled and 50000 clock cycles are added to
//  CCR0. TA_0 ISR is triggered every 50000 cycles. CPU is normally off and
//  used only during TA_ISR.
//  ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz
//
//           MSP430F149
//         ---------------
//     /|\|            XIN|-
//      | |               |
//      --|RST        XOUT|-
//        |               |
//        |           P1.0|-->LED
//
//  M. Buccini
//  Texas Instruments Inc.
//  Feb 2005
//  Built with IAR Embedded Workbench Version: 3.21A
//******************************************************************************

#include  

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x01;                            // P1.0 output
  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  CCR0 = 50000;
  TACTL = TASSEL_2 + MC_2;                  // SMCLK, contmode

  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  P1OUT ^= 0x01;                            // Toggle P1.0
  CCR0 += 50000;                            // Add Offset to CCR0
}

关闭了看门狗,定义了二极管引脚为输出;
因为#define CCTL0 TACCTL0 /* Timer A Capture/Compare Control 0 */,
所以,先开启了 CCTL0 捕获/比较寄存器的中断使能。

因为#define CCR0 TACCR0 /* Timer A Capture/Compare 0 */
所以,设置了比较值为50000,(50000<65536).

因为#define TA0CTL TACTL /* Timer A Control /TA控制寄存器;
#define TASSEL_2 (2
0x100u) /* Timer A clock source select: 2 - SMCLK /
#define MC_2 (2
0x10u) /* Timer A mode control: 2 - Continous up */
所以时钟源用的是SMCLK ,工作方式是连续计数模式

连续计数模式的时候 TACCR0 做为一般捕获比较寄存器使用,所以只有能引起一个中断标志位
开启总中断,进入低功耗模式,等待中断唤醒
中断函数,为LED改变电平,并且给TACCR0 赋初值;(增加一定的偏移量)


#include  

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P2DIR |= BIT0 + BIT2;                            // P2.0 output
  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  CCR0 = 50000;
  TACTL = TASSEL_2 + MC_2 + TAIE;                  // SMCLK, contmode

  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void)
{
  P2OUT ^= 0x01;                            // Toggle P2.0
  CCR0 += 50000;                            // Add Offset to CCR0
}
// Timer A0 interrupt service routine
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1 (void)
{
  switch(TAIV)
  {
    case 2:break;
    case 4:break;
    case 10:P2OUT ^= 0x04;break;                // Toggle P2.0
      
  }                            
                
}

定时器TA中,针对定时器的中断有两个,一个是TAIFG一个是TACCR0 CCIFG;

上面的例子改编,我增加了一个小灯,使 TAIFG置位后引起中断改编小灯状态,发现两个中断并不影响

所以连续计数模式的时候CCR0相当于一个独立的计数器,相当于TAR,但是可以通过CCIE使能中断,

你可能感兴趣的:(MSP430,MSP学习资料,MSP430自学代码集)