stm8s定時(shí)器tim4概述
該定時(shí)器由的8可位自動(dòng)重載的向上計(jì)數(shù)器所組成,它可以用來(lái)作為時(shí)基發(fā)生器,具有溢出中斷功能。
TIM6同時(shí)鐘信號(hào)控制器用于定時(shí)器同步和級(jí)聯(lián)。
STM8通用定時(shí)器TIM4的主要功能
TIM4功能包括:
1、8位向上計(jì)數(shù)的自動(dòng)重載計(jì)數(shù)器;
2、3位可編程的預(yù)分配器(可在運(yùn)行中修改),提供1,2,4,8,16,32,64和128這8種分頻比例。
3、中斷產(chǎn)生
–在計(jì)數(shù)器更新時(shí):計(jì)數(shù)器溢出
STM8通用定時(shí)器TIM4功能概述
(TIM4框圖 )
中斷
通用定時(shí)器包括2個(gè)中斷源:
更新中斷(溢出,計(jì)數(shù)器初始化);
觸發(fā)信號(hào)輸入(僅TIM6可用)
STM8S定時(shí)器的使用
環(huán)境:STM8SF103 ,仿真器為:STLINK
TIM4 屬于8位定時(shí)器,最大128分頻。
這個(gè)定時(shí)器的時(shí)鐘源是系統(tǒng)時(shí)鐘源(fMaster),然后直接通過(guò)預(yù)分頻器分頻后供CK_CNT使用。如:系統(tǒng)頻率為4MHz,經(jīng)過(guò)128分頻后,提供給定時(shí)器使用的頻率就為31250Hz
因?yàn)轫?xiàng)目需要,我這里使用的內(nèi)部RC 16MHz振蕩器,并進(jìn)行LSI 4分頻,所以主頻為4MHz。
//main.c
void Init_Tim4(void)
{
/*很多人都是在這里裝填0xFF,其實(shí)是為了讓PSC盡快生效,對(duì)于PSC的設(shè)置,需要在下一個(gè)更新事件時(shí)才會(huì)生效*/
TIM4_CNTR=0; //計(jì)數(shù)器值
TIM4_ARR=0xFA; //自動(dòng)重裝寄存器 250,產(chǎn)生125次定時(shí)1S
TIM4_PSCR=0x07; //預(yù)分頻系數(shù)為128 TIM4_EGR=0x01; //手動(dòng)產(chǎn)生一個(gè)更新事件,用于PSC生效 注意,是手動(dòng)更新
TIM4_IER=0x01; //更新事件中斷使能
TIM4_CR1=0x01; //使能計(jì)時(shí)器,TIM4_CR0停止計(jì)時(shí)器
}
void main(void)
{
_asm(“rim”); //這是必須的,因?yàn)橄到y(tǒng)重啟后,軟件中斷級(jí)別為3級(jí),處于最高級(jí),除了TRAP,TLI,RESET三個(gè)中斷外不響應(yīng)其他中斷。
//rim將軟件級(jí)別更改為0級(jí)別,這樣其他中斷就能得到相應(yīng)。
Init_Tim4();
while(1);
}
//中斷向量表必須將TIM4的中斷處理函數(shù)填寫(xiě)進(jìn)去
{0x82, TIM4_UPD_OVF_IRQHandler}, /* irq23 */
//處理函數(shù)如下:
/*定時(shí)器4用作看門(mén)狗喂狗定時(shí),因?yàn)榭撮T(mén)狗最大延時(shí)510ms,
定時(shí)器頻率為4MHz/128=31250 = 250 * 125,125 / 5 = 25 (200ms)*/ @far @interrupt void TIM4_UPD_OVF_IRQHandler(void)
{
t4++;
TIM4_SR=0; //清除中斷標(biāo)志
//t4==125 //定時(shí)1S
if(t4==25) //25 * 250 定時(shí)200ms
{
FREE_IWDG; //喂狗,如果單純定時(shí)用,可以拿掉
//可以嘗試點(diǎn)亮LED燈
t4=0;
}
return;
}
定時(shí)器延時(shí)計(jì)算過(guò)程,如主頻4MHz,預(yù)分頻為128,定時(shí)器頻率等于4000000 / 128 = 31250 (Hz),周期為32us。4分頻時(shí)周期為1us。
如:主頻8MHz,預(yù)分頻為128,定時(shí)器頻率等于8000000 / 128 = 62500 (Hz),周期為16us。
整個(gè)代碼沒(méi)有使用庫(kù)函數(shù),諸如TIM4_SR TIM4_CR1之類(lèi)的定義在stm8s103k.h,其他的頭也可以。
定時(shí)器2 (16位計(jì)時(shí)器) 的簡(jiǎn)單實(shí)用與此類(lèi)似,但需要注意設(shè)置初值的方法,如:
void Init_Tim2(void)
{
TIM2_EGR=0x01; //手動(dòng)產(chǎn)生更新事件,重新初始化計(jì)數(shù)器,并允許產(chǎn)生一個(gè)更新事件
//設(shè)置定時(shí)器初值
TIM2_CNTRH=0; //不能使用TIM2_CNTR直接設(shè)值,TIM2_CNTRL=0;
//設(shè)定自動(dòng)重裝寄存器值
//這里得注意不能使用TIM2_ARR的方式進(jìn)行設(shè)值,TIM2是十六位的。
//如TIM2_ARR=0xFA,實(shí)際上是賦給高字節(jié)了,TIM2_ARRH=0xFA,而不是想象中的賦給低字節(jié)。
TIM2_ARRH=0x7A; //31250 4MHz / 128 = 31250Hz (1S)
TIM2_ARRL=0x12; //0x7A12 31250 意味著每產(chǎn)生一次中斷時(shí)間為1S
TIM2_PSCR=0x07; //分頻128
TIM2_IER=0x01; //中斷允許位使能
TIM2_CR1=0x01; //使能計(jì)時(shí)器
}
整個(gè)使用需要注意幾點(diǎn):
第一、總中斷的開(kāi)啟_asm(“rim”)
第二、中斷向量表對(duì)應(yīng)位置的中斷處理過(guò)程改寫(xiě)
第三、定時(shí)器自身的使能,包括中斷使能和計(jì)時(shí)器使能
第四、默認(rèn)情況下,TIM4的外設(shè)時(shí)鐘是開(kāi)啟的,CLK_PCKENR為0xFF,外設(shè)TIM4時(shí)鐘如果關(guān)閉,時(shí)鐘是運(yùn)行不起來(lái)的。
評(píng)論