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.自由運行模式下的Timer1配置
void Hal_Timer1Init(void)
{
T1CTL = 0x01; //1分頻,自由運行(0x0000-0xFFFF反復(fù)計數(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分頻,自由運行(0x0000-0xFFFF反復(fù)計數(shù))
T1STAT= 0x21; //通道0, 中斷有效
}
void Hal_LEDInit(void)
{
P0SEL &= ~0x40; //通用IO
P0DIR |= 0x40; //輸出模式
LED = 0;//初始狀態(tài)為滅
}
7.分析
該例程是利用Timer1中斷實現(xiàn)LED燈的閃爍挨厚,那么該配置下LED閃爍的頻率是多少呢浪秘?或者說怎樣設(shè)置LED閃爍的頻率呢撬统?
該例程中系統(tǒng)時鐘選擇是32MHz的外部石英晶振腾供,定時器的標(biāo)記頻率設(shè)置為250kHz岖沛,計數(shù)器的數(shù)值以250khz的頻率增加罢坝,即計數(shù)器的數(shù)值每隔1\250000s(=4us)增加1廓握。例程中定時器1為自由運行模式,從0x0000到0xFFFF反復(fù)計數(shù)嘁酿,計數(shù)到0xFFFF時就產(chǎn)生一次中斷并將計數(shù)器的值清零隙券,那么產(chǎn)生一次中斷的精確時間間隔t = 4x(65535-0+1) = 262144us。每進一次中斷闹司,LED燈的狀態(tài)就改變一次娱仔,則兩次中斷就是LED燈閃爍的一個周期T,則有T=2*t = 524288us=524.288ms游桩,那么LED燈閃爍的頻率F=1\T=1\0.524288Hz=1.9073486328125Hz牲迫,下面來看一下IO口P0_6輸出的波形驗證一下其正確性:
由圖可知,實際輸出波形的周期T=0.5244047917s借卧,頻率F=1.906923842Hz盹憎,從測量結(jié)果來看,實際輸出與理論計算是高度一致的铐刘。