第二部分 基礎篇-第4章 定時器-CC2530 中斷方式使用定時器T1
阿新 • • 發佈:2019-02-04
1 理論分析
為定時器分配了一箇中斷向量。當下列定時器事件之一發生時,將產生一箇中斷請求:
計數器達到最終計數值(溢位或回到零)
輸入捕獲事件
輸出比較事件
暫存器狀態暫存器 T1STAT 包括最終計數值事件和五個通道比較/捕獲事件的中斷標誌。僅當設定了相應的中斷遮蔽位和 IEN1.T1EN 時,才能產生一箇中斷請求。中斷遮蔽位是 n 個通道的 T1CCTLn.IM 和溢位事件 TIMIF.OVFIM。如果有其它未決中斷,必須在一個新的中斷請求產生之前,通過軟體清除相應的中斷標誌。而且,如果設定了相應的中斷標誌,使能一箇中斷遮蔽位將產生一個新的中斷請求。
2 實驗詳解
2.1實驗目的
1)、進一步瞭解 CC2530 定時器 1;
2)、掌握定時器 1 中斷方式的應用;
3)、掌握定時器1 的配置與使用
2.2實驗裝置
硬體:PC 機一臺 ZB2530(底板、核心板、模擬器、USB 線) 一套
軟體:2000/XP/win7 系統,IAR 8.10 整合開發環境
2.3實驗相關電路圖
2.4 實驗相關暫存器
本實驗本實驗配置的是 Timer1 的控制暫存器。具體如何配置看圖。
所以,控制字為:T1CTL|=0X0d。
T1STAT(0xAF)-定時器1狀態
按照表格暫存器的內容,對Led1 和T1 進行配置。
Led1 配置如下:
P1SEL &=~0x01; //配置P1.0 為通用IO 口
P1DIR |= 0x01; //配置P1.0 為輸出
T1 配置如下:
T1CTL = 0x0d; //128 分頻,自動重灌0x0000-0xFFFF
當然,由於用到的是中斷方式,所以,要開啟定時器 1 中斷和總中斷,即:
T1IE = 1;( 開 Timer1 中斷)
EA = 1;( 開總中斷)
注意:由於是 128 分頻,則計一次數需要時間 t=128/16000000, 如果我們希望得到一個 0.5s 的延時,那麼 128/16000000*N=0.5S,就得計 N=65200 次數。而我們又將 Timer1設定為自動重灌 0x0000—0xFFFF,即產生一次溢位中斷計數 0.9948 次,約等於 1 次,所以,我們要累加 1 次溢位中斷才讓 LED1 取反。
2.5參考程式碼
/**Includes*********************************************************************/
#include <ioCC2530.h>
/**巨集定義***********************************************************************/
//定義資料型別
#define uint unsigned int
#define uchar unsigned char
//定義控制LED燈的埠
#define LED1 P1_0 //定義LED1為P1_0口控制
/**函式宣告*********************************************************************/
void Delayms(uint xms); //延時函式
void InitLed(void); //LED_IO初始化函式
void InitT1(void); //Timer1中斷方式初始化函式
/**全域性變數*********************************************************************/
//由於是中斷函式用到,一定要定義為全域性變數
uint count=0;//用於計算溢位中斷的次數
/**
* @brief 主函式
* @param None
* @retval None
*/
void main(void)
{
InitLed(); //呼叫初始化函式
InitT1();
while(1)
{
}
}
/**
* @brief 中斷服務函式
* @param None
* @retval None
*/
#pragma vector = T1_VECTOR //Timer1中斷向量
__interrupt void T1_ISR(void)
{
IRCON = 0x00; //清中斷標誌, 也可由硬體自動完成
if((++count)==1) //1次中斷後LED取反,閃爍一輪(0.5 秒時間)
{
count = 0; //計數清零
LED1=~LED1;
}
}
/**
* @brief 普通延時函式
* @param xms 延時長度
* @retval None
*/
void Delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--);
}
/**
* @brief LED初始化函式
* @param None
* @retval None
*/
void InitLed(void)
{
P1DIR |= 0x01; //P1_0義為輸出
LED1 = 1; //LED1燈熄滅
}
/**
* @brief Timer1中斷方式初始化函式
* @param None
* @retval None
*/
void InitT1(void)
{
T1CTL|=0X0d; //128分頻,自由執行模式
T1IE = 1; //開Timer1中斷
EA = 1; //開總中斷
}
2.6實驗現象
通過定時器中斷方式使得LED1定時閃爍。