STM32之TIMER功能,定时器功能

公众号:嵌入式不难

本文仅供参考学习,如有错误之处,欢迎留言指正。

一、定时器分类

  • 首先学习一下分类也可以大致了解一下各个定时器的特点,此处按功能分类,可分为如下三类
    • 1.基本定时器:几乎没有任何对外输入/输出,常用作时基,实现基本的计数、定时功能。例如Systick,TIM6,TIM7(其中Systick又为核内定时器,TIM6,TIM7为外设定时器),框图如下
      在这里插入图片描述
    • 2.通用定时器:除了基本定时器的时基功能外,还可对外做输入捕捉、输出比较以及连接其它传感器接口【编码器和霍尔传感器】 。(例如TIM2-TIM5)框图如下
      在这里插入图片描述
    • 3.高级定时器: 此类定时器的功能最为强大,除了具备通用定时器的功能外,还包含一些与电机控制和数字电源应用相关的功能,比方带死区控制的互补信号输出、紧急刹车关断输入控制。(例如TIM1,TIM8)框图如下
      在这里插入图片描述

二、定时器功能单元

可把定时器大致分为六个功能单元

  • 从模式控制单元:负责时钟源、触发信号源的选择;控制计数器的启停、复位、门控等;
  • 时基单元:定时器核心单元。负责时钟源的分频、计数、溢出重装等。
  • 输入单元:为部分的时钟信号、 捕捉信号、 触发信号提供信号源。
  • 比较输出单元:通过对比较寄存器与计数器的数值匹配比较,实现不同输出波形。
  • 触发输出单元:输出触发信号给到其它定时器或外设。
  • 捕捉比较单元: 是输入捕捉或比较输出的公共执行单元。

三、定时器特色

  • 定时器中的PSC/ARR/RCR/CCRx寄存器具有预装载功能,即每类寄存器具有双寄存器机制,分别由各自的影子寄存器和预装载寄存器组成。
    • TIMx_PSC 分频寄存器,设置分频器对时钟源的分频比或分频系数
    • TIMx_CNT 核心计数器,对从分频器过来的时钟进行计数
    • TIMx_ARR 自动重装寄存器,为计数器设置计数边界或初始值,决定计数脉冲的多少或计时周期长短。比如计数器向上计数时,记到多少发生溢出;向下计数时从多少开始往下计数。带预装载使能控制位ARPE@TIMx_CR1
    • TIMx_RCR 重复计数器,重复计数器是个向下计数器,当计数器发生 TIMx_RCR+1次溢出动作后会触发更新操作。
    • TIMx_CCR 捕捉/比较寄存器,带预装载使能控制位OCxPE@TIMx_CCMR
    • 当关闭预装载使能位时,用户修改预装寄存器的数据后会立即被拷贝进影子寄存器【实际寄存器】 ,否则,修改过的预装寄存器的数据只能等到下次更新事件来完成从预装寄存器数据到影子寄存器的拷贝更新。
  • 影子寄存器是真正起作用的寄存器,预装载寄存器为影子寄存器提供缓冲,提前做数据或指令准备; 因为定时器工作往往具有一定周期性,如果每次我们的参数修改都直接作用于实际寄存器,往往不可避免会影响到当前周期的正常计数以及相关的输出动作。
  • 用户操作的永远只是预装载寄存器!包括DMA的访问。
  • ARR/CCR影子寄存器的预装功能可软件开启或关闭。PSC/RCR影子寄存器的预装功能不可通过软件关闭,始终开启。在开启预装载功能时,影子寄存器的内容必须借助更新事件完成更新!

四、定时器事件

以下几类事件都可触发中断或DMA请求;

  • 更新事件: 比如影子寄存器更新往往需借助该事件;
  • 触发事件:定时器收到各类触发输入信号时往往激发该事件;
  • 捕获、比较事件: 发生输入捕捉或比较输出时会产生该事件;

由第三章的定时器特色学习我们知道影子寄存器的更新依赖于更新事件,我们这变介绍一下更新事件。首先我们必须学习一下更新操作。
注意:更新操作与更新操作之间的牵连
更新操作【事件源】可分为以下三类:

  • 1.核心计数器的溢出【上溢或下溢】
  • 2.软件复位操作【对TIMX_EGR@UG】 (软件产生更新操作,软件置1,硬件自动清零)
  • 3.工作在复位模式下的定时器收到触发信号【即复位触发信号】
    以上三类更新操作要想产生更新事件,那么就必须经过一个人的同意,那么就是TIMx_CR1中的UDIS位。这一位说是黑老大也不为过了,先看一下技术手册。
    在这里插入图片描述
    • 当UDIS为0的时候,允许更新操作升级为更新事件,那三个更新操作的努力没有白费。黑老大允许这三个更新操作产生后光明正大的将预装载寄存器的内容更新至影子寄存器。具体步骤如下
      • 首先完成影子寄存器【ARR/CCR/PSC/RCR】 的更新,即把预装寄存器的数据拷贝到影子寄存器。
      • 实现计数器【预分频计数器、核心计数器、重复计数器】 的重装或重新初始化
      • 置位状态寄存器的UIF@TIMx_SR,并可以触发更新中断或触发DMA请求
    • 当UDIS为1的时候,禁止产生更新事件,影子寄存器(ARR、 PSC、 CCRx,RCR)保持它们的值。你就会产生疑问,保持他们的值是什么意思呢,是不能更改吗还是怎么样?那定时器又该怎么运转呢?会不会定时器又只能用一次呢?要解答这些疑问,则必须要清楚定时器运行的原理才能知道了。首先,我们知道定时器的时间设定是根据时钟和计数来的。那么时钟呢又是根据总线时钟,然后再次分频得到定时器的计数时钟,再根据定时器计数时钟增加计数值,达到设定计数值时告知我们时间到了。当然时钟分频不可能平白无故就自己分频了,肯定还是得对总线的时钟进行计数才能分频,这个东西就叫做分频计数器,这个时候PSC的作用来了,这个值告诉分频计数器对总线时钟进行计数到多少个脉冲的时候才产生一个定时器使用的时钟脉冲。但是呢,由于UDIS老大为1,禁止更新操作产生更新事件,所以啊,这个PSC分频值并不能通过更新事件来将预装载的值加载到影子寄存器,所以呢此时的预装载寄存器就是个摆设,用户操作PSC会直接操作到PSC的影子寄存器,如果用户没有操作PSC的话,PSC还是会保持原值得,但是也不是通过预装寄存器的值来的。每产生一个定时器时钟脉冲,核心计数器的值便更改一,当核心计数器(TIMx_CNT)与ARR或0匹配时(区别于向上还是向下计数),定时器就告诉我们定时时间到了,还是由于UDIS老大为1,禁止产生更新事件,此时ARR的操作如同上诉PSC的操作一样,用户随时写ARR,都会直接操作ARR的影子寄存器,如果没有操作ARR,等到更新时间来的时候,ARR保持原值。所以没有更新事件来管控这些关键寄存器,一些操作还是很危险的。但是这种更新操作没有产生更新事件的情况下,定时器内部会产生哪些变化呢?具体步骤如下
      • 分频计数器归0,然后重新计数
      • 重复计数器重装为RCR寄存器里的值; 然后重新递减计数
      • 核心计数器与计数模式有关,如果是向上计数或中心对齐计数模式,CNT归0; 如果是向下计数模式,CNT重装为ARR, 然后重新计数
      • 无更新标志的置位,不触发中断或DMA请求

五、定时器时钟源

四个来源;内部时钟源、 ETR脚、触发信号,编码器模式

  • 1、内部时钟源, 来自芯片时钟系统给到定时器的时钟
  • 2、来自于芯片ETR脚的外来时钟
  • 3、来自于各类触发输入信号作为时钟
  • 4、编码器模式
    框图如下
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    我们首先按顺序分析各个模式

1、内部时钟源

内部时钟源模式,顾名思义,定时器的时钟采用内部总线时钟,即CK_INT,此时与从控制器无关

2、来自于芯片ETR脚的外来时钟

• 此时定时器时钟工作在外部模式2下
• 时钟信号源自外部ETR脚,经过极性选择、分频、滤波后的信号给到计数器作为其时钟源。 【分频和滤波根据实际情况来设置】
• 此时, ETRF信号直接馈送给时钟控制单元。
框图如下
在这里插入图片描述
• ETP决定ETR输入的时钟是否翻转电平
• ETPS决定是否对翻转后的ETR时钟进行分频
• ETF决定了对分频后的信号ETRP进行滤波,ETF定义见技术手册如下
在这里插入图片描述

  • fCK_INT和fDTS定义见如下
    在这里插入图片描述
    综上所述,滤波的作用效果如下图,下图虽然滤波引脚不是ETR,但是道理是一样的,可以一并按此理解
    在这里插入图片描述
    对应于STM32CubeMX的配置如下图所示
    在这里插入图片描述

3、来自于各类触发输入信号作为时钟

此模式下,触发源五花八门,也是STM32定时器强大的一个原因之一。此时可将触发源分为如下几类

  • 1、由内部触发输入ITRx作为时钟源,此情况下将主定时器产生的触发输出连接到从定时器内部的触发输入并作为时钟源
  • 2、捕获通道的信号作为时钟源,捕获通道的信号源又分为三类,捕获1通道的上升沿和下降沿信号,捕获1通道的直接输入信号的滤波后的上升沿信号,捕获2通道的直接输入信号的滤波后的上升沿信号
  • 3、经过滤波后的ETRF信号

接下来我们分别对这三种信号进行一种分析

1).内部触发输入ITRx作为触发输入信号

这种模式下,需要有一个主定时器产生触发输出事件,然后通过ITRx选择将主定时器产生的触发输出连接到从定时器内部的触发输入,框图如下
在这里插入图片描述
STM32CubeMX配置如下
从定时器如下
在这里插入图片描述
主定时器如下
在这里插入图片描述

2).捕获通道的信号作为时钟源

a 捕获1通道的上升沿和下降沿信号

STM32CubeMX配置如下
在这里插入图片描述
我们可以注意到这个触发源也可以进行滤波,那么又是通过什么样的方式来滤波的呢。滤波参数雷同ETR滤波器的设计,但是没有共用ETR的滤波器,只是设计思路是一样的,对应于滤波寄存器为IC1F,IC2F,IC3F,IC4F,其中一个寄存器的定义如下图所示
在这里插入图片描述
综上所述,滤波的作用效果如下图
在这里插入图片描述
在这里插入图片描述

b 捕获1通道的直接输入信号的滤波后的上升沿信号

STM32CubeMX配置如下图所示

在这里插入图片描述
滤波作用参考上一节滤波解析

c 捕获2通道的直接输入信号的滤波后的上升沿信号

STM32CubeMX配置如下图所示
在这里插入图片描述
滤波作用参考上一节滤波解析

3).经过滤波后的ETRF信号

由第五章,第二节我们知道,ETR可以通过外部模式2的情况下直接跳过从模式控制器接入定时器时钟源,那么为什么外部模式1也要引入ETRF信号呢?两者的区别在什么地方呢?至少现在我还没有发现有什么区别,等到我真正理解的时候再补上吧。
STM32CubeMX配置如下图所示
在这里插入图片描述

六、定时器捕获和比较单元

输入捕获【Input Capture】 功能:捕捉外部触发信号、事件;可以触发中断或DMA请求,配合计数器对外来信号测量周期或频率,甚至可以用来做通信解码。
比较输出【Compare Output】 功能:定时器通过对预定的比较值与计数器的值做匹配比较,实现各类输出。如PWM输出、电平翻转、单脉冲输出、强制输出等。一般来讲, STM32的通用定期和高级定时器都具有比较捕获功能,不同的定时器可能通道数有差异。
捕获/比较单元主要寄存器: 捕捉比较寄存器CCR ,它由其影子寄存器/预装载寄存器组成。用户访问时访问预装寄存器。预装载功能可开启或关闭。由OCxPE@TIMx_CCER控制。
• 输入捕获模式下: 当捕获单元捕捉到外来有效信号边沿事件时,将此刻的计数器的值锁存到CCR影子寄存器并自动将CCR影子寄存器的值拷贝进CCR预装载寄存器,以供用户读取。强调:此时CCR对用户是只读的,不可对其进行修改、赋值。
• 比较输出模式下: 当捕获比较单元监测到计数器的值与CCR寄存器的数字匹配时,将根据相应的比较输出模式实现相应输出。

1、输入捕获

外部输入信号一般经过滤波、边沿检测、极性选择、捕捉信号选择、捕捉信号分频后进入捕捉单元,其框图如下
在这里插入图片描述
输入捕获产生的相关事件如下:
• 1、捕获时刻的计数器值的锁存到对应捕获通道的CCRx寄存器;
• 2、对应通道的捕获事件/中断标志会被置位; 【CCxIF@TIMx_SR】
• 3、如果允许了 捕捉中断或DMA请求,可以触发中断或DMA请求。其它取决于CCxIE/CCxDE @TIMx_DIER的配置。
• 4、如果发生连续的捕获事件,前次CCxIF没有清零的话会置位CCxOF@TIMx_SR.
• 5、对于CCxIF标志可以软件清零或读取CCR来清零
• 6、可以通过置位CCxG@TIMx_EGR来软件触发输入捕获事件

2、比较输出

基本原理:根据计数器与CCRx的比较结果,结合不同的输出控制模式
框图如下在这里插入图片描述

• OCxREF源于输出模式控制器,并规定高电平为有效信号。它经过极性选择后,再经过输出控制电路输出。 当CCxP=0时,高电平作为Ocx的有效输出信号, 当CCxP=1时,低电平作为Ocx的有效输出。
• 输出端的active state【有效状态】 /inactive state【无效状态】 ,取决于极性选择CCxP/CCxNP
• 对于非互补输出时 Ocx =OCxREF + 极性
• 对于互补输出时 Ocx =OCxREF + 极性 + 死区
在这里插入图片描述
相关事件产生如下:
• 当核心计数器的值与比较寄存器的数值匹配时发生比较输出事件
• CCxIF@TIMx_SR被置位
• 触发比较中断 (如果CCxIE@TIMx_DIER被置位使能)
• 触发DMA请求 (CCxDE@TIMx_DIER CCDS@TIMx_CR2 使能允许)
• CCRx 影子寄存器的预装载功能可以软件开启或关闭(OCxPE@TIMx_CCMR)
但脉冲模式是PWM输出模式的一种特例。
• 原理: 计数器启动后,在下一个更新事件来临之前的时间段内实现固定个数的脉冲输出。 当下一个更新事件来临时计数器停止计数。脉冲个数可以一个或几个。如果是通用计数器就是1个,如果是高级定时器,脉冲个数与RCR数值及计数模式有关。
• 寄存器位OPM@TIMx_CR1置1
• 实现方式: 使用OC比较输出或PWM输出模式。
• 计数器的启动可以通过自身软件使能启动也
• 可以将定时器配置在触发从模式经触发启动

七、定时器输出事件

主定时器通过如下方式产生TRGO信号给到其它从定时器或其它外设:
• 1、定时器复位:置位UG@TIMx_EGR
• 2、使能计数器。 置位CEN@TIMx_CR1
• 3、定时器更新事件
• 4、定时器捕获、比较事件
• 5、各输出通道中间参考信号 OCxREF
• 这些TRGO将通过内部线路连接到其它定时器作为从定时器的触发输入信号TRGI,或者作为其它外设控制触发信号,如触发ADC/DAC等。

八、定时器从模式

1、从模式之复位模式

  • 工作原理:在发生一个触发输入事件时,计数器和它的预分频器能够重新被初始化;同时,如果TIMx_CR1寄存器的URS位为低,还产生一个更新事件UEV;然后所有的预装载寄存器(TIMx_ARR,TIMx_CCRx等)都被更新了。
    上例为:TI1上升沿复位计数器
    • 1.检测TI1上升沿
    • 2.使定时器工作在复位模式,配置TRGI触发源
    • 3.使能计数器(CEN=1)
    控制框图如下
    在这里插入图片描述
  • 上图解析:计数器开始依据内部时钟计数,然后正常运转直到TI1出现一个上升沿;此时,计数器被清零然后从0重新开始计数。同时,触发标志(TIMx_SR寄存器中的TIF位)被设置,根据TIMx_DIER寄存器中TIE(中断使能)位和TDE(DMA使能)位的设置,产生一个中断请求或一个DMA请求。上图显示当自动重装载寄存器TIMx_ARR=0x36时的动作。在TI1上升沿和计数器的实际复位之间的延时取决于TI1输入端的重同步电路。

STM32CubeMX配置如下
在这里插入图片描述

2、从模式之门控模式

  • 工作原理:根据TRGI有效电平启动或停止计数器
    • 1.检测TI1上升沿
    • 2.使定时器工作在门控模式,配置TRGI触发源
    • 3.使能计数器(CEN=1,若没有使能CEN,则无论TRGI电平如何,计数器均不工作)

控制框图如下
在这里插入图片描述

  • 上图解析:只要TI1为低,计数器开始依据内部时钟计数,一旦TI1变高则停止计数。当计数器开始或停止时都设置TIMx_SR中的TIF标置。TI1上升沿和计数器实际停止之间的延时取决于TI1输入端的重同步电路。
    STM32CubeMX配置如下
    在这里插入图片描述

3、从模式之触发模式

  • 工作原理:根据TRGI信号有效沿启动计数器
    • 1.检测TI2上升沿
    • 2.使定时器工作在门控模式,配置TRGI触发源
    • 3.使能计数器(CEN=1)

控制框图如下
在这里插入图片描述
上图解析:当TI2出现一个上升沿时,计数器开始在内部时钟驱动下计数,同时设置TIF标志。TI2上升沿和计数器启动计数之间的延时,取决于TI2输入端的重同步电路。
STM32CubeMX配置如下
在这里插入图片描述


版权声明:本文为qq_39257301原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。