第一章 CC2530時鐘源
(1)時鐘源
1、內部RC震蕩器(32KHz、16MHz)
2、外部石英晶振(32.768KHz、32MHz)
注意:外部石英晶振比較穩定,在無線收發中采用外部石英晶振
(2)時鐘源的切換
用于判斷時鐘源是否切換成功
第二章 定時/技術器的基本原理
定時/計數器,是一種能夠對內部時鐘信號或外部輸入信號進行計數,當計數值達到設定要求時,向CPU提出中斷處理請求,從而實現定時或者計數功能的外設。
定時/計數器的最基本工作原理是進行計數。不管是定時器還是計數器,本質上都是計數器,可以進行加1(減1)計數,每出現一個計數信號,計數器就會自動加1(自動減1),當計數值從0變成最大值(或從最大值變成0)溢出時,定時/計數器就會向CPU提出中斷請求。
第三章 CC2530的定時/計數器
CC2530共有5個定時/計數器,其中定時器1是一個16位的定時器,為CC2530中功能最全的一個定時/計數器,在 應用中應優先選用。
定時器1的工作模式有三種:
<1> 自由運行模式:計數器從0x0000開始,在每個活動 時鐘邊沿增加1,當計數器達到0xFFFF時溢出,計數器重新載入0x0000并開始新一輪的遞增計數。該模式的計數周期是固定值0xFFFF,當達到最終計數 值0xFFFF時,標志位T1IF和OVFIF被設置。
<2> 模模式:計數器從0x0000開始,在每個活動時鐘邊 沿增加1,當計數器達到T1CC0寄存器保存的值時 溢出,計數器又將從0x0000開始新一輪的遞增計數, 模模式的計數周期可由用戶自行設定。
<3> 正計數/倒計數模式:計數器反復從0x0000 開始,正計數到TICC0保存的最終計數值,然后再倒計數回0x0000,當達到最終計數值時,標志位T1IF和OVFIF被設置。
第四章 CC2530的定時/計數器中斷系統
定時器有3種情況能產生中斷請求:
<1> 計數器達到最終計數值(溢出或回到零)。
<2> 輸入捕獲事件。
<3> 輸出比較事件。
使用模模式要特別注意,需要開啟通道0的輸出比較模式,否則計數器的 值達到T1CC0后,是不會產生溢出中斷的。
第五章 應用定時器1實現1秒定時
【1】設置定時器1的最大計數值
定時器1共有5對T1CCxH和T1CCxL寄存器,分別對應通道0到通道4。在使用定時器1的定時功能時,使用T1CC0H和T1CC0L兩個寄存器存放最大計數值的高8位和低8位。
在系統中,系統時鐘為16MHz,分頻系數為128,要定時0.1秒,最大計數值為:
【2】定時器初始化函數設計
<1> 將定時器1的最大計數值寫入T1CC0。
<2> 通過T1CCTL0寄存器開啟定時器1通道0的輸出比較模式。
<3> 設置定時器1的相關中斷控制位。
<4> 設置分頻系數和工作模式并啟動定時器。
【3】定時器中斷服務函數設計
<1> 清除T1STAT的中斷標志位。
<2> 累加全局變量count。
<3> count被10整除即1秒的定時到了。
<4> 10秒定時到將count清零。
示例代碼:
#include < ioCC2530.h >
?
//定義LED燈的端口
#define LED1 P1_2
#define LED2 P1_3
?
/*
函數功能:LED燈IO口初始化
硬件連接:LED1-- >P1_2 , LED2-- >P1_3
*/
void LED_Init(void)
{
P1DIR |=0x3< 2; //配置P1_2、P1_3為輸出模式
LED1 = 1;
LED2 = 1;
}
?
/*延時200毫秒*/
void delay200ms(void) //誤差 -0.125us
{
unsigned char a,b,c;
for(c=95;c >0;c--)
for(b=181;b >0;b--)
for(a=14;a >0;a--);
}
?
?
/*===============定時器1初始化函數==================*/
void Init_Timer1()
{
T1CC0L = 0xd4; //設置最大計數值的低8位
T1CC0H = 0x30; //設置最大計數值的高8位
T1CCTL0 |= 0x04; //開啟通道0的輸出比較模式
T1IE = 1; //使能定時器1中斷
T1OVFIM = 1; //使能定時器1溢出中斷
EA = 1; //使能總中斷
T1CTL = 0x0e; //分頻系數是128,模模式
}
?
?
unsigned char count = 0;
/*================定時器1服務函數====================*/
#pragma vector = T1_VECTOR
__interrupt void Timer1_Sevice()
{
T1STAT &= ~0x01; //清除定時器1通道0中斷標志
count++;
if(count%10 == 0) //定時1秒到
{
LED1 = !LED1;
}
if(count == 100) //定時10秒到
{
LED2 = !LED2;
count = 0;
}
}
?
/*主函數*/
void main(void)
{
LED_Init();//初始化LED燈控制IO口
Init_Timer1();
while(1)
{
}
}
?