//******************************************************************************
// 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使能中断
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』