*利用Timer_A比较模式的多路定时,让LED闪烁
查阅资料得知:
MSP430有两类定时器:Timer_A(3个)&Timer_B(1个)。
其中,每个定时器都配有不同的捕获比较寄存器:Timer0_A(5个)、Timer1_A(3个)、Timer2_A(3个)、Timer0_B(7个)。
F5529的芯片管脚图如下图所示:
可以看出,P1.1-P1.5即为Timer0_A的五个捕获比较寄存器。这里没用TA0CCR0,是因为它优先级最高,有一个专门的中断向量。
计数器存放计数值最大为0xFFFF,因此我们把它分为五段,由于采用连续模式,当计数器达到TA0CCR1的值,即13107时,中断标志CCIFG位置位,同时TAIFG中断标志置位。依次类推,直至溢出。
代码如下1
#include <msp430.h>
#include <msp430f5529.h>
/**
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
P1DIR |= (BIT1+BIT2+BIT3+BIT4+BIT5+BIT6);
P1OUT = 0x00;
TA0CCTL1 = CCIE; //捕获比较寄存器开启CCIFG位中断
TA0CCR1 = 13107; //植入要比较的值0xffff/5=13107
TA0CCTL2 = CCIE;
TA0CCR2 = 26214;
TA0CCTL3 = CCIE;
TA0CCR3 = 39321;
TA0CCTL4 = CCIE;
TA0CCR4 = 52428;
TA0CTL |= TACLR + TAIE; //开启中断并清零
TA0CTL |= TASSEL_1 + MC_2 + TAIE; //选择ACLK=32.768KHZ为时钟,连续模式,开中断
__enable_interrupt();
while(1);
return 0;
}
#pragma vector = TIMER0_A1_VECTOR
__interrupt void Timer(void)
{
switch(__even_in_range(TA0IV,14))
/*只有在TA0IV的值为0-14的偶数的时候才执行switch内的语句,
可以提高switch语句的效率*/
{
case 2:
P1OUT=BIT6;
break;
case 4:
P1OUT=BIT2;
break;
case 6:
P1OUT=BIT3;
break;
case 8:
P1OUT=BIT4;
break;
case 14: //定时器溢出
P1OUT=BIT5;
break;
default:
break;
}
}
不能放视频就放个图片,就是五个小彩灯轮流闪烁
|