1. 程式人生 > >CC2530通過定時器3中斷方式每10ms輸出一個下降沿

CC2530通過定時器3中斷方式每10ms輸出一個下降沿

Request/Task:

由於專案中硬體電路遲遲未到位,故利用一個CC2530板子的P0.0口作為輸出,模擬10ms一次的下降沿中斷,給除錯電路板。

Idea

定時器3和定時器4是兩個8位定時器,一般上,控制暫存器TxCTL被用來控制定時器模式。本文選用的是自由執行模式,計數器從0x00開始,在每一個活動時鐘邊沿遞增,當計數器到達0xFF時,計數器重置為0x00並繼續遞增。當最終計數器值到達0xFF時(如發生溢位),中斷標誌位TIMIF.TxOVFIF將被置1。如已設定相應中斷遮蔽位TxCTL.OVFIM,產生中斷請求。所以需要設定的關於定時器3的暫存器有:T3CTL(定時器3控制)、IRCON(中斷標誌)、T3IE(定時器3中斷使能)、EA(總中斷使能)。

Implement

/****************************************************************************
* 文 件 名: main.c
* 描    述: 定時器T3通過中斷方式控制每10ms輸出一個下降沿
****************************************************************************/
#include <ioCC2530.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define LED1 P0_0       // P0.0口控制LED1

uint count;             //用於定時器計數

/****************************************************************************
* 名    稱: InitLed()
* 功    能: 設定LED燈相應的IO口
* 入口引數: 無
* 出口引數: 無
****************************************************************************/
void InitLed(void)
{
    P0DIR |= 0x01;           //P0.0定義為輸出
    LED1 = 1;                //使LED1燈上電預設為熄滅     
}

/****************************************************************************
* 名    稱: InitT3()
* 功    能: 定時器初始化,系統不配置工作時鐘時預設是2分頻,即16MHz
* 入口引數: 無
* 出口引數: 無
****************************************************************************/
void InitT3()
{
    T3CTL |= 0x08 ;          //開溢位中斷     
    T3IE = 1;               //開總中斷和T3中斷
    T3CTL &= ~0x80;
    T3CTL |= 0x60;        //8分頻,8/16000000*N=0.005S,N=10000
    T3CTL &= ~0x03;          //自動重灌 0x00->0xff  10000/255=39(次)
    T3CTL |= 0x10;           //啟動
    EA = 1;                  //開總中斷
    
}

//定時器T3中斷處理函式
#pragma vector = T3_VECTOR 
__interrupt void T3_ISR(void) 
{ 
    IRCON = 0x00;            //清中斷標誌, 也可由硬體自動完成 
    if(count++ > 35)   //約為0.005 秒時間
    {                        //經過示波器測量確保精確
        count = 0;           //計數清零 
        LED1 = ~LED1;        //改變LED1的狀態
    } 
}


/****************************************************************************
* 程式入口函式
****************************************************************************/
void main(void)
{
    InitLed();		 //設定LED燈相應的IO口
    InitT3();            //設定T3相應的暫存器
    while(1)
    {};
}

Conclusion

通過示波器實際測量,發現當定時35次比計算得到的39次更加精確。

Problem

利用哪一種工作模式可以給定時器3賦初值,並迴圈計數? 參考文章:點選開啟連結