历史上的今天
今天是:2025年06月10日(星期二)
2020年06月10日 | 基于STM8SF103定时器的使用方法解析
2020-06-10 来源:elecfans
看了网上的资源,都不怎么好用,于是决定总结总结,记录下定时器的简单实用方法。
环境: STM8SF103 ,仿真器为:STLINK
TIM4 属于8位定时器,最大128分频。
这个定时器的时钟源是系统时钟源(fMaster),然后直接通过预分频器分频后供CK_CNT使用。如:系统频率为4MHz,经过128分频后,提供给定时器使用的频率就为 31250Hz
因为项目需要,我这里使用的内部RC 16MHz振荡器,并进行LSI 4分频,所以主频为4MHz。

//main.c
voidInit_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停止计时器
}
voidmain(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)*/
@far@interruptvoidTIM4_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,其他的头也可以。
定时器2 (16位计时器) 的简单实用与此类似,但需要注意设置初值的方法,如:
voidInit_Tim2(void)
{
TIM2_EGR=0x01;//手动产生更新事件,重新初始化计数器,并允许产生一个更新事件
//设置定时器初值
TIM2_CNTRH=0;//不能使用TIM2_CNTR直接设值,TIM2_CNTRL=0;
//设定自动重装寄存器值
//这里得注意不能使用TIM2_ARR的方式进行设值,TIM2是十六位的。
//如TIM2_ARR=0xFA,实际上是赋给高字节了,TIM2_ARRH=0xFA,而不是想象中的赋给低字节。
TIM2_ARRH=0x7A;//312504MHz/128=31250Hz(1S)
TIM2_ARRL=0x12;//0x7A1231250意味着每产生一次中断时间为1S
TIM2_PSCR=0x07;//分频128
TIM2_IER=0x01;//中断允许位使能
TIM2_CR1=0x01;//使能计时器
}
整个使用需要注意几点:
第一、总中断的开启 _asm(“rim”)
第二、中断向量表对应位置的中断处理过程改写
第三、定时器自身的使能,包括中断使能和计时器使能
第四、默认情况下,TIM4的外设时钟是开启的,CLK_PCKENR为0xFF,外设TIM4时钟如果关闭,时钟是运行不起来的。
上一篇:你该了解的单片机复位电路
史海拾趣
|
引起IGBT失效的原因有: 1) 过热损坏集电极电流过大引起的瞬时过热及其它原因,如散热不良导致的持续过热均会使IGBT损坏。如果器件持续短路,大电流产生的功耗将引起温升,由于芯片的热容量小,其温度迅速上升,若芯片温度超过硅本征温度(约250℃ ...… 查看全部问答> |
|
最近毕业设计的课题,希望哪位高人帮帮忙,不胜感激!!! 主要是电气原理图, 要求如下: 某电厂燃料运输需要用到12条胶带机拖动12条皮带进行运输(1-12号),其中单号和双号皮带是并行进行的,相当于是双备份,现需设计整个燃料运输控制系统, ...… 查看全部问答> |
|
declaration lacks type/storage-class(assuming 'int'):'class'这是什么原因 我在ADS的text file中定义如下的基类: //消息处理基类 #ifndef _OBJECT_H_ #define _OBJECT_H_ #include \"config.h\" class CObject{ public: virt ...… 查看全部问答> |
|
RSEL2~RSEL0:选择某个内部电阻以决定标称频率(0最低,7最高) 1什么叫其标称频率? 2最低是多少?最高多少? 3设置不同的标称频率对单片机工作什么影响? 4一般怎么设置?如果不设置默认是多少? 对于DCOCTL 1.DCO0~DCO2:DCO Se ...… 查看全部问答> |
|
前段时间,做了一个小项目,十路继电器的控制方面,要用一台电脑通过串口控制两块单片机板子,每块板子有10路继电器。我是用的STC12C5A32S2芯片。用的RS485通信。 这个是一个 ...… 查看全部问答> |
|
我在CCS5上面看msp430g2553的例程,上面有句话“// Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10”,,,,是不是除了CCS上430的例程外,IAR的软件也有啊?我在IAR官网上找了一下,怎奈语言不是很好没有找 ...… 查看全部问答> |




