程序
TA0CCR0 中断
下面程序采用增计数模式,那么增加到TA0CCR0 就会产生TA0CCR0 中断,然后计数器自动清零,重新计数
【注意】:这是一个单源中断
#include<msp430f6638.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P4DIR |= BIT1; // P4.1 output
TA0CCTL0 = CCIE; // 开启TA0CCR0 的中断
TA0CCR0 = 50000;
TA0CTL = TASSEL__SMCLK + MC__UP + TACLR; // 时钟源选SMCLK,增计数模式,清零计数器
_BIS_SR(LPM0_bits + GIE); // Enter LPM0, enable interrupts
_NOP(); // For debugger
}
// Timer_A0 ISR
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void) // 注意这个中断向量
{
P4OUT
}
2 TAxIV中断
下面程序,由于是连续计数模式,计数器会从0到FFFF重复计数,但是又未设置TA0CCRn的值,所以只在0FFFFh的时候才产生TAIFG这个中断,这个中断的查询在TAxIV=14的位置
【注意】:这是多源中断
#include<msp430f6638.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P4DIR |= BIT1; // P4.1 output
TA0CTL = TASSEL__ACLK + MC__CONTINUOUS + TACLR + TAIE; // 时钟源为ACLK,连续计数模式,清空计数器,是能中断
__bis_SR_register(LPM3_bits + GIE);
//【区分】:__bic_SR_register()这个函数是和上面的作用相反,
//比如__bic_SR_register(LPM0_bits + GIE);是关闭低功耗并且关闭总中断
_NOP();
}
#pragma vector=TIMER0_A1_VECTOR // 这个中断向量和上面的程序不一样
__interrupt void TIMER0_A1_ISR(void)
{
switch(__even_in_range(TA0IV,14))// __even_in_range()本征函数,用于多源中断的查询。
{
case 0: break; // No interrupt
case 2: break; // CCR1 not used
case 4: break; // CCR2 not used
case 6: break; // reserved
case 8: break; // reserved
case 10: break; // reserved
case 12: break; // reserved
case 14: P4OUT ^= BIT1; // TAIFG
break;
default: break;
}
}
|