在单片机中定时器是一个非常重要的概念,这篇文章主要是对定时器TIM1做一个学习笔记。
STM8S003xx只含有TIM1、TIM2、TIM4,其中TIM1是高级控制寄存器,TIM2和TIM4是通用定时器,这篇文章介绍的是TIM1。
在《数据手册》中我们可以知道,TIM1是一个应用广泛的高级定时器,由其互补输出,死区时间控制和居中对齐PWM功能。其应用领域扩展到电机控制、灯和半桥驱动。
● 16位向上、向下、向上/向下自动重装载计数器,并有一个16位预分频器。在《参考手册》中我们知道,TIM1由一个16位的自动装载计数器组成,它有一个可编程的预分频器驱动。 本章中使用i来代表1、2、3、4,分别对应于四个不同的捕获/比较通道。高级控制定时器适用于许多不同的用途:
● 基本的定时功能高级控制定时器广泛的适用于各种控制应用中,包括那些需要中间对齐模式PWM的应用,该模式支持互补输出和死区时间控制。 高级控制定时器的时钟源可以是内部时钟,也可以是外部的信号,可以通过配置寄存器来进行选择。
TIM1的特性包括:
● 16位向上、向下、向上/下自动装载计数器
● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器
● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意
数值
● 同步电路,用于使用外部信号控制定时器以及定时器互联 (某些型号的芯片没有定时器互联功能)
● 多达4个独立通道可以配置成:
─ 输入捕获
─ 输出比较
─ PWM生成(边缘或中间对齐模式)
─ 六步 PWM输出
─ 单脉冲模式输出
─ 三个支持带互补输出,并且死区时间可编程的通道
● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态
● 产生中断的事件包括:
─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
─ 输入捕获
─ 输出比较
─ 刹车信号输入
通过网络搜索知道,字面意思时基即时间显示的基本单位。另外的定义是时基是一种标准正当起,根据该震荡周期中相应瞬间来确定它的时间间隔。另一个定义为时基是一个作为基准的震荡,其震荡周期某些部分的出现瞬时能够用来确定时间间隔。术语时基也可以应用在产生基准震荡的设备中。
TIM1的时基单元包含
● 16位向上/向下计数器
● 16位自动重载寄存器
● 重复计数器
● 预分频器
图29 时基单元
预分频器、16位计数器、自动重载寄存器、重复计数器寄存器都可以通过软件进行读写操作。
其中自动重载寄存器由预装载寄存器和影子寄存器组成。 可在在两种模式下写自动重载寄存器:
● 自动预装载已使能(TIM1_CR1寄存器的ARPE位置位)。在此模式下,写入自动重载寄存器的数据将被保存在预装载寄存器中,并在下一个更新事件(UEV)时传送到影子寄存器。
● 自动预装载已禁止(TIM1_CR1寄存器的ARPE位清除)。在此模式下,写入自动重载寄存器的数据将立即写入影子寄存器。
更新事件的产生条件:
● 计数器向上或向下溢出。
● 软件置位了TIM1_EGR寄存器的UG位。
● 时钟/触发控制器产生了触发事件。
在预装载使能时(ARPE=1),如果发生了更新事件,预装载寄存器中的数值(TIM1_ARR)将写入影子寄存器中,并且TIM1_PSCR寄存器中的值将写入预分频器中。
置位TIM1_CR1寄存器的UDIS位将禁止更新事件(UEV)。
计数器由预分频器的输出CK_CNT驱动,而CK_CNT仅在IM1_CR1寄存器的计数器使能位(CEN)被置位时才有效。
写计数器的操作没有缓存,并且可以在任何时候写TIM1_CNTRH和TIM1_CNTRL寄存器,因此我们建议不要在计数器运行时写入新的数值,以免写入了错误的数值。
读计数器的操作带有8位的缓存。在用户读了高位(MS)字节后,低位(LS)字节将被自动缓存,缓存的数据在16位的读操作完成之前不会有变化,图30解释了这一过程。
注意:不要使用LDW指令来读取16位计数器值,因为此指令先读低位(LS)字节,这样读出的数值是错误的。
图30 读16位计数器的过程(TIM1_CNTR)
预装载寄存器(自动重载寄存器由预装载寄存器和影子寄存器组成)中的值将写入16位的TIM1_ARR寄存器(自动重装载寄存器)中,此操作由两条指令完成,每条指令写入1个字节,高位(MS)字节是先写入的。
影子寄存器在高位(MS)字节写入时被锁定,并保持到低位(LS)字节写完。不要使用LDW指令,
因为此指令先写低位(LS)字节,这将导致写入的数值错误。
预分频器的实现:
TIM1的预分频器基于一个由16位寄存器(TIM1_PSCR)控制的16位计数器。由于这个控制寄存器带有缓冲器,因此它能够在运行时被改变。预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。 【这里分频的是经过单片机初始化以后的频率】
计数器的频率可以由右式计算: fCK_CNT = fCK_PSC / (PSCR[15:0] + 1)
预分频器的值由预装载寄存器写入,保存了当前使用值的影子寄存器在低位(LS)写入时被载入。 需两次单独的写操作来写16位寄存器,高位(MS)先写。不要使用先写低位(LS)的LDW指令。 新的预分频器的值在下一次更新事件到来时被采用。 对TIM1_PSCR寄存器的读操作通过预装载寄存器完成,因此不需要特别的关注。
在向上计数模式中,计数器从0计数到用户定义的比较值(TIMx_ARR寄存器的值),然后重新从0开始计数并产生一个计数器溢出事件,同时,如果TIM1_CR1寄存器的UDIS位(bit1)是0,将会产生一个更新事件(UEV)。0描述了向上计数模式。
图31 向上计数模式计数器
置位TIMx_EGR寄存器(事件产生寄存器)的UG位(通过软件方式或者使用从模式控制器)也同样可以产生一个更新事件。
使用软件置位TIMx_CR1寄存器的UDIS位,可以禁止更新事件,这样可以避免在更新预装载寄存器时更新影子寄存器。在UDIS位被清除之前,将不产生更新事件。但是在应该产生更新事件时,计数器仍会被清0,同时预分频器的计数也被清0(但预分频器的数值不变)。此外,如果设置了TIMx_CR1寄存器中的URS位(选择更新请求),设置UG位将产生一个更新事件UEV,但硬件不设置UIF标志(即不产生中断请求)。这是为了避免在捕获模式下清除计数器时,同时产生更新和捕获中断。
当发生一个更新事件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志位(TIMx_SR寄存器的UIF位):
自动装载影子寄存器被重新置入预装载寄存器的值(TIMx_ARR)。 预分频器的缓存器被置入预装载寄存器的值(TIMx_PSC寄存器的内容)。 下图给出一些例子,说明当TIMx_ARR=0x36时,计数器在不同时钟频率下的动作。
图32的预分频为2,因此计数器的时钟(CK_CNT)频率是预分频时钟(CK_PSC)频率的一半。
图32禁止了自动装载功能(ARPE=0),所以在计数器达到0x36时,计数器溢出,影子寄存器立刻被更新,同时产生一个更新事件。
图32 当ARPE=0(ARR不预装载),预分频为2时的计数器更新。
图33的预分频为1,因此CK_CNT的频率与CK_PSC一致。 图33使能了自动重载(ARPE=1),所以在计数器达到0xFF产生溢出。0x36将在溢出时被写入,同时产生一个更新事件。
图33 ARPE=1(TIM1_ARR预装载)时的计数器更新
地址偏移值:0x00
复位值:0x00
地址偏移值:0x07
复位值:0x00