定時器(三)
阿新 • • 發佈:2019-01-25
前言
前面講了利用定時器3的查詢方式來實現LED1的閃爍,那麼我們怎麼用中斷方式控制呢?今天,我們主要來討論這個話題。
那麼我們想想,應該怎麼讓定時器3產生中斷呢?
無非也就這幾步驟:分頻、開啟溢位中斷、裝數、使能定時器3中斷,使能總中斷、啟動計數。
那麼分頻需要用到哪個暫存器呢?
前章部落格也講過了,需要用到
定時器3的控制暫存器T3CTL
T3CTL|=0XE0; //128分頻
接著就是開啟溢位中斷了
定時器3的控制暫存器T3CTL
T3CTL |= 0x08 ; //開溢位中斷
然後就是向定時器3放一個數進去
定時器3的控制暫存器T3CTL
T3CTL &= ~0X03; //自動重灌0x00---0xFF
然後再開啟定時器3的中斷和總中斷
T3IE = 1; //開Timer3中斷
EA = 1; //開總中斷
最後啟動定時器3
T3CTL |=0X10; //啟動
因此我們可以將上面的代買封裝成一個函式,方便以後程式碼的使用
void Timer3_interrupt_init()
{
T3CTL|=0XE0; //128分頻,
T3CTL |= 0x08 ; //開溢位中斷
T3CTL &= ~0X03; //自動重灌0x00---0xFF
T3IE = 1; //開Timer3中斷
EA = 1; //開總中斷
T3CTL |=0X10; //啟動
}
做完上面的還不夠,我們需要寫中斷函式
#pragma vector = T3_VECTOR //Timer3中斷向量
__interrupt void T3_ISR(void)
{
IRCON = 0x00 ; //清中斷標誌, 也可由硬體自動完成
if((++count)>254) //254次中斷後LED取反,閃爍一輪(0.5 秒時間)
{
count = 0; //計數清零
LED1=~LED1;
}
}
最後我附上主函式的程式碼
void main(void)
{
LEDinit(); //呼叫初始化函式
Timer3_interrupt_init();
while(1)
{
}
}
通過上面的例子,我們很快就能掌握定時器的基本使用,有不懂得童鞋可以在下面留言。下期我們講講DMA。