天天看點

CC2430基礎——定時器1試驗

定時器1是一個16位定時器,具有定時器/計數器/脈寬調制功能。它有3個單獨可程式設計 輸入捕獲/輸出比較 信道,每一個信道都可以用來當做PWM輸出或用來捕獲輸入信号的邊沿時間(關于什麼是輸入捕獲/輸出比較,以及如何實作PWM輸出,讀者可自行查閱CC2430中文手冊)。

要求定時器的溢出周期為0.5s。為此,需要計算出相應的溢出值(暫設為N)。

系統時鐘頻率選為32MHz,提供給定時器的時鐘頻率預設為16MHz(兩者都由特殊功能寄存器 CLKCON 來配置,具體可查閱CC2430中文手冊)。

對于定時器1,設定其時鐘分頻為128分頻。

綜上所述,可列式如下:

CC2430基礎——定時器1試驗

求出N=62500,其十六進制為 0xF424,即需要設定 T1CC0H=0xF4,T1CC0L=0x24 即可 。

/*

實驗說明:定時器Timer1實驗,定時器計數溢出,LED1閃爍

*/

#include <ioCC2430.h>

#define led1 P1_0

#define led2 P1_1

/*系統時鐘初始化

-------------------------------------------------------*/

void xtal_init(void)

{

SLEEP &= ~0x04; //都上電

while(!(SLEEP & 0x40)); //晶體振蕩器開啟且穩定

CLKCON &= ~0x47; //選擇32MHz 晶體振蕩器

SLEEP |= 0x04;

}

/*LED初始化

-------------------------------------------------------*/

void led_init(void)

{

P1SEL = 0x00; //P1為普通 I/O 口

P1DIR |= 0x03; //P1.0 P1.1 輸出

led1 = 1; //關閉LED1

led2 = 0; //點亮LED2 作為運作燈提示

}

/*T1初始化

-------------------------------------------------------*/

void timer1_init(void)

{

T1IE=1; //開T1中斷

OVFIM=1; //開T1溢出中斷

T1CC0L=0x24; //溢出值低8位

T1CC0H=0xF4; //溢出值高8位

T1CTL = 0x0e; //128分頻;modulo模式(0x0000->T1CC0);開始運作;

T1IF=0; //清中斷标志

EA=1; //開總中斷

}

/*主函數

-------------------------------------------------------*/

void main(void)

{

xtal_init();//系統時鐘初始化

led_init(); //LED初始化

timer1_init();//T1初始化

while(1); //等待溢出中斷

}

/*T1終端服務子程式

-------------------------------------------------------*/

#pragma vector=T1_VECTOR

__interrupt void T1_ISR(void)

{

EA=0; //關中斷

led1 = !led1; //LED燈反轉

EA=1; //開中斷

T1CTL &= ~0x10; //清中斷标志

}

CC2430基礎——定時器1試驗