STM8SF103 ,仿真器为:STLINK TIM4 属于8位定时器,最大128分频。 这个定时器的时钟源是系统时钟源(fMaster),然后直接通过预分频器分频后供CK_CNT使用。如:系统频率为4MHz,经过128分频后,提供给定时器使用的频率就为 31250Hz 这里使用的内部RC 16MHz振荡器,并进行LSI 4分频,所以主频为4MHz。 ------------------ //main.c
void Init_Tim4(void)
{
/*很多人都是在这里装填0xFF,其实是为了让PSC尽快生效,对于PSC的设置,需要在下一个更新事件时才会生效*/
TIM4_CNTR=0; //计数器值
TIM4_ARR=0xFA; //自动重装寄存器 250,产生125次定时1S
TIM4_PSCR=0x07; //预分频系数为128
TIM4_EGR=0x01; //手动产生一个更新事件,用于PSC生效 注意,是手动更新
TIM4_IER=0x01; //更新事件中断 使能
TIM4_CR1=0x01; //使能计时器,TIM4_CR0停止计时器
}
void main(void)
{
_asm("rim"); //这是必须的,因为系统重启后,软件中断级别为3级,处于最高级,除了TRAP,TLI,RESET三个中断外不响应其他中断。
//rim将软件级别更改为0级别,这样其他中断就能得到相应。
Init_Tim4();
while(1);
}
//中断向量表必须将TIM4的中断处理函数填写进去
{0x82, TIM4_UPD_OVF_IRQHandler}, /* irq23 */
//处理函数如下:
/*定时器4用作看门狗喂狗定时,因为看门狗最大延时510ms,
定时器频率为4MHz/128=31250 = 250 * 125,125 / 5 = 25 (200ms)*/
[url=home.php?mod=space&uid=1095855]@far[/url] [url=home.php?mod=space&uid=422518]@interrupt[/url] void TIM4_UPD_OVF_IRQHandler(void)
{
t4++;
TIM4_SR=0; //清除中断标志
//t4==125 //定时1S
if(t4==25) //25 * 250 定时200ms
{
FREE_IWDG; //喂狗,如果单纯定时用,可以拿掉
//可以尝试点亮LED灯
t4=0;
}
return;
}
定时器延时计算过程,如主频4MHz,预分频为128,定时器频率等于 4000000 / 128 = 31250 (Hz),周期为32us。4分频时周期为1us。 如:主频8MHz,预分频为128,定时器频率等于 8000000 / 128 = 62500 (Hz),周期为16us。
整个代码没有使用库函数,诸如TIM4_SR TIM4_CR1之类的定义在stm8s103k.h,其他的头也可以。
|