MSP430F5529 上手小例程3
*利用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;
}
}
不能放視頻就放個圖片,就是五個小彩燈輪流閃爍
代碼來自:https://download.csdn.net/download/berrynard/11426569 博主是個搬運工並實踐了一下??? ↩︎