msp430學習筆記之定時器A
阿新 • • 發佈:2019-02-13
1 相關知識
1 定時器a圖解 圖 1 定時器A圖解 2 定時器A的四種計數模式1. 停止模式。
2. 增計數模式。(產生兩個中斷標誌)
當計數到跟TACCR0一樣的時候,就返回0,重新計數。當計數到TACCR0的同時產生一箇中斷標誌CCIFG,而當計數器溢位返回零的同時又同時產生一箇中斷標誌TAIFG。如圖:
圖 2 增計數模式的時序圖
3.連續計數模式(產生一箇中斷標誌)
計數器將直接計數到計數器所能計數的最大值0FFFFH之後重新返回零,再次計數。返回零的同時產生一個TAIFG中斷標誌。如圖
圖3 連續技術模式的時序圖
如果相應中斷位允許,每當一個定時間隔到都會產生中斷請求,在連續計數模式下,須將下一事件發生的時間在當前中斷程式中加到CCRx中,如圖4,下次發生中斷的時間等於在CCR0a發生中斷時刻,CCR0 = CCR0a +
Δt
圖 4 連續計數模式下中斷與CCRx關係
4 增減計數模式(產生兩個中斷標誌)
當計數器計數到跟TACCR0一樣的之後,然後從TACCR0開始又減少,直到為零,然後又開始增。當計數跟TACCR0一樣的時候產生一箇中斷標誌CCIFG,當減到為零的時候又產生一箇中斷標誌TAIFG。如圖:
圖 5 增減計數模式時序圖
相關暫存器這裡就不一一介紹了,可以翻閱資料手冊
2 程式碼實現
//本平臺 msp430f149 #include <msp430f149.h> volatile unsigned char count = 0,flag = 0; void P2_config(){ P2DIR = 0x80; P2OUT = 0xff; } void select_xt2(void){ unsigned char i; /*------選擇系統主時鐘為8MHz-------*/ BCSCTL1 &= ~XT2OFF; do{ IFG1 &= ~OFIFG; //清除晶振失敗標誌 for (i = 0xFF; i > 0; i--); //等待8MHz晶體起振 }while ((IFG1 & OFIFG)); BCSCTL2 |= SELM_2 + SELS ; //MCLK和SMCLK選擇高頻晶振 } void main(){ WDTCTL = WDTPW + WDTHOLD; // 關狗 select_xt2(); //8MHz晶振 P2_config(); CCTL0 = CCIE; // CCR0 中斷使能 CCR0 = 10000; TACTL = TASSEL_2 + MC_2 + ID_3; // SMCLK = 1MHz, 連續計數模式 _EINT(); // 開啟全域性中斷 while(1){ if(count == 50){ count = 0; P2OUT ^= BIT7 ; } } } // Timer A0 中斷服務函式 #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { count ++; CCR0 += 10000; // 下次中斷時間裝入CCR0中 }