STM8S的定时器分三类;
高级定时器TIM1
通用定时器TIM2,TIM3,TIM5
基本定时器TIM4,TIM6
其中除TIM4和TIM6是8位定时器外,其他的定时器都是16位计数的。
每个定时器都具有自动重装载功能
每个定时器的时钟都可以由系统时钟独立分频而来,其中高级定时器TIM1可以选择65536种分频,分频系数为1-65536.通用定时器可以选择16种分频,基本定时器只能选择8种分频。
除了TIM1可以选择计数方向外,其他的定时器都是向下计数的,而技术手册上说的向上计数是错误的。
基本中断定时用到的寄存器;
一、自动装载寄存器高位(TIMx_ARRH) 和 自动装载寄存器低位(TIMx_ARRL)
这两个寄存器复位值都是0x00。需要注意的是,高级定时器TIM1和通用定时器TIM2,TIM3,TIM5都是16位计数的定时器,操作寄存器的时候要先写高8位再写低8位。而基本定时器TIM4,TIM6是8位计数的定时器,是不分高8位和低8位的,所以操作基本定时器的时候寄存器名字是(TIMx_ARR)。 操作重装载寄存器的时候更新的值不会马上写入重装载寄存器,而是等到有中断产生的时候操作的数值才会写入寄存器,当然也可以用软件的方法产生中断。(这里省略了影子寄存器的概念,感觉那玩意就是忽悠人的)
二、计数器高位(TIMx_CNTRH) 和计数器低位(TIMx_CNTRL)
计数器高位和计数器低位复位值都是0x00,其中只有高级定时器TIM1和通用定时器TIM2,TIM3,TIM5才会用到这两个计数器,而基本定时器用的计数器是(TIMx_CNTR)。 最好在开启定时器前清零下计数器。基本定时器中(位5:1保留)。
三、中断使能寄存器(TIMx_IER)
这个寄存器对所有定时器都通用,复位值0x00。
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
保留 TIE 保留 保留 CC3IE CC2IE CC1IE UIE
RW RW RW RW RW RW
位7 保留
位6 TIE:触发中断使能
0;触发中断禁用
1;触发中断使能
位5:4 保留
位3 CC3IE:允许捕获/比较3中断
0;禁止捕获/比较3中断
1;允许捕获/比较3中断
注;基本定时器中该位保留
位2 CC2IE:允许捕获/比较2中断
0;禁止捕获/比较2中断
1;允许捕获/比较2中断
注;基本定时器中该位保留
位1 CC1IE:允许捕获/比较1中断
0;禁止捕获/比较1中断
1;允许捕获/比较1中断
注;基本定时器中该位保留
位0 UIE:允许更新中断
0;禁止更新中断
1;允许更新中断
四、状态寄存器 1(TIMx_SR1)
复位值0x00,这个寄存器对高级定时器和通用定时器适用,但是基本定时器的状态寄存器名字是(TIMx_SR) ,对应的功能是一样的,基本定时器中(位5:1保留)。
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
保留 TIF 保留 保留 CC3IF CC2IF CC1IF UIF
Rc_w0 Rc_w0 Rc_w0 Rc_w0 Rc_w0 Rc_w0
位7 保留
位6 TIF:触发中断标志
当产生触发事件时该位由硬件置1(在TRGI信号上检测到有效的触发沿,当选择门控模式时,上升及下降沿都有效)。它由软件清零。
0;没有触发事件发生
1;触发中断悬挂
注意;在TIM2,TIM3中该位保留
位5:4 保留
位3 CC3IF:捕获/比较3中断标志
位2 CC2IF:捕获/比较2中断标志
位1 CC1IF:捕获/比较1中断标志
如果通道CC1配置为输出模式;
当计数器值与比较值匹配时该位由硬件置1,由软件清零
0;无匹配发生
1;TIMX_CNT的值与TIMX_CCR1的值匹配
如果通道CC1配置为输入模式;
当捕获事件发生时该位由硬件置1,由软件清零或者通过读TIMX_CCR1L清零
0;无输入捕获产生
1;计数器值已被捕获(拷贝)至TIMX_CCR1(在IC1上检测到与所选极性相同的边沿)
位0 UIF:更新中断标志
当产生更新事件时该位由硬件置1,它由软件清零。
0;无更新事件产生
1;更新事件等待响应。当寄存器被更新时该位由硬件置1
-若TIMX_CR1寄存器的UDIS=0,计数器溢出
-若TIMX_CR1寄存器的UDIS=0、URS=0,当TIMX_EGR寄存器的UG=1时产生更新事件(软件对计数器CNT重新初始化)
五、控制寄存器 1(TIMx_CR1)
复位值0x00,这个寄存器对所有定时器适用。
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
ARPE 保留 保留 保留 OPM URS UDIS CEN
rw rw rw rw rw
位7 ARPE:自动重装载允许位
0;TIMX_ARR寄存器没有预装载寄存器可以缓冲,可以直接对其操作
1;TIMX_ARR寄存器通过预装载寄存器可以缓冲
位6:4 保留
位3 OPM:单脉冲模式
0;在发生更新事件时,计数器不停止
1;在发生下一次更新事件(清除CEN位)时,计数器停止
位2 URS:更新请求源
0;当更新请求使能时,只要寄存器被更新了就产生更新中断
1;当更新请求使能时,只有计数器溢出才会产生更新中断
位1 UDIS:禁止更新
软件通过该位允许/禁止UEV事件的产生
0;只要计数器溢出,或者产生了软件更新,或者通过时钟/触发模式控制器产生了硬件复位,就产生更新事件
1;不产生更新事件,影子寄存器(ARR,PSC,CCRX)保持他们的值。如果设置了UG则计数器和预分频器被重新初始化。
位0 CEN:使能计数器
0;禁止计数器
1;使能计数器
六、TIMX_PSCR预分频寄存器
这个寄存器在不同的定时器中有不同特点使用方法,在具体应用中介绍。
七、高级定时器TIM1中断定时的使用
高级定时器除了用到上面的寄存器外,还用到时钟预分频寄存器TIM1_PSCRH和TIM1_PSCRL,高级定时器可以选择对系统时钟在1-65536之间的任意分频,因为两个预分频寄存器共16位,最大计数刚好是65536。先写高8位再写低8位。
例;用TIM1中断定时,1ms进一次中断,LED灯1s翻转一次,向下计数模式
/* 这个工程模板是别人的,但是这个头文件不影响使用 ,在自己的工程中需更改为自己的头文件 */
#include<iostm8s105k6.h>
unsigned int ms_count=0;//毫秒计数
/************************************
各种函数声明
************************************/
void InitLED();
void InitTIM1();
int main(void)
{
CLK_CKDIVR = 0x00; //CPUDIV = 1 HSIDIV = 1 内部时钟 = 16Mhz
asm("sim"); //先关闭总中断
InitLED(); //各种初始化
InitTIM1();
asm("rim"); //打开总中断
while(1); //进入死循环,等待定时器周期中断
}
/*********************************************************
定时器1更新中断处理函数
中断向量也可以用十进制代替,这里使用16进制是为了方便而已,
因为头文件的宏定义就是用16进制的,