定時器1是一個16位定時器,具有定時器/計數器/脈寬調制功能。它有3個單獨可程式設計 輸入捕獲/輸出比較 信道,每一個信道都可以用來當做PWM輸出或用來捕獲輸入信号的邊沿時間(關于什麼是輸入捕獲/輸出比較,以及如何實作PWM輸出,讀者可自行查閱CC2430中文手冊)。
要求定時器的溢出周期為0.5s。為此,需要計算出相應的溢出值(暫設為N)。
系統時鐘頻率選為32MHz,提供給定時器的時鐘頻率預設為16MHz(兩者都由特殊功能寄存器 CLKCON 來配置,具體可查閱CC2430中文手冊)。
對于定時器1,設定其時鐘分頻為128分頻。
綜上所述,可列式如下:

求出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; //清中斷标志
}