標籤:cc2530 ti 定時器3 中斷方式
本實驗實現通過CC2530的定時器3(8位)查詢方式控制LED1以1S的周期性閃爍,此實驗使用有關定時器3的2個寄存器T3CTL(定時器3控制寄存器),IEN1(中斷使能1寄存器)。
有關CC2530的GPIO基本知識、普通GPIO操作有關寄存器的介紹、IAR Embedded Workbench IDE軟體使用:TI CC2530基礎實驗(普通GPIO操作——點亮led燈)
原理圖:
寄存器分析:
程式:
#include <ioCC2530.h>/*********************************************** * 程式說明:T3中斷方式控制LED1以1S的周期性閃爍 **********************************************/#define LED1 P1_0unsigned char count = 0;//用來記錄定時器溢出次數/********************************************************* * 函數描述:初始化LED1 * 備忘:系統不配置工作時鐘時使用內部 RC 振蕩器,即16MHz *********************************************************/void LED1Init(void){ P1SEL &= ~0x01; //功能:普通I/O P1DIR |= 0x01; //方向:輸出 LED1 = 1; //使其屬於滅狀態}/*********************************** * 函數描述:定時器3初始化 **********************************/ void T3Init(void){ EA = 1; //不管三七二十一,先開啟總中斷 /*使能定時器3中斷*/ IEN1 |= 0x08; //或T3IE = 1; /*使能溢出中斷,預設是使能溢出中斷*/ T3CTL |= 0x08; //查看T3CTL寄存器,需要使能溢出中斷 /*設定分頻、自由運行模式*/ T3CTL |= 0xE0; //128分頻 T3CTL &= ~0x03; //自由運行模式 /*設定好定時器3,開啟定時器3*/ T3CTL |= 0x10; //查看T3CTL寄存器,需要啟動定時器}/*********************************** * 函數描述:定時器3中斷處理函數 **********************************/ #pragma vector = T3_VECTOR__interrupt void T3_ISR(void){ //IRCON = 0; //清中斷,似乎硬體幫我們將IRCON對應的中斷標誌位清除了 if (++count > 254) { count = 0; LED1 = !LED1; }}void main(){ LED1Init(); T3Init(); for (;;);}
其中定時器3中斷服務程式中的254是怎麼來的呢?
系統在不配置工作頻率時預設為2分頻,即16M=32M/2。1/(16M/128)*N = 0.5s(每隔0.5秒一次開,一次關,這樣看起來就像以1S周期性閃爍),得到 N = 65200,即而每次溢出遞增次數為256(0x00~0xFF),所有總共需要溢出的次數 = 65200/256 = 254.
注意:每建立一個新工程都要配置IAR(做基礎實驗),TI CC2530基礎實驗(普通GPIO操作——點亮led燈)也有IAR相關配置步驟
總結:
1、當系統不配置工作頻率時,即為16M工作頻率下,定時器每遞增需要時間為1/(16000000/128) = 8us。當採用自由運行模式下,每溢出一次需要時間為:2ms
2、定時器3採用中斷方式,初始化需要做的事情:1)開啟總中斷 EA = 1; 2)使能定時器3中斷 3)使能溢出中斷(預設使能) 4)設定分頻、運行模式 5)最後啟動定時器3
TI CC2530基礎實驗(定時器3中斷方式——自由運行模式)