標籤:
MSP430G2553包含了兩個16-bit Timer_A計時/計數器。本文簡單介紹了Timer_A的功能和寄存器使用,本文及後續的隨筆部分參考了"Scientific Instrument Using the TI MSP430"部落格。該部落格的MSP430教程文章非常好,建議對MSP430感興趣的人FQ閱讀。
一、介紹
Timer_A可實現的功能有
- multiple compare:判斷計時器時間是否到達設定條件,觸發事件
- multiple capture:捕獲某個事件發生的時間
- PWM output:脈衝調製訊號輸出
- interval timing
Timer_A的構造框圖如下所示。
二、Timer Block
- 包含了一個16-bit的timer/counter寄存器TAR。
- 時鐘源可以由TAxCTL寄存器的TASSELx欄位選擇,為SMCLK、ACLK、TACLK、INCLK四者中的一個。其中TACLK、INCLK為外部輸入的訊號,對應管腳需查看具體晶片手冊。
- 分頻比由TAxCTL寄存器的IDx欄位選擇,支援1/2/4/8分頻。
- Timer的開關及運行模式由TAxCTL寄存器的MCx欄位選擇,預設為00(Timer關閉)。運行模式支援up mode, continuous mode, up/down mode 三種,如所示。調試中發現,修改MCx時會將TASSELx和IDx清零。
- 將TAxCTL寄存器的TACLR置0,可實現將TAR清零,同時TAxCTL寄存器的IDx、MCx欄位也會被清零。
- Timer overflow時可產生中斷,由TACTL寄存器的TAIE使能,中斷標誌位為TACTL寄存器的TAIFG位。
三、Compare Block
- 每個Timer_A包含兩個(TAxCCR0、TAxCCR1)或三個(TAxCCR0、TAxCCR1、TAxCCR2)capture/compare register。如MSP430G2553的每個Timer_A包含三個capture/compare register。
- compare模式可以產生PWM訊號,和特定時間間隔的中斷。
- compare模式由TAxCCRx寄存器的CAP=0來使能。
- 當TAR寄存器計數到TAxCCRx寄存器的值時,可觸發中斷,由TAxCCTLx寄存器中的CCIE位使能,中斷標誌位為TAxCCTLx寄存器中的CCIFG位。
四、Capture Block
- capture模式可用時間測量、速度計算。
- 外部輸入訊號為CCIA或CCIB,對應管腳需查看具體晶片手冊。
- capture模式由TAxCCRx寄存器的CAP=1及CMx欄位來使能。
- 捕獲條件由TAxCCRx寄存器的CMx欄位設定,預設為00(關閉)。捕獲條件可以為僅上升沿、僅下降沿、上升/下降沿三種之一。
- 建議設定TAxCCRx寄存器的SCS位,從而將捕獲產生訊號與時鐘訊號同步。
- 當上一次捕獲產生訊號被讀取前又有了新的捕獲產生訊號、即capture overflow時,TAxCCRx寄存器的COV標誌位會置1。
- 捕獲事件發生時,產生的中斷標誌位與compare模式相同,為TAxCCTLx寄存器中的CCIFG位。亦由TAxCCTLx寄存器中的CCIE位使能。
五、一個簡單例子
利用MSP430G2553 Timer0_A的compare mode,產生頻率為0.1Hz的方波,驅動LED進行顯示。代碼在中斷程式中又進行了一次計數,以實現長時間間隔定時。
1 #include "io430.h" 2 3 #define LED1 BIT0 //red led on G2 Launchpad 4 5 //global variables 6 char i = 0; 7 8 void main(void) 9 {10 // Stop watchdog timer to prevent time out reset11 WDTCTL = WDTPW + WDTHOLD;12 13 P1OUT = 0;14 P1DIR |= LED1;15 16 // set DCO freq = 1MHz17 BCSCTL1 = CALBC1_1MHZ;18 DCOCTL = CALDCO_1MHZ;19 20 // BCM+ initial state:21 // DCOCLK -> MCLK22 // DCOCLK -> SMCLK23 // comprare/capture mode -> compare mode24 25 TA0CCR0 = 62550 - 1;26 TA0CCTL0 = CCIE; // enable compare interrupt27 TA0CTL = TASSEL_2 + ID_3 + MC_1 + TACLR;28 // input clock: SMCLK/8 -> 125kHz; 29 // timer overflow freq: 125k/(TA0CCR0+1) -> 2Hz30 // clear and start the timer, up mode31 32 __enable_interrupt();33 34 while(1)35 {36 37 }38 39 }40 41 //interrupt service routines42 #pragma vector = TIMER0_A0_VECTOR43 __interrupt void CCR0_ISR(void)44 {45 if(++i == 10) // interval: 1/2 * 10 = 5s, freq: 0.2Hz46 {47 // no flag clearing necessary; CCR0 has only one source, 48 // so it‘s automatic.49 P1OUT ^= LED1; // the sqaure wave freq: 0.2Hz/2 -> 0.1Hz50 i = 0;51 }52 }
MSP430 G2553 計時/計數器 Timer_A