上一節講了16位定時器1,本節講8位定時器3和定時器4!html
一、綜述ide
Timer 3 and Timer 4 are two 8-bit timers(8位定時器). Each timer has two independent capture/compare channels(獨立的捕獲/比較通道),each using one I/O pin per channel.函數
Features:post
· Two capture/compare channels
· Set, clear or toggle output compare
· Clock prescaler for divide by 1, 2, 4, 8, 16, 32, 64, 128(分頻)
· Interrupt request generated on each capture/compare and terminal-count event
· DMA trigger functionui
二、8-Bit Timer Counterurl
#如何設置週期# 定時器3和定時器4全部功能都是基於8位定時計數器的。計數器在每一個時鐘邊沿遞增或遞減。活動時鐘邊沿的週期首先能夠經過寄存器CLKCONCMD.TICKSPD[2:0]來設定,更細的分頻能夠經過設置TxCTL.DIV[2:0]寄存器 (where x refers to the timer number, 3 or 4)。The counter operates as either a free-running counter, a down counter, a modulo counter or an up/down counter(自由運行計數器,倒計數器,模計數器,或正/倒計數器)。spa
#如何讀取計數器的值# It is possible to read the 8-bit counter value through the SFR register TxCNT, where x refers to the timer number, 3 or 4.設計
#中止和開始控制# 清除和暫停定時器是經過TxCTL控制寄存器來實現的。 The counter is started when a 1 is written to TxCTL.START. If a 0 is written to TxCTL.START, 保留在當前值。code
三、Timer 3/Timer 4 Mode Controlhtm
In general, the control register TxCTL is used to control the timer operation.
3.1 Free-Running Mode(自由計數模式)
在此模式,定時器從0x00開始計時,每次上升沿遞增。當值達到0xFF時,定時器被重置爲0x00並繼續計數。當最終達到0xFF(例如:發生一次溢出),中斷標誌位TIMIF.TxOVFIF被置1。若是設置了相應的中斷屏蔽位TxCTL.OVFIM爲1,就會產生一箇中斷請求。自由運行模式能夠用於產生獨立的時間間隔和輸出信號頻率。
3.2 Down Mode(倒計數模式)
在倒計數模式,定時器啓動以後,計數器載入TxCC0 的內容。而後計數器倒計時,直到0x00。當達到0x00時,設置標誌TIMIF.TxOVFIF。若是設置了相應的中斷屏蔽位TxCTL.OVFIM,就產生一箇中斷請求。定時器倒計數模式通常用於須要事件超時間隔的應用程序。
3.3 Modulo Mode(模模式)
當定時器運行在模模式,8 位計數器在0x00 啓動,每一個活動時鐘邊沿遞增。當計數器達到寄存器TxCC0所含的最終計數值時,計數器復位到0x00,並繼續遞增。當發生這個事件時,設置標誌IMIF.TxOVFIF 。若是設置了相應的中斷屏蔽位TxCTL.OVFIM,就產生一箇中斷請求。模模式能夠用於週期不是0xFF 的應用程序。
3.4 Up/Down Mode(正/倒計數模式)
在正/倒計數定時器模式下,計數器反覆從0x00 開始正計數,直到達到TxCC0 所含的值,而後計數器倒計數,直到達到0x00。這個定時器模式用於須要對稱輸出脈衝,且週期不是0xFF 的應用程序。所以它容許中心對齊的PWM 輸出應用程序的實現。
注意:經過寫入TxCTL.CLR 清除計數器也會復位計數方向,即從0x00 模式正計數!!!
這四種模式其實區別不大,自由模式是從0x00到0xFF,而後再從0x00到0xFF;倒計數模式是從設定值(TxCC0)開始倒着計數,直到0x00;模模式則是從0x00->TxCC0,而後再從0x00繼續重複以前的循環;正倒計數模式和模模式不一樣之處是當達到TxCC0以後,而是從TxCC0倒着計數到0x00。
四、通道模式控制
對於通道0 和1,每一個通道的模式是由控制和狀態寄存器TxCCTLn 設置的,其中n 是通道號碼0 或1。設置包括捕獲和比較模式。
五、輸入捕獲模式
當一個通道配置爲一個輸入捕獲通道,通道相關的I/O 引腳配置爲一個輸入。定時器啓動以後,輸入引腳上的一個上升沿、降低沿或任何邊沿都會觸發一個捕獲,即捕獲8 位計數器內容到相關的捕獲寄存器中。所以,定時器可以捕獲一個外部事件發生的時間。
注意:在定時器使用一個I/O 引腳以前,所需的I/O 引腳必須配置爲一個定時器3/定時器4 外設引腳。
通道輸入引腳與內部系統時鐘是同步的。所以,輸入引腳上的脈衝的最小持續時間必須大於系統時鐘週期。通道n 的8 位捕獲寄存器的內容從寄存器T3CCn/T4CCn 中讀出。當發生一個捕獲,對應實際通道的中斷標誌就被設置。這是TIMIF.TxCHnIF。若是相應的中斷屏蔽位TxCCTLn.IM 被設置,就產生一箇中斷請求。
插一句:這個輸入捕獲在設計汽車倒車雷達——多路超聲波測距時頗有用,一旦外部超聲波接收部分的濾波電路產生一個電平變化都會被捕獲到時間點,用來計算距離。
六、輸出比較模式
在輸出比較模式下,與該通道相關的I/O 引腳必須設置爲輸出。定時器啓動以後,the content of the counter is compared with the contents of channel compare register TxCC0n。若是比較寄存器等於計數器的內容,根據比較輸出模式TxCCTL.CMP1:0 的設置,輸出引腳被設置一、復位0或切換。注意當運行在一個給定的比較輸出模式下,輸出引腳上的全部邊沿都是無端障運行的。
For simple PWM use, output compare modes 4 and 5 are preferred.
Writing to compare register TxCC0 or TxCC1 does not take effect on the output compare value until the counter value is 0x00.
當一個比較發生時, 實際通道的相應的中斷標誌位就會被設置。該中斷標誌位即:TIMIF.TxCHnIF。若是相應的中斷屏蔽位TxCCTLn.IM被設置了,那麼就會產生中斷請求。(CC2530的中斷請求產生目前來看彷佛都須要設置相應的中斷屏蔽位!)
A compare output pin is initialized to the value listed in Table 6-1 when:
‘1’寫到TxCNTR.CLR(全部定時器x 通道)
0x7 寫到TxCCTLn.CMP(定時器x,通道n)
初始的比較輸出值(比較模式)
七、定時器3 和定時器4 中斷
爲這兩個定時器各分配了一箇中斷向量。他們是T3 和T4。當如下定時器事件之一發生時,將產生一箇中斷請求:
● 計數器達到最終計數值
● 比較事件
● 捕獲事件
SFR 寄存器TIMIF包含定時器3 和定時器4 的全部中斷標誌。寄存器位TIMIF.TxOVFIF 和TIMIF.TxCHnIF分別包含2 個最終計數值事件,以及四個通道捕獲/比較事件的中斷標誌。僅當設置了相應的中斷屏蔽位時,纔會產生一箇中斷請求。若是有其它未決的中斷,必須經過CPU,在一個新的中斷請求產生以前,清除相應的中斷標誌。並且,若是設置了相應的中斷標誌,使能一箇中斷屏蔽位將產生一個新的中斷請求。
八、定時器3 和定時器4 DMA 觸發
有兩個與定時器3 相關的DMA 觸發,一樣有兩個與定時器4 相關的DMA 觸發。這些觸發以下:
● T3_CH0:定時器3 通道0 捕獲/比較
● T3_CH1:定時器3 通道1 捕獲/比較
● T4_CH0:定時器4 通道0 捕獲/比較
● T4_CH0:定時器4 通道1 捕獲/比較
九、例子
上一節介紹的TIMER1中已經介紹,這裏timer3的初始化也大同小異,參照T3CTL便能明白初始化設置的含義,固然也必不可少開T3IE中斷和總中斷。這樣中斷請求就會被相應的中斷函數接收到。
代碼:
1 /**************************************************************************** 2 * 文 件 名: main.c 3 * 版 本: 1.0 4 * 描 述: 定時器T3經過中斷方式控制LED1週期性閃爍 5 ****************************************************************************/ 6 #include <ioCC2530.h> 7 8 typedef unsigned char uchar; 9 typedef unsigned int uint; 10 11 #define LED1 P1_0 // P1.0口控制LED1 12 13 uint count; //用於定時器計數 14 15 /**************************************************************************** 16 * 名 稱: InitLed() 17 * 功 能: 設置LED燈相應的IO口 18 * 入口參數: 無 19 * 出口參數: 無 20 ****************************************************************************/ 21 void InitLed(void) 22 { 23 P1DIR |= 0x01; //P1.0定義爲輸出 24 LED1 = 1; //使LED1燈上電默認爲熄滅 25 } 26 27 /**************************************************************************** 28 * 名 稱: InitT3() 29 * 功 能: 定時器初始化,系統不配置工做時鐘時默認是2分頻,即16MHz 30 * 入口參數: 無 31 * 出口參數: 無 32 ****************************************************************************/ 33 void InitT3() 34 { 35 T3CTL |= 0x08 ; //開溢出中斷 36 T3IE = 1; //開總中斷和T3中斷 37 T3CTL |= 0xE0; //128分頻,128/16000000*N=0.5S,N=62500 38 T3CTL &= ~0x03; //自動重裝 00->0xff 62500/255=245(次) 39 T3CTL |= 0x10; //啓動 40 EA = 1; //開總中斷 41 } 42 43 //定時器T3中斷處理函數 44 #pragma vector = T3_VECTOR 45 __interrupt void T3_ISR(void) 46 { 47 IRCON = 0x00; //清中斷標誌, 也可由硬件自動完成 48 if(count++ > 244) //245次中斷後LED取反,閃爍一輪(約爲0.5 秒時間) 49 { //通過示波器測量確保精確 50 count = 0; //計數清零 51 LED1 = ~LED1; //改變LED1的狀態 52 } 53 } 54 55 56 /**************************************************************************** 57 * 程序入口函數 58 ****************************************************************************/ 59 void main(void) 60 { 61 InitLed(); //設置LED燈相應的IO口 62 InitT3(); //設置T3相應的寄存器 63 while(1) 64 {}; 65 }
Zigbee系列文章:
[ZigBee] 三、ZigBee基礎實驗——GPIO輸出控制實驗-控制Led亮滅
[ZigBee] 五、ZigBee基礎實驗——圖文與代碼詳解定時器1(16位定時器)(長文)
PS:若是您以爲還不錯,點個贊,讓更多人受益~
@beautifulzzzz 2016-07-14 continue~
e-mail:beautifulzzzz@qq.com
sina:http://weibo.com/beautifulzzzz?is_all=1