CC2530裸機(jī)編程-定時器1

1. 測試端口LED的配置

//以P0_6端口為例
#define LED P0_6

void Hal_LEDInit(void)
{
    P0SEL &= ~0xC0; //通用IO
    P0DIR |= 0xC0;  //輸出模式
    
    LED = 0;//初始狀態(tài)為滅
}

2.設(shè)置系統(tǒng)主時鐘

void Hal_SystemClockInit(void)
{
    CLKCONCMD &= ~0x40;       //設(shè)置系統(tǒng)時鐘源為32MHZ的晶振
    while(CLKCONSTA & 0x40);  //等待晶振穩(wěn)定為32MHZ
    CLKCONCMD &= ~0x07;       //設(shè)置系統(tǒng)主時鐘頻率為32MHZ
    CLKCONCMD |= 0x38;        //定時器標(biāo)記輸出為250KHZ
    SLEEPCMD |= 0x04;         //關(guān)閉不使用的RC振蕩器
}

3.自由運(yùn)行模式下的Timer1配置

void Hal_Timer1Init(void)
{
    T1CTL = 0x01; //1分頻,自由運(yùn)行(0x0000-0xFFFF反復(fù)計(jì)數(shù))
    T1STAT= 0x21; //通道0, 中斷有效   
}

4.Timer1中斷函數(shù)

#pragma vector=T1_VECTOR 
__interrupt void T1_IRQ(void)
{
    LED =! LED;
    T1IF=0;
}

5.主函數(shù)

void main(void)
{
    Hal_SystemClockInit();
    Hal_Timer1Init();
    Hal_LEDInit();
    
    IEN1 |=0x02;             //P0口中斷使能
    EA = 1;                  //使能全局中斷
    while(1);
}

6.完整源代碼

/*****************************************
 * Filename:       hal_timer1.c
 * Date:           2017-09-08
 * Author:         By Kevin
 *
 * Description:    Timer1 Experiment
****************************************/

#include <ioCC2530.h>

#define LED P0_6

void Hal_SystemClockInit(void);
void Hal_Timer1Init(void);
void Hal_LEDInit(void);


void main(void)
{
    Hal_SystemClockInit();
    Hal_Timer1Init();
    Hal_LEDInit();
    
    IEN1 |=0x02;             //P0口中斷使能
    EA = 1;                  //使能全局中斷
    while(1);
}

#pragma vector=T1_VECTOR 
__interrupt void T1_IRQ(void)
{
    LED = !LED;
    T1IF=0;
}

void Hal_SystemClockInit(void)
{
    CLKCONCMD &= ~0x40;       //設(shè)置系統(tǒng)時鐘源為32MHZ的晶振
    while(CLKCONSTA & 0x40);  //等待晶振穩(wěn)定為32MHZ
    CLKCONCMD &= ~0x07;       //設(shè)置系統(tǒng)主時鐘頻率為32MHZ
    CLKCONCMD |= 0x38;        //定時器標(biāo)記輸出為250KHZ
    SLEEPCMD |= 0x04;         //關(guān)閉不使用的RC振蕩器
}

void Hal_Timer1Init(void)
{
    T1CTL = 0x01; //1分頻,自由運(yùn)行(0x0000-0xFFFF反復(fù)計(jì)數(shù))
    T1STAT= 0x21; //通道0, 中斷有效   
}

void Hal_LEDInit(void)
{
    P0SEL &= ~0x40; //通用IO
    P0DIR |= 0x40;  //輸出模式
    
    LED = 0;//初始狀態(tài)為滅
}

7.分析

該例程是利用Timer1中斷實(shí)現(xiàn)LED燈的閃爍,那么該配置下LED閃爍的頻率是多少呢?或者說怎樣設(shè)置LED閃爍的頻率呢?

該例程中系統(tǒng)時鐘選擇是32MHz的外部石英晶振,定時器的標(biāo)記頻率設(shè)置為250kHz,計(jì)數(shù)器的數(shù)值以250khz的頻率增加,即計(jì)數(shù)器的數(shù)值每隔1\250000s(=4us)增加1。例程中定時器1為自由運(yùn)行模式,從0x0000到0xFFFF反復(fù)計(jì)數(shù),計(jì)數(shù)到0xFFFF時就產(chǎn)生一次中斷并將計(jì)數(shù)器的值清零,那么產(chǎn)生一次中斷的精確時間間隔t = 4x(65535-0+1) = 262144us。每進(jìn)一次中斷,LED燈的狀態(tài)就改變一次,則兩次中斷就是LED燈閃爍的一個周期T,則有T=2*t = 524288us=524.288ms,那么LED燈閃爍的頻率F=1\T=1\0.524288Hz=1.9073486328125Hz,下面來看一下IO口P0_6輸出的波形驗(yàn)證一下其正確性:


實(shí)際輸出波形

由圖可知,實(shí)際輸出波形的周期T=0.5244047917s,頻率F=1.906923842Hz,從測量結(jié)果來看,實(shí)際輸出與理論計(jì)算是高度一致的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容