CC2530定時器


CC2530定時器

定時器介紹

什么是定時器?

定時器是一種能夠對輸入時鍾(或脈沖)進行計數,在達到計數值時可以觸發中斷的外設。

定時器有哪些作用?

  • 定時器功能: 對輸入的時鍾進行計數,達到計數值可以觸發中斷。
  • 輸入計數器功能: 對外部的脈沖個數輸入進行計數。
  • PWM輸入捕獲功能: 可以獲取輸入的PWM的頻率和脈寬信息。
  • PWM輸出功能: 按一定頻率和脈寬輸出PWM信號。

PWM = Pulse width modulation,是一種脈寬調制技術,可以利用脈沖的寬度控制LED的亮度、電機的轉速等。

寄存器分析

功能圖

寄存器

寄存器

自由運行模式

自由運行模式

取模模式

取模模式

向上向下計數模式

向上向下計數模式

定時器1分析

定時器1是一個16位的定時器,主要有以下幾個功能:

  • 5個通道,每隔通道可以單獨設置計數值。
  • 可以設置輸入捕獲的邊沿(上升沿、下降沿、雙邊沿)
  • 自由運行模式、取模模式、向上/向下計數模式
  • 時鍾分頻可以設置為1、8、32、128
  • 每隔通道都可以觸發中斷
  • 可以觸發DMA請求

工作模式介紹

  • 自由運行模式: 計數值自增達到0xFFFF之后歸零,重新開始計數。
  • 取模模式: 計數值自增到T1CC0配置的數字后歸零,重新開始計數。
  • 向上/向下計數模式: 計數值先自增到T1CC0,然后開始自減到0,然后再次開始自增(這個就是呼吸燈的工作方式,不知道還有什么作用)。

由於每一種模式下的配置不同,這里使用定時器來實現控制LED以1Hz的頻率閃爍,也就是亮0.5S,然后滅0.5秒。那么需要配置為取模模式比較方便,到達設定值后自動歸零,重新開始計數。相關的寄存器有:

T1CC0H:T1CC0L 計數值的高8位和低8位。
T1STAT.CH0IF 定時器1的通道1中斷標志,寫入0清除標志。
T1STAT.OVFIF 定時器1的計數溢出中斷標志,寫入0清除標志。
IEN1.T1EN 定時器1的中斷開關。
TIMIF.OVFIM 定時器1的中斷溢出使能位。

具體實現

定時器1的通道0的初始化

    //16MHz RC是默認的時鍾源,沒有校准的時候誤差是正負18%
    //定時器的工作頻率 16MHz / 128 = 125000Hz
    //定時500ms,也就是計數62500
    //周期應該是1秒,實測940毫秒,RC的誤差,切換到外部晶振應該會准確一些的。
    T1CTL |= 0x0c;	//128分頻,取模模式
    T1CC0L = (62500 & 0xff);      //配置通道0的低8位
    T1CC0H = 62500 >> 8;          //配置通道0的高8位
    TIMIF |= 0x20;  //打開定時器的中斷溢出標志
    T1IE = 1;	    //打開定時器1的中斷
    EA = 1;         //打開總中斷
    T1CCTL0 |= 0x46;//打開通道0的中斷,設置為比較器模式,下降沿計數。
    T1CTL |= 0x02;  //設置為取模模式,定時器開始工作

定時器1的中斷服務程序

//定時器1的中斷服務函數
#pragma vector = T1_VECTOR
__interrupt void Timer1_Interrupt(void)
{
    if ((T1STAT & 0x01) == 0x01) {  //通道1中斷標志
        LED1 = !LED1;
        T1STAT &= ~0x01;//清除通道1的中斷標志
    }
    
    T1STAT &= ~0x20;    //清除定時器1的中斷標志
}

注意事項

定時器3和定時器4是8位的定時器。這里只使用了定時器1的通道0來實現LED的狀態的切換。


免責聲明!

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



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