CC2541藍牙學習——定時器1的捕獲/比較功能


CC2541定時器1有5個捕獲/比較通道,首先介紹什么是捕獲和比較功能。

捕獲通道:

設置的捕獲開始的時候,CPU會將計數寄存器的值復制到捕獲比較寄存器中並開始計數,當再次捕捉到電平變化時,這時

計數寄存器中的值減去剛才復制的值就是這段電平的持續時間,你可以設置上升沿捕獲、下降沿捕獲、或者上升沿下降沿

都捕獲。捕獲通道可以用來測量信號的頻率周期或者波形的寬度,捕獲通道類似於秒表的功能。

比較通道:

這里有兩個單元:一個計數器單元和一個比較單元,比較單元就是個雙緩沖寄存器,比較單元的值是可以根據不同的模式

設置的,與此同時,計數器在不停的計數,並不停的與比較寄存器中的值進行比較,當計數器的值與比較寄存器的值相等

的時候一個比較匹配就發生了,根據設置,可以產生不同的波形。對於定時器1,計數器單元就是2個8位的SFR:T1CNTH

和T1CNTL,比較單元就是2個8位的寄存器T1CCxH和T1CCxL(x:0~4)。而對於定時器3(4),計數器單元是寄存器

T3CNT(T4CNT),比較單元是寄存器T3CC0和T3CC1(T4CC0和T4CC1)。比較通道可以用來產生特定的波形,輸

PWM波,比較通道類似於鬧鍾的功能。

 

CC2541的輸入捕獲功能

輸入捕獲功能一般用的比較少,當定時器1的某一個通道被配置為輸入捕獲通道,那么對應的I/O引腳則自動配置為輸入,

需要再通過配置寄存器PxDIR設定為輸入,在定時器開始計數后,在外部輸入信號的上升沿、下降沿或者兩個沿到來時觸

發16位的計數器T1CNT的計數值裝入對應通道的捕獲/比較寄存器T1CCxH:T1CCxL。注意根據沿到來的時間間隔選擇合

理的定時器時鍾,假如外部信號每隔幾us沿發生變化,但是定時器的時鍾周期是幾ms,顯然捕獲不到外部的沿變化。具體

應用時,可以在斷服務程序里把通道的捕獲值T1CCxH:T1CCxL讀到一個變量里,如果要測量一個信號的頻率,可以將

第二次捕獲的變量減去第一次捕獲的變量,得到的是信號的周期,倒數就是頻率。但是有一個問題,假如說兩次捕獲的上升

沿(或下降沿)的時間間隔大於時鍾的周期,定時器溢出又從0x0000開始計數,那么這兩次的計數值之差肯定就不對了,

所以在應用之前還得估計一下外部信號的周期以選擇合適的時鍾周期,太麻煩了!所以一般來說我們不用它來測量脈寬或者信號周期頻

率。這個輸入捕獲功能當做觸發用特別合適,當檢測到外部信號的沿變化時,在中斷服務程序里完成相應的功能,比如觸發

采集。

另外注意:輸入捕獲功能,在讀取T1CCxH:T1CCxL時,必須先讀取T1CCxL,再讀取T1CCxH

下面重點講解定時器1的通道輸出比較功能。

 

CC2541的輸出比較功能:

在輸出比較模式時,I/O引腳被配置為輸出功能,需要再通過配置寄存器PxDIR設定為輸出引腳在定時器開始工作后,計數

值不斷和對應通道的捕獲/比較寄存器T1CCxH:T1CCxL比較,如果兩者相等,那么輸出引腳就會根據T1CCTLn.CMP的配置發生

置1、清0、翻轉等變化。T1CCTLn.CMP的定義根據通道的不同也不一樣,比如通道1寄存器T1CCTL1定義如下:

T1CCTL1.MODE是選擇定時器1通道的模式,1:輸出比較模式,0:輸入捕獲模式

T1CCTL1.IM是通道的中斷使能標志,1:開通道中斷,0:關通道中斷

T1CCTL1.CAP用來選擇輸入捕獲沿的選擇, 當通道處於輸出比較模式時,T1CCTL1.CAP配置為00

  • 01:上升沿捕獲
  • 10:下降沿捕獲
  •  11:上升沿和下降沿都捕獲

T1CCTL1.CMP是輸出比較模式的選擇,對於通道1來說有7種模式,分別為

  • 000:當計數值等於T1CCxH:T1CCxL時,輸出引腳置1
  • 001:當計數值等於T1CCxH:T1CCxL時,輸出引腳清0
  • 010:當計數值等於T1CCxH:T1CCxL時,輸出引腳電平翻轉
  • 011:在正計數/倒計數模式下,在計數增加階段,當計數值等於T1CCxH:T1CCxL時,輸出引腳置1,在計數遞減階段,當計數值等於T1CCxH:T1CCxL時,輸出引腳清0
  •         在其他模式下,當計數值等於T1CCxH:T1CCxL時,輸出引腳置1,當計數值等於0x0000時,輸出引腳清0
  • 100:在正計數/倒計數模式下,在計數增加階段,當計數值等於T1CCxH:T1CCxL時,輸出引腳清0,在計數遞減階段,當計數值等於T1CCxH:T1CCxL時,輸出引腳置1
  •         在其他模式下,當計數值等於T1CCxH:T1CCxL時,輸出引腳清0,當計數值等於0x0000時,輸出引腳置1
  • 101:當計數值等於T1CCxH:T1CCxL時,輸出引腳置1;當計數值等於T1CC0H:T1CC0L時,輸出引腳清0
  • 110:當計數值等於T1CCxH:T1CCxL時,輸出引腳清0;當計數值等於T1CC0H:T1CC0L時,輸出引腳置1
  • 111:初始化輸出比較引腳的電平

通道0的輸出比較功能比較少,如下圖所示,這是因為T1CC0H:T1CC0L在模式6和模式7下有特殊的功能,這就意味着這兩種模式對於通道0不可用

 

所以要生成較復雜的波形,一般都不用通道0。

 

比較輸出引腳會在下面兩種情況下被初始化

  • 往定時器1的計數器低字節T1CNTL 寫入任何值,並且會導致計數器被清除為0x0000
  • T1CCTLn.CMP設置為111

初始化值如下表,在不同模式下,初始值不同

 

接下來看下,定時器1在自由運行模式、模模式、正計數/倒計數模式下的輸出波形

自由運行模式

我們可出,除了模式000、001、010,其他的模式輸出的波形周期都是0xffff個計數時間,所以周期和定時器1的計時頻率有關,也就是和T1CTL.DIV及CLKONCMD寄存器有關。

周期:0xffff

占空比:T1CCn/T1CC0或者1-T1CCn/T1CC0

 

模模式

我們可出,除了模式000、001、010,在定時器時鍾頻率一定的情況下,其他的模式輸出的波形周期和寄存器T1CC0有關

周期:T1CC0

占空比:T1CCn/T1CC0或者1-T1CCn/T1CC0

 

正計數/倒計數模式

周期:2*T1CC0

占空比:010和100——T1CCn/T1CC0;011——1-T1CCn/T1CC0;101和110——(T1CC0-T1CCn)/2*T1CC0

 

程序編寫

端口引腳初始化:配置引腳功能為外設I/O,外設位置選擇,位置優先級選擇,注:無需配置引腳方向PxDIR

例子中用到引腳P1.0,定時器1的位置2時引腳P1.0為通道2

 1 /******************************************************************************
 2 *函 數 名:InitPWM
 3 *功    能:PWM輸出口P1.0初始化
 4 *入口參數:無
 5 *出口參數:無
 6 ******************************************************************************/
 7 void InitPWM(void)
 8 {
 9   P1SEL |=  0x01;      //P1.0設置為外設I/O口:定時器1通道2
10   PERCFG |= (1<<6);    //定時器1為外設位置2
11   P2SEL &= ~(1<<4);    //優先級控制:定時器1優先
12 }

定時器初始化配置:

  • 定時器1分頻值,工作模式配置,寄存器T1CTL
  • 定時器1通道n輸入捕獲/輸出比較模式選擇,如果用到中斷,開通道n中斷,寄存器T1CCTLn
  • 通道1捕獲/比較寄存器值配置,先低位后高位,T1CC0L和T1CC0H
  • 通道n捕獲/比較寄存器值配置,先低位后高位,T1CCnL和T1CCnH
  • 開定時器1溢出中斷,TIMIF
  • 定時器1中斷使能,IEN1
  • 開總中斷,EA
 1 /******************************************************************************
 2 *函 數 名:InitT1
 3 *功    能:定時器1初始化,使用通道2
 4 *入口參數:無
 5 *出口參數:無
 6 ******************************************************************************/
 7 void InitT1(void)
 8 {
 9   T1CTL  = 0x0f;     //定時器1設置為128分頻,正計數/倒計數模式
10   T1CCTL2 = 0x6c;    //定時器1通道2配置為比較輸出,模式101,開通道2中斷
11   T1CC0L = 0x00;     //定時器1通道0捕獲/比較值低位
12   T1CC0H = 0x88;     //定時器1通道0捕獲/比較值高位
13   T1CC2L = 0x00;     //定時器1通道2捕獲/比較值低位
14   T1CC2H = 0x44;     //定時器1通道2捕獲/比較值高位
15   TIMIF &= ~(1<<6);  //定時器1溢出中斷使能
16   IEN1  |= (1<<1);   //定時器1中斷使能
17   EA = 1;            //開總中斷
18 }

這樣就可以輸出PWM波形了,對於只輸出PWM波,中斷是可以不用管的,不開中斷什么的都可以

本例使用的定時器主時鍾是32MHz,128分頻,周期是2*T1CC0H:T1CC0L(2*0x8800)計時時間,為278.528ms,頻率為3.59Hz,占空比為

1-(T1CC0-T1CCn)/2*T1CC0=75%

波形用示波器看得

另外,通過實驗發現,當輸出頻率較高的波形時,波形失真較明顯,下圖是輸出8MHz的波形,所以cc2541不適合輸出高頻率的波形。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM