STM8的TIM2、TIM3、TIM5是16位通用寄存器,他們的操作方法一樣。
主要功能如下
相關寄存器如下:
如果只用到定時功能的話,需要用到的寄存器有自動裝載寄存器ARR、預分頻寄存器PSCR、事件產生寄存器EGR、狀態寄存器SR、控制寄存器CR、中斷使能寄存器IER。
此處用TIM2實驗,定時器2初始化代碼如下:
void Timer2_Init( void )
{
TIM2_ARRH = ( unsigned char )( 1000 >> 8 ); //定時1ms
TIM2_ARRL = ( unsigned char )( 1000 );
TIM2_PSCR = 0x04; // 16M / (2^4) =1M //分頻值
TIM2_EGR = 0x01; //產生更新事件
TIM2_SR1 = ( ~0x01 ); //清除更新中斷標誌
TIM2_CR1 |= 0x01; //使能計數器
TIM2_IER |= 0x01; //更新中斷使能
}
首先設置自動重裝載值,此處設置爲1000,也就是計數器從0開始計數,當計數到1000時,產生一箇中斷,然後從0開始重新計數。
下來設置分頻係數
系統默認使用的是內部16M晶振,設置分頻值爲4,定時器頻率就爲16M / ( 2^4 ) = 1MHz,計數值設置爲1000,這樣中斷一次就是1ms。
下來使能計數器,開啓更新中斷。這樣定時器初始化工作就設置完成了。
下來編寫中斷函數
#pragma vector = 15 // IAR中的中斷號,要在STVD中的中斷號上加2
__interrupt void Timer2_Handle( void ) //1ms 定時中斷
{
TIM2_SR1 = ( ~0x01 ); //清除更新中斷標誌
time_cnt++;
if( time_cnt > 999 )
{
time_cnt = 0;
LED = !LED;
}
}
進入中斷函數中首先清除中斷標誌位,下來統計中斷次數,因爲中斷1次爲1ms,當時間到達1s後,對LED燈狀態取反。這樣通過定時器2的定時功能就可以實現LED燈1s中閃爍一次。