1. 程式人生 > >第二部分 基礎篇-第4章 定時器-CC2530 中斷方式使用定時器T1

第二部分 基礎篇-第4章 定時器-CC2530 中斷方式使用定時器T1

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實驗相關電路圖

這裡寫圖片描述

圖1 LED電路圖

2.4 實驗相關暫存器

本實驗本實驗配置的是 Timer1 的控制暫存器。具體如何配置看圖。
所以,控制字為:T1CTL|=0X0d。

表1 定時器1的控制與狀態

這裡寫圖片描述

表2 定時器1的狀態

T1STAT(0xAF)-定時器1狀態
這裡寫圖片描述

表3 中斷標誌

這裡寫圖片描述

按照表格暫存器的內容,對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定時閃爍。

本章參考程式碼

點選進入