定时器

定时器
Kayer定时器
1. 系统定时器
1.1 SysTick介绍
系统定时器(SysTick系统)是属于CM3内核,内嵌在NVIC中。
系统定时器是一个24bit的向下递减的计数器,计数器每计数一次的时间为1 / SYSCLK,一般我们设置系统时钟SYSCLK(与AHB相同)等于72M。当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环往复。
SysTick定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间SysTick的处理方式都是相同的。
系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。
1.2 SysTick工作原理
在使用Systick定时器进行延时操作时,可以设定初值并使能后,每经过一个系统时钟周期,计数值就减1。当计数到0时,Systick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(如果中断使能)。这样可以在中断处理函数中实现特定的延时逻辑。
1.3 SysTick寄存器
表格提供了SysTick寄存器映射和复位值。SysTick寄存器块的基地址是0xE000 E010。
- SysTick控制及状态寄存器(CTRL)
位段 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
16 | COUNTFLAG | R | 0 | 如果在上次读取本寄存器后,SysTick已经数到了0,则该位为1。如果读取该位,该位自动清零 |
2 | CLKSOURCE | R/W | 0 | 0=外部时钟源(STCLK),ST公司将其应用为8分频 1=内核时钟(FCLK),ST公司将其应用为1分频 |
1 | TICKINT | R/W | 0 | 1=SysTick倒数到0时产生SysTick异常请求 0=数到0时无动作 |
0 | ENABLE | R/W | 0 | SysTick定时器的使能位 |
- SysTick重装载数值寄存器(LOAD)
位段 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
23:0 | RELOAD | R/W | 0 | 当倒数至零时,将被重装载的值 |
- SysTick当前数值寄存器(VAL)
位段 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
23:0 | CURRENT | R/W | 0 | 读取时返回当前倒计数的值,写它则使之清零,同时还会清除 |
2. 基本定时器
2.1 基本定时器介绍
基本定时器TIM6和TIM7由一个16位自动重装载计数器组成,该计数器由一个可编程预分频器驱动。
它们可以作为时间基准生成的通用定时器使用,但它们也特别用于驱动数字模拟转换器(DAC)。实际上,定时器内部与DAC相连,并且能够通过它们的触发输出来驱动DAC。
这些定时器是完全独立的,不共享任何资源。
2.2 TIM6和TIM7主要特性
基本定时器(TIM6和TIM7)的特性包括:
- 16位自动重装载向上计数器
- 16位可编程预分频器,用于将计数器时钟频率除以1到65536之间的任何因子(也称为“实时”)
- 同步电路,用于触发DAC
- 在更新事件上生成中断/DMA:计数器溢出
基本定时器由于没有外部IO,因此只能计时,不能对外部脉冲进行计数。
功能:定时中断,主模式,触发DAC。
2.3 时钟源
基本定时器只有一种时钟源:内部时钟(一般为72MHz)。
2.4 触发控制器
通常用于触发其他外设的操作,使得不同的外设能够协同工作。比如触发DAC输出。
基本定时器只是把时钟信号传输给时基单元
2.5 时基单元
流程:
- 预分频器将过来的时钟信号进行预分频。
- 按1到65536之间的任意值分频。
- 然后把分频后的信号作为计数器的时钟。
基本定时器只能向上计数,从0开始自增。
自增到自动重装载寄存器的值时,下一个时钟上升沿到来后,计数器产生溢出,从0重新计数,并产生更新事件(UEV)。如果开启中断,也会产生更新中断。
写数据到自动重装载寄存器时先写到预加载寄存器,然后再更新到影子寄存器。
计数器是否溢出,是查看的影子寄存器的值。
寄存器CR1的ARPE位决定更新时机(是否预加载)。
没有预加载时,写入的新值会立即更新到影子寄存器。
有预加载时,写入的新值会等到产生更新事件(计数器溢出)才更新到影子寄存器。
2.6 溢出时间计算
3. 通用定时器
3.1 通用定时器介绍
通用定时器由一个16位自动重装载计数器组成,该计数器由可编程预分频器驱动。
它们可用于多种目的,包括测量输入信号的脉冲长度(输入捕获)或生成输出波形(输出比较和PWM)。
通过定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以从几微秒调节到几毫秒。
定时器是完全独立的,不共享任何资源。
拥有基本定时器所有功能
3.2 TIMx的主要特点
通用型TIMx(TIM2~TIM5 and TIM9~TIM14)定时器特性包括:
16位向上、向下、自动重载计数器。
16位可编程预分频器,用于将计数器时钟频率除以1到65536之间的任意因子(也可“实时”操作)。
最多4个独立通道,用于:
输入捕获
输出比较
PWM生成(边沿和中心对齐模式)
单脉冲模式输出
同步电路,用于用外部信号控制定时器和连接多个定时器。
在以下事件上生成中断/DMA:
- 更新:计数器溢出/下溢、计数器初始化(通过软件或内部/外部触发)
- 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)
- 输入捕获
- 输出比较
支持增量(正交)编码器和霍尔传感器电路用于定位目的
外部时钟或逐周期电流管理的触发输入
3.3 时钟源
3种可选的时钟源:
- 内部时钟模式(默认72MHz)
- 外部时钟模式1:
- 使用定时器自身通道的输入信号作为时钟源
- 每个定时器有4个输入通道(TIMx_CH1 ~ TIMx_CH4)
- 只有通道1和通道2的信号可以作为时钟信号源
- 通道1和通道2的信号经过输入滤波和边缘检测器,成为时钟源
- 外部时钟模式2:
- 使用定时器的特殊引脚ETR引脚的信号作为时钟源
- 每个通用定时器都有一个ETR引脚
- ETR引脚信号经过极性选择,边缘检测,预分频器,输入滤波,得到信号ETRF,成为外部时钟源
不配置时钟源的情况下,默认选择的就是内部时钟源
3.4 计数器模式
三种计数模式:
- 向上计数模式
- 与基本定时器一样,都是从0开始加,一直加到自动重装载寄存器的值。然后再来一个时钟信号,计数器溢出,产生更新事件。重新从0开始计数
- 向下计数模式
- 从自动重装载寄存器的值开始计数,直至减到0。然后再来一个时钟信号,计数器溢出,产生更新事件。重新从自动重载寄存器的值继续计数。
- 中央对齐模式(向上和向下计数)
- 从0开始向上计数,一直计数到自动重装载寄存器的值–1,再来一个时钟信号会产生更新事件,然后继续从自动重装载寄存器的值向下计数,向下计数到1,再来一个时钟信号会产生更新事件,然后继续从0开始向上就计数。
默认计数方向是向上计数
3.4 PWM脉冲
PWM(脉冲宽度调制 Pulse-width modulation),是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM通常用于控制电机、LED亮度调节等应用。
在实际使用中,生成的PWM波形其实就是生成一个方波信号。
- 高低电平:Ton/Toff
- 周期:Ts
- 频率:1/Ts
- 占空比:Ton / Ts(高电平占周期的比例)
- 分辨率:占空比变化步距
在使用PWM驱动惯性电器时,一般不改变频率和周期,通过更改占空比达到对外输出的有效电压的值。
3.5 输出比较
该功能是用来控制输出方波,大多用于输出PWM波形,也可以输出其他波形,但只能输出方波。
该功能包含三部分:
- 计数器部分
- 捕获比较寄存器
- 每个定时器有四个(不包括基础定时器),可以同时实现四路比较
- 输出部分
- 四路输出
计数器(CNT)寄存器的值与捕获/比较器(CCR)寄存器的值进行比较,根据比较结果(> = <)不同,产生不同输出:高电平 / 低电平
由CCMR1寄存器的OC1M[2,0],共3位来控制。总共8种输出比较模式。
8种输出比较模式(以通道1为例):
- 000:输出冻结
- 输出比较寄存器 TIMx_CCR1 与计数器 TIMx_CNT 的比较对输出没有影响。(这种模式用于生成定时基准)。
- 001:匹配时将通道 1 设置为高电平。
- 当 TIMx_CNT = TIMx_CCR1 时,OC1REF 信号被强制为高电平。
- 010:匹配时将通道 1 设置为低电平。
- 当 TIMx_CNT = TIMx_CCR1 时,OC1REF 信号被强制为低电平。
- 011:翻转
- 当 TIMx_CNT = TIMx_CCR1 时,OC1REF 信号翻转。
- 100:强制输出低电平
- OC1REF 被强制为低电平。
- 101:强制输出高电平
- OC1REF 被强制为高电平。
- 110:PWM 模式 1
- 在向上计数时,TIMx_CNT < TIMx_CCR,输出高电平,否则为低电平。
- 在向下计数时,TIMx_CNT > TIMx_CCR,输出低电平,否则为高电平。
- 若CCR = 60,(ARR + 1)= 100,则占空比为60%
- 111:PWM 模式 2
- 在向上计数时,TIMx_CNT < TIMx_CCR,输出低电平,否则为高电平。
- 在向下计数时,TIMx_CNT **> **TIMx_CCR,输出高电平,否则为低电平。
- 若CCR = 60,(ARR + 1)= 100,则占空比为40%
通常使用PWM模式 1
3.6 极性选择
CCER寄存器的 CCxP 极性选择配置:
CC1P:捕获/比较1输出极性
- CC1通道配置为输出:
- 0:OC1高电平有效。
- 1:OC1低电平有效。
- CC1通道配置为输入:
- 此位选择使用IC1或IC1用于触发或捕获操作。
- 0:非反相:在IC1的上升沿进行捕获。当用作外部触发时,IC1是非反相的。
- 1:反相:在IC1的下降沿进行捕获。当用作外部触发时,IC1是反相的。
3.7 输入捕获
该功能可以捕获输入通道上信号的上升沿或下降沿。
多用于测量PWM的周期/频率,只需要测量出连续的两个上升沿或连续的两个下降沿的时间间隔。
也可以测量占空比,只需要测量出连续的一个上升沿和一个下降沿的时间间隔,然后除以周期即可。
该功能包含三部分:
- 输入部分
- 共四路信号
- 四路输入引脚和四路输出引脚是同一个引脚
- 对于同一路引脚,只能处于输入捕获或输出比较功能。
- 计数器部分
- 捕获寄存器部分
- 共四路,与比较寄存器共用
以通道1为例:若计数器向上计数,重装载寄存器的值为65535,尽量避免计数器溢出。
信号经过通道1的引脚进入通道1,得到TI1
TI1信号进入滤波器和边沿检测器。
- 滤波器用来滤掉一些毛刺信号,信号质量好可以不滤波
- 边沿检测器确定要捕获的是上升沿还是下降沿
从边沿检测器出来的上升沿或下降沿信号为TI1FP1
T1FP1经过信号选择器得到IC1
IC1进入预分频器,可以对信号选择分频或不分频。如果捕获的频率很高,可以分频。
信号从预分频器出来,信号为IC1PS
- 会产生一个捕获比较事件
- 如果开启了中断也会产生捕获比较中断
- 立即把计数器寄存器的值存入到捕获寄存器中。在下次捕获事件产生之前,捕获寄存器的值不会发生变化。
例如:
- 假设对计数器时钟72分频(便于计算),则计数器时钟频率为1MHz,计数器累加一次的时间为 1us
- 设置定时器自动重装载寄存器的值为65535。把这个值设置为最大,尽量避免溢出。
- 假设测量的信号周期小于65535us即频率大于16Hz
- 在一个周期内,计数器不会溢出。
- 当第1个上升沿到来时,重置计数器的值(让计数器从0开始计数)
- 当第2个上升沿到来时,计数器的值会自动copy到捕获寄存器,读出捕获寄存器的值,这个值就表示信号的周期。单位us。
3.8 触发输入
定时器的触发信号分两大类:
触发输入信号(TRGI)
- 从外部过来(也可能是自己输入通道过来)到本定时器的信号。
- 用来控制本定时器一些动作,比如复位。
- 此时本该定时器就处于主从模式中的从模式。
触发输出信号(TRGO)
- 是本定时器输出到其他定时器或其他外设的信号
- 与其他定时器的级联(触发其他定时器的一些工作)或触发一些其他外设工作。
- 此时该定时器就是主从模式中的主模式。
根据从模式控制寄存器(TIMx_SMCR)中TS[2:0]
这个位字段选择用于同步计数器的触发输入,触发信号共有八个:
- 000: 内部触发器 0 (ITR0)。
- 001: 内部触发器 1 (ITR1)。
- 010: 内部触发器 2 (ITR2)。
- 011: 内部触发器 3 (ITR3)。
- 100: TI1 边沿检测器 (TI1F_ED)
- 101: 滤波后的定时器输入 1 (TI1FP1)
- 110: 滤波后的定时器输入 2 (TI2FP2)
- 111: 外部触发输入 (ETRF)
可分为四类:
TS[2:0]=000-011 ITRx(1~4)
- 来源于其他定时器的TRGO信号
- 经过芯片内部连接,来到本定时器的ITR0/1/2/3(内部连接是定死的,不能更改。)
- ITRx中某个信号经过信号选择器最终成为TRGI信号
- TRGI信号通过从模式控制器控制本定时器实现复位或使能或更改计数方式等。
TS[2:0]=111 外部触发输入 (ETRF)
- 来源于外部触发脚ETR
- 经过极性选择,边沿检测和预分频器,输入滤波器,成为TRGI信号
- TRGI信号通过从模式控制器控制本定时器实现复位或使能或更改计数方式等。
TS[2:0]=100 TI1 边沿检测器 (TI1F_ED)
- 来源于定时器自身的通道1信号
- 经过输入滤波器和边缘检测器,得到TI1F_ED信号
- 上升沿和下降沿都会产生TI1F_ED信号。
- 经过信号选择器最终成为TRGI信号
TS[2:0]=101/110 滤波后的定时器输入 1 (TI1FP1)/滤波后的定时器输入 2 (TI2FP2)
- 来源于定时器自身的通道1信号或通道2信号
- 经过输入滤波器和边沿检测器
- 得到TI1FP1和TI2FP2信号。它们是上升沿或下降沿,只能选择一种。
- 最终成为TRGI信号
3.9 从模式
通过触发输入,这4类8个TRGI信号要控制定时器,必须把定时器配置为从模式。
根据从模式控制寄存器(SMCR)的SMS[2:0] (Slave mode selection)位用来配置从模式工作模式。
从模式选择:
当选择外部信号时,触发信号(TRGI)的活动边沿与外部输入选定的极性相连接。
- 000:从模式禁用 - 如果CEN = ‘1’,则预分频器直接由内部时钟驱动。默认值。
- 001:编码器模式1 - 计数器根据TI1FP2的电平在TI2FP1的边沿上进行向上/向下计数。
- 010:编码器模式2 - 计数器根据TI2FP1的电平在TI1FP2的边沿上进行向上/向下计数。
- 011:编码器模式3 - 计数器根据另一输入的电平在TI1FP1和TI2FP2的边沿上进行向上/向下计数。
- 100:复位模式 - 选定的触发输入(TRGI)的上升沿重新初始化计数器并生成寄存器的更新。
- 101:门控模式 - 当触发输入(TRGI)为高(上升沿)时,计数器时钟被启用。一旦触发变为低(下降沿),计数器就会停止(但不会重置)。计数器的启动和停止都受控制。
- 110:触发模式 - 计数器在触发TRGI的上升沿开始(但不会重置)。只有计数器的启动受控制。
- 111:外部时钟模式1 - 选定的触发(TRGI)的上升沿时钟计数器。
4. 高级定时器
4.1 高级定时器介绍
高级控制定时器(TIM1和TIM8)由一个16位自动重载计数器组成,该计数器由可编程预分频器驱动。
它可以用于多种目的,包括测量输入信号的脉冲长度(输入捕获)或生成输出波形(输出比较、PWM、带死区插入的互补PWM)。
通过定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以从几微秒调节到几毫秒。
高级控制定时器(TIM1和TIM8)和通用定时器(TIMx)是完全独立的,不共享任何资源。
4.2 TIM1和TIM8的主要特性
TIM1和TIM8定时器特性包括:
- 16位向上、向下、自动重载计数器。
- 16位可编程预分频器,允许将计数器时钟频率除以1到65536之间的任意因子(也可以“实时”操作)。
- 最多4个独立通道,用于:
- 输入捕获
- 输出比较
- PWM生成(边沿和中心对齐模式)
- 单脉冲模式输出
- 具有可编程死区时间的互补输出
- 同步电路,用于用外部信号控制定时器,并将几个定时器连接在一起。
- 重复计数器,仅在计数器的给定周期数后更新定时器寄存器。
- 断开输入,将定时器的输出信号置于复位状态或已知状态。
- 在以下事件上生成中断/DMA:
- 更新:计数器溢出/下溢、计数器初始化(通过软件或内部/外部触发)
- 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)
- 输入捕获
- 输出比较
- 断开输入
- 支持增量(正交)编码器和霍尔传感器电路用于定位目的
- 外部时钟或逐周期电流管理的触发输入
4.3 重复计数器
包含两部分:
- 重复次数计数器
- REP寄存器(其实硬件叫RCR寄存器)
用处:
- 在基本定时器和通用定时器中,计数器(counter)每溢出1次,就产生1次更新事件
- 在高级定时器中,计数器(counter)每溢出1次,会产生一个信号,让重复计数器的值 - 1,当重复计数器的值减到0,如果计数器再溢出1次,则会产生更新事件。
- 重复计数器的初始化来源于RCR寄存器REP位。如果REP=2,则CNT计数器溢出3次产生一次更新事件。
- 可以用重复计数器生成有限个周期的PWM
4.4 互补输出
- 高级定时器的通道1/2/3可以分别输出2路互补信号
- CHx和CHxN(注意通道4没有)
- 互补信号:频率周期相等,相位相差180°。
互补输出一般用于驱动H桥电路,H桥通常用于驱动电流较大的负载,比如电机。
比如电机:
- CH1高电平, Q1和Q4导通,电机正转
- CH1N高电平,Q3和Q2导通,电机反转
4.5 死区时间
高级控制定时器(TIM1和TIM8)可以输出两个互补信号,并管理输出的关闭和开启时刻。
这段时间通常被称为死区时间,它必须根据连接到输出端的设备及其特性(例如电平转换器的固有延迟,功率开关的延迟等)进行调整。
用户可以独立地为每个输出选择输出的极性(主输出OCx或互补输出OCxN)。这是通过向TIMx_CCER寄存器中的CCxP和CCxNP位写入数据来完成的。
互补信号OCx和OCxN的激活是通过几个控制位的组合实现的:TIMx_CCER寄存器中的CCxE和CCxNE位,以及TIMx_BDTR和TIMx_CR2寄存器中的MOE、OISx、OISxN、OSSI和OSSR位。特别是,当切换到空闲状态(MOE下降到0)时,激活死区时间。
通过设置CCxE和CCxNE位以及如果存在断路电路,则设置MOE位来启用死区时间插入。TIMx_BDTR寄存器中的DTG[7:0]位用于控制所有通道的死区时间生成。从参考波形OCxREF生成2个输出OCx和OCxN。如果OCx和OCxN是高电平有效:
- OCx输出信号与参考信号相同,除了上升沿,该上升沿相对于参考上升沿是延迟的。
- OCxN输出信号与参考信号相反,除了上升沿,该上升沿相对于参考下降沿是延迟的。
如果延迟大于活动输出(OCx或OCxN)的宽度,则相应的脉冲不会生成。
以下图表显示了死区时间生成器的输出信号与参考信号OCxREF之间的关系。(在这些示例中,我们假设CCxP=0,CCxNP=0,MOE=1,CCxE=1和CCxNE=1)