
實驗二: Timer定時應用實驗
2.1實驗目的
1. 認識并了解 CC2530 定時器;
2. 學習定時器的基本配置與應用;
3. 在 ZigBee 模塊上運行定時器程序。
2.2實驗原理
根據數據手冊可知 CC2530 總共有 4 個定時器,但是定時器 2 被系統占用,可用的只有三個,分別為 定時器 1、3、4。其中定時器 3 和定時器 4 是兩個 8 位定時器,定時器 1 是一個獨立的 16 位定時器,本 節主要介紹基于定時器 1 的定時應用。定時器的一個很重要的概念是操作模式,該模式包含自由運行模 式(free-running)、模模式(modulo)和正計數/倒計數模式(up-down)。以下為摘自 CC2530 中文手冊 關于 3 種模式的介紹:
在自由運行操作模式下,計數器從 0x0000 開始,每個活動時鐘邊沿增加 1。 當計數器達到 0xFFFF 時(溢出),計數器載入 0x0000,繼續遞增它的值,如圖 3.2.1 所示。當達到終計數值 0xFFFF,設置 標志 IRCON.T1IF 和 T1STAT.OVFIF。如果設置了相應的中斷屏蔽位 TIMIF.OVFIM 以及 IEN1.T1EN,將產生 一個中斷請求。自由運行模式可以用于產生獨立的時間間隔,輸出信號頻率。

當定時器運行在模模式時,16 位計數器從 0x0000 開始,每個活動時鐘邊沿增加 1。當計數器的計數 值達到 T1CC0 時溢出。寄存器 T1CC0H 與 T1CC0L 保存的終計數值將復位到 0x0000,并繼續遞增。如果 定時器開始于T1CC0以上的一個值,當達到終計數值(0xFFFF)時,設置標志IRCON.T1IF和 T1CTL.OVFIF。 如果設置了相應的中斷屏蔽位 TIMIF.OVFIM 以及 IEN1.T1EN,將產生一個中斷請求。該模式可以用于周期不是 0xFFFF 的應用程序。計數器的操作展示在圖 3.2.2 中。

在正計數/倒計數模式,計數器反復從 0x0000 開始,正計數直到達到 T1CC0H 與 T1CC0L 保存的值。 然后計數器將倒計數直到 0x0000,如圖 3.2.3 所示。這個定時器用于周期必須是對稱輸出脈沖而不是 0xFFFF 的應用程序,因此允許中心對齊的 PWM 輸出應用的實現。在正計數/倒計數模式,當達到終計 數值時,設置標志 IRCON.T1IF 和 T1CTL.OVFIF。如果設置了相應的中斷屏蔽位 TIMIF.OVFIM 以及 IEN1.T1EN,將產生一個中斷請求。

由以上三種模式的比較可以得出:自由運行模式的溢出值為 0xFFFF 不可變;而其他兩種模式則通過 對 T1CC0 賦值,以精確控制定時器的溢出值。
本實驗通過對 CC2530 內部定時器 T1 的配置與使用,實現對 ZigBee 模塊上的 LED 燈以 1 秒為時間單 位進行均等時間的定時閃爍,即讓模塊上的 LED 指示燈實現 0.5s 亮與 0.5s 滅,它們亮滅的時間是均等 的。這種均等的時間實現效果正是由 CC2530 的內部定時器 T1 來實現的。
2.2.1 電路分析與程序配置
本節使用 CC2530 的定時器 1 來實現對 LED 的定時閃爍時間控制,所使用的原理圖與 3.1 節的一致,即:D4 所對應的 I/O 為 P1_0,D2 所對應的 I/O 為 P1_1,D3 所對應的 I/O 為 P1_2,本實驗選擇 P1_0, P1_1 和 P1_2 I/O 引腳,P1_0 控制模塊上的 LED 燈 Status/Data,P1_1 控制模塊上的 LED 燈 Net,P1_2 控制模塊上的 LED 燈 User1。故在軟件上只要配置好 P1_0,P1_1,P1_2 并初始化好定時器 1 即可。

本次實驗學習到的新寄存器:
T1CTL:定時器 1 的控制寄存器。D1、D0 控制運行模式;D3、D2 設置分頻值。

T1STAT:定時器 1 的狀態寄存器,D4~D0 為通道 4~通道 0 的中斷標志,D5 為溢出標志位,當計數到 終計數值時自動置 1。

IRCON:中斷標志寄存器;0 為無中斷請求。1 為有中斷請求。

IEN1:中斷允許寄存器 1

2.3 實驗步驟
1. 正確連接 ZB-LINK 調試器到 PC 機和 ZigBee 模塊,可參考第 1 章的 1.3 節進行連接;

2. 打開:【配套光盤04-實驗例程02-ZigBee技術與應用第三章 CC2530基礎功能實驗3.2 Timer 定時應用實驗實驗代碼】中的實驗工程:“timer.eww”,選擇 Project→Rebuild All 重新編譯 工程;
3. 選擇 Project→Download and debug 將程序下載到 ZigBee 模塊,下載完成后點

退出;

4. 按下 ZB-LINK 調試器的復位按鈕讓剛才下載的程序重新運行。
2.4實驗源碼
#include <ioCC2530.h> //引入CC2530所對應的頭文件(包含各SFR的定義)
#include "sys_init.h"uint counter=0; //統計溢出次數/*主函數-------------------------------------------------------*/
void main()
{led_init(); //LED初始化 time1_init(); //T1中斷初始化while(1);
}/*中斷服務子程序-------------------------------------------------------*/
#pragma vector = T1_VECTOR __interrupt void T1_ISR(void) { EA=0; //關總中斷 counter++;if(counter>15) //0.5s時間{counter=0; D4 = !D4;D2 = !D2;D3 = !D3;}T1IF=0; //清中斷標志EA=1; //開總中斷 }
2.5 實驗結果與分析
程序運行后,會發現 ZigBee 模塊上的所有 LED 指示燈在定時器 1 的作用下開始以1秒為周期,0.5s 為亮滅時間間隔的方式不停地閃爍,從而達到了本節實驗所要求的實驗效果。

