stm8s開發(fā)(五) TIMER的使用:定時!
STM8S提供三種類型的TIM 定時器:高級控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定時器(TIM4/TIM6)。它們雖有不同功能但都基于共同的架構(gòu)。此共同的架構(gòu)使得采用各個定時器來設(shè)計應(yīng)用變得非常容易與方便(相同的寄存器映射,相同的基本功能)。
本文引用地址:http://www.ex-cimer.com/article/201709/364419.htm
使用定時可以確定一個時間片,方便控制發(fā)送速率,采樣速率,等等一些對時間要求比較高的任務(wù),而這些操作可以放入定時器中斷里面執(zhí)行。這次的例子,定時1s,讓LED燈翻轉(zhuǎn)一次,達(dá)到2s閃爍一次的效果。由于定時操作簡單,我們使用基本定時器:TIMER4
void Init_Timer4(void)
{
//128分頻 256計數(shù),在16MHz下是2.048ms一次中斷!
//128分頻 256計數(shù),在128KHz下是256ms一次中斷!
TIM4_CR1=0x00;//關(guān)閉計數(shù)器
//TIM4_IER=0x00;
TIM4_IER=0x01;//更新中斷使能
TIM4_EGR=0x01;
TIM4_CNTR=255;//計數(shù)器值
TIM4_ARR=255;//自動重裝的值
TIM4_PSCR=0x07;//分頻值
TIM4_CR1=0x01;//使能計數(shù)器
}
值得注意的是,如果我們使用16M為主時鐘的話,通過最大分頻和最大計數(shù),我們也最多能達(dá)到2.048ms的定時時間。同理,使用128K為主時鐘的話,最多能達(dá)到256ms的定時時間。
接下來是定時終端函數(shù),在函數(shù)中我們可以其他操作:
u16 i=0;
#pragma vector = TIM4_OVR_UIF_vector //0x19
__interrupt void TIM4_OVR_UIF_IRQHandler(void)
{
i++;
TIM4_SR=0x00;
if(i==488) //2.048*488=1000ms
{
LED_Reverse();
i=0;
}
}
這里變量 i 用于計算進(jìn)入中斷的次數(shù),如果我們需要1s翻轉(zhuǎn)LED一次的話,則需要進(jìn)入中斷488次。
當(dāng)中斷返回后, 定時器會自動重載:(TIM4_ARR=255;//自動重裝的值)
定時器定時時間與計數(shù)器的值有關(guān):(TIM4_CNTR=255;//計數(shù)器值)
同時也和分頻值有關(guān):(TIM4_PSCR=0x07;//分頻值)
開啟個關(guān)閉寄存器只需要修改TIM4_CR1寄存器:(TIM4_CR1=0x00;//關(guān)閉計數(shù)器 TIM4_CR1=0x01;//使能計數(shù)器 )
附上stm8s在IAR環(huán)境下的項目工程,包括了SPI、IIC、PWM、AWU、USART、EEPROM等片上硬件的初始化代碼。
評論