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的狀態的切換。