CC2530 定時器應用
- 任務分析
- 知識儲備
- 相關暫存器知識
- T1CTL-定時器1的控制和狀態
- T1CCTL0-定時器1通道0捕獲/比較控制
- T1CC0H和T1CC0L-定時器1通道0捕獲/比較值的高低位
- 相關暫存器總結
- 代碼
- 部分代碼分析
- 定時器初始化函式
- 中斷回呼函式
任務分析
定時器控制流水燈
知識儲備
相關暫存器知識
由于我手上的開發板LED1,LED2,KEY1對應的引腳分別是P1_0,P1_1,P1_2,所以我下面主要介紹和P1相關的暫存器,其他埠類似,
T1CTL-定時器1的控制和狀態

令T1CTL = 0x0e即可使定時器1處于模模式,128分頻
T1CCTL0-定時器1通道0捕獲/比較控制

即令T1CCTL0 |= 0x04;即可開啟定時器1通道0的比較模式
T1CC0H和T1CC0L-定時器1通道0捕獲/比較值的高低位

即令T1CC0L = 0xd4;,T1CC0H=0x30;就可以使定時器每過0.1s觸發一次中斷
根據公式

(CC2530晶振頻率為16MHz,上面我們定義了128分頻,所以定時器計數周期如上.)
最后再加上下面兩行代碼即可
T1IE = 1;//定時器1中斷使能
EA = 1;//開啟總中斷
相關暫存器總結
1.開啟總中斷EA = 1;
2.開啟定時器中斷T1IE = 1;
3.設定定時器1為模模式,128分頻T1CTL = 0x0e;
4.開啟定時器1通道0的比較模式T1CCTL0 |= 0x04;
5.設定定時器1通道0捕獲/比較值的高低位T1CC0L = 0xd4;T1CC0H = 0x30;
代碼
#include <ioCC2530.h>
#define KEY1 P1_2
#define LED1 P1_0
#define LED2 P1_1
unsigned int TimeFlag = 0;
void PortInit()
{
P1SEL &= ~0x07;
P1DIR |= 0x03;
P1DIR &= ~0x04;
}
void Timer1Init()
{
T1CC0L = 0xd4;//最大計數值的低8位
T1CC0H = 0x30;//最大計數值的高8位
//系統頻率是16MHz,下面T1CTL = 0x0e定義了分頻系數是128,可以根據計算公式算出來
//0.1s的值是0x30d4
T1CCTL0 |= 0x04;//開啟輸出0的通道比較模式
T1IE = 1;//定時器1中斷使能
EA = 1;//開啟總中斷
T1CTL = 0x0e;//模模式,128分頻
}
void delay(unsigned int i)
{
while(i--);
}
#pragma vector = T1_VECTOR
__interrupt void T1_vector()
{
T1STAT &= ~0x20;
TimeFlag++;
if(TimeFlag == 10)
{
LED1 = ~LED1;
}
}
void main()
{
PortInit();
Timer1Init();
LED1 = 1;
LED2 = 1;
while(1)
{
}
}
部分代碼分析
定時器初始化函式
void Timer1Init()
{
T1CC0L = 0xd4;//最大計數值的低8位
T1CC0H = 0x30;//最大計數值的高8位
//系統頻率是16MHz,下面T1CTL = 0x0e定義了分頻系數是128,可以根據計算公式算出來
//0.1s的值是0x30d4
T1CCTL0 |= 0x04;//開啟輸出0的通道比較模式
T1IE = 1;//定時器1中斷使能
EA = 1;//開啟總中斷
T1CTL = 0x0e;//模模式,128分頻
}
中斷回呼函式
#pragma vector = T1_VECTOR
__interrupt void T1_vector()
{
T1STAT &= ~0x20;
TimeFlag++;
if(TimeFlag == 10)
{
LED1 = ~LED1;
}
}
其中 T1STAT &= ~0x20; 作用置1定時器1資料溢位標志位

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/187532.html
標籤:其他
