×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-08-25 发布时间:
|

//******************************************************************************

//  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 (20x100u) /* Timer A clock source select: 2 - SMCLK /

#define MC_2 (20x10u) /* 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使能中断



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32单片机的复用端口初始化的步骤及方法