TAIV:

#define TAIV_TACCR1 (0x0002)

#define TAIV_TACCR2 (0x0004)

#define TAIV_TAIFG (0x000A)

TIMERA1_VECTOR是一个中断向量,主要处理CCR1,CCR2,以及定时器A溢出的中断标志,而CCR1,CCR2,以及定时器A产生中断是的TAIV是不同的,分别是2,4,10


switch( TAIV ) { case 2: break; case 4: break; case 10: P3OUT ^= BIT4; break; }

这一句的意思是,判断是哪个产生中断的,以执行不懂的程序,当然,在里面没写有,但是当你自己去写的时候可自己加进去。

CCR0,CCR1,CCR2

分别是比较/捕获模块1,2,3的比较/捕获寄存器,一般CCR0用来控制周期。

至于具体怎么应用,这是很难解释的,解释了可能你还是不同。最好的办法就是一边写程序,一边查书。


定时器A


现在的认识:

MSP430 5438 有3个时钟,分别是 TA0、TA1 和TB

了解了定时器A的用法:

定时器A可以分成几个独立的时间周期。这几个时钟周期共用一个计数器TA1R 或TA0R。


在头文件中可以查到:


#define TIMER1_A1_VECTOR    (48 * 2u)

 #define TIMER1_A0_VECTOR    (49 * 2u)

#define TIMER0_A1_VECTOR    (53 * 2u)

#define TIMER0_A0_VECTOR    (54 * 2u)


TIMER0 含 TA0CCR0- TA0CCR4 五个

TIMER1 含 TA1CCR0- TA1CCR2 三个

TA0CCR0 对应中断向量 A0_VECTOR

TA0CCR1-4 对应中断向量 A1_VECTOR


 //A0定时器,用于界面处理

  TA0CCTL0 = CCIE;                          // CCR0 interrupt enabled

  TA0CCTL1 = CCIE;                          // CCR1 interrupt enabled//时间周期1使能

  TA0CCTL2 = CCIE;                          // CCR2 interrupt enabled//时间周期2使能

 TA0CCTL3= CCIE;                          // CCR3 interrupt enabled//时间周期3使能

 //TA0CCTL4= CCIE;                          // CCR3 interrupt enabled//时间周期3使能

  TA0CCR0=256;//TA0R 计数到65535才清零。

  TA0CCR1=4096;  //1s

  TA0CCR2=1024; //1/4

  TA0CCR3=8192;  //2s


TA0CTL = TASSEL_1+ID_3 + MC_2 + TACLR+ TAIE; // ACLK, 8分频,MC_2:连续模式, clear TAR


// Timer1 A0 interrupt service routine

#pragma vector=TIMER0_A0_VECTOR

__interrupt void Timer_A0 (void)

{

 // TA0CCR0 += 64;// Add Offset to CCR0

  TA0CCR0 += 256;// 1/16s Add Offset to CCR0

  if(ReadUART0_new>0)

    ReadUART0_new--;

   if(ReadUART1_new>0)

    ReadUART1_new--;


}

// Timer_A3 Interrupt Vector (TAIV) handler

#pragma vector=TIMER0_A1_VECTOR

__interrupt void TIMER0_A1_ISR(void)

{

  switch(__even_in_range(TA0IV,14))

  {

  case 0:   

    break;

  case 2:

    TA0CCR1 +=4096;                //1s  Add Offset to CCR1

    SecondReach=1;

    CountToMunite++;

    SecondTimecount++;

    if(waringstatus>0)

    {

      //buzzer();

     // waringlight();

    }

    break;                         // CCR4 not used

  case 4:

    TA0CCR2+= 1024;                // 1/2s Add Offset to CCR2

   // buzzer();

   // waringlight();

    break;

  case 6:

    spark++;

     TA0CCR3+=8192;                // 2s Add Offset to CCR3

  // buzzer();

   // waringlight();

    break;

  case 8:

    break;                         // CCR3 not used

  case 10:

    break;                         // CCR5 not used

  case 12:

    break;                         // Reserved not used

  case 14: