从寄存器层面重学STM32(7)——定时器

一、前言

学习timer定时器,当时学的时候,我感觉是比较好理解的,只是输出比较、输入捕获那一块有点复杂,当时没理解。现在从数据手册开始学起,跟着铁头山羊过了一遍

定时器类型:

二、时基单元

定时器的核心,最基本的模块。

共有3种计数模式,向上计数,向下计数,中央对齐(计数周期*2)

时钟源:从APB2或者APB1来,看时钟是高级定时器还是通用定时器或者基本定时器。

预分频器、计数器、自动重装载值ARR,重复计数器RCR:自己配置寄存器来写

定时器周期配置公式:T=(时钟周期/(PSC+1))*(ARR+1)

得到周期T后,还得看重复计数寄存器有没有配置,看看是多少个周期产生一次事件/中断。

影子寄存器:用来临时存储你要修改的配置,,比如你配置ARR为9,然后CNT已经计数到7了,如果跟你再这个时候突然修改配置,把ARR修改到2,那么CNT就会因为一直达不到ARR一直加到65535,然后在轮回加到2,导致定时器跑飞,所以影子寄存器就是先存下你即将要修改的值,然后等到一个时钟周期修改之后在更新ARR,PSC与RCR也都有影子寄存器。

三、输出比较OC

其核心就是捕获/比较寄存器CRRx(在输出比较里叫做输出比较寄存器),通过CRRx与CNT的比较,来输出波形。每个通用定时器或者高级定时器有4路的输入捕获或输出比较。

PWM

在输出比较的模式下,CCRx的值设置会影响输出信号的高电平时间,所以在这里CCR也负责修改占空比,这也是PWM信号输出的原理

PWM的8种模式和各种波形输出类型

PWM有8种输出模式,我们主要用到的是PWM1和PWM2模式,其他模式了解一下就行。

PWM互补输出(只有高级定时器 TIM1/TIM8 才有)

OCxRef就是我们配置好时基单元和模式选择之后,产生的波形,但是不是最终的波形,最终的波形是在CHx和CHxN输出的,中间还需要进行处理。

处理其实很简单,就是选择正常输出模式或者选择互补输出模式,在这2个模式的电路里,还有一个2路选择器,用来选择是否取反,最后到达MOE使能位,我们使能某一个输出模式即可输出对应的波形到CHx或CHxN。

CNT vs CCRx → 生成OCxRef → 极性选择 → MOE使能 → CHx / CHxN引脚输出互补波形

四、输入捕获IC(Input capture)

输入捕获的原理

原理很简单,外部信号接到定时器通道引脚,硬件检测到我们设定的边沿(上升沿 / 下降沿),自动把当前 CNT 的计数值锁存进 CCRx,我们读出两次捕获的 CNT,相减,就能算出脉冲宽度或者周期。

输入捕获的内部结构

我们看上面那个图,可以看到通道1和通道2的输入捕获是交叉的,通道3和通道4也是,说明这是两两成一对来使用的。

放大输入捕获内部电路,如下:

输入滤波:其实就是一个滤波器,得到纯净的信号,不用管其原理。

边沿检测:就是选择上升沿脉冲还是选择下降沿脉冲

信号选择:比如一路信号从CH1进入,经过滤波器之后,选择上升/下降沿直接触发,则走的通道就是CH1本来的通道进入CCR1,如果选择的是上升/下降沿间接触发,则走的通道是CH2的通道进入CCR2

分频:如果是1分频,那么每次检测到想要检测的边沿都会触发一次CNT记录到CCRx的流程,如果是2分频,就检测到2次才会,以此类推

举例:

如果我们想测得一个PWM信号的脉冲宽度,就需要检测一个脉冲的上升沿及其下降沿,获得上升沿和下降沿的时间差,即可获得脉冲宽度。

所以我们可以让信号从CH1输入,然后上升沿的检测选择:CH1通道,上升沿脉冲,直接,分频系数1,下降沿的检测,我们选择:CH1通道,下降沿脉冲,间接,分频系数1

然后我们在CCR1和CCR2就能分别获得上升沿时的CNT值和下降沿时的CNT值,其差值就是脉冲宽度。

五、定时器相关寄存器

基本定时器(TIM6、TIM7)

基本定时器就是只有简单的时基单元,只支持向上计数,没有捕获比较通道、没有 OC 输出、没有输入捕获、没有从模式。能产生更新事件、更新中断、更新 DMA 请求、TRGO 同步脉冲,不能输出 PWM、不能做输入捕获。

TIM6和TIM7控制寄存器1(TIMx_CR1)

  • 位 0 CEN:计数器开关,1 开启计数,0 停止
  • 位 1 UDIS:更新事件禁止,1 屏蔽 UEV,不加载影子寄存器、不置 UIF
  • 位 2 URS:更新中断源筛选,1 仅计数器溢出才触发更新中断;0 所有来源都可以
  • 位 3 OPM:单脉冲模式,1 溢出后硬件自动停定时器;0 循环连续计数
  • 位 7 ARPE:ARR 预装载缓冲,1 写 ARR 要等 UEV 才生效;0 写入立即生效
  • 其余位:保留,写 0

CR1 用来控制定时器启停、是否循环、ARR 缓冲、更新事件的产生规则。

常用到以下几位:

  • CEN (bit0):启停定时器,必用
  • ARPE (bit7):ARR 影子寄存器,PWM 必用
  • OPM (bit3):单脉冲模式,需要单次波形才开
  • URS (bit2):屏蔽 UG 带来的更新中断,调试 / 同步场景用

TIM6和TIM7控制寄存器2(TIMx_CR2)

配置主模式,选择 TRGO(内部触发输出信号)是什么事件,用来同步别的定时器、触发 DAC

TIM6和TIM7 DMA/中断使能寄存器(TIMx_DIER)

TIM6、TIM7 是基本定时器,没有捕获比较通道 ,所以 DIER 里面只有两个有效位,其余全部保留,和通用定时器差别很大。

  • UIE=1:定时器产生更新事件 UEV,**通知 CPU 进中断,**送给 NVIC 的中断请求信号
  • UDE=1:定时器产生更新事件 UEV,**通知 DMA 搬运数据,**送给 DMA 控制器的 DMA 请求信号

TIM6和TIM7状态寄存器(TIMx_SR)

TIM6、TIM7 是基本定时器,只有 1 个有效标志位,其余全部保留,和通用定时器不一样。

UIF位用来检测是否产生更新中断,需要手动在中断中写0,防止多次进入中断。

TIM6和TIM7事件产生寄存器(TIMx_EGR)

能够触发更新事件 UEV 的情况有 2 种,

第一种就是 CNT 计数计到了 ARR 的值,下一个时钟触发 UEV,第二种是软件写 EGR.UG=1 手动产生 UEV;

CR1 寄存器中的 URS 这一位,决定的是产生更新事件之后,哪一类 UEV 可以置 UIF、进而产生 DMA 请求或者中断;UDIS 位管的是允不允许产生更新事件 UEV,相当于总开关;DIER 寄存器管的是更新中断、更新 DMA 的使能;SR 寄存器的 UIF 位负责记录符合 URS 规则的更新事件已经发生,进入中断后需要软件写 0 清除。

CNT、PSC、ARR寄存器

存储时基单元的值。

通用定时器

通用定时器 = 基本定时器的时基单元 + 从模式控制器 + 4 路独立捕获 / 比较通道(CH1~CH4)

与基本定时器比较

  1. 计数模式变多:向上计数、向下计数、中心对齐计数三种都支持
  2. 有从模式控制器(SMCR 寄存器):可以被外部信号触发、复位、门控、同步
  3. 4 路捕获比较通道 CH1~CH4 ,每一路都可以二选一配置:
    • 输出比较模式:输出 PWM、OC 翻转、单脉冲
    • 输入捕获模式:测量脉冲宽度、信号周期
  4. 标志、中断、DMA 请求种类变多 除了原来的更新 UIF,还有:CC1IF/CC2IF/CC3IF/CC4IF(比较捕获标志)、TIF 触发标志等;DIER 里多了 CCxIE、TIE 等中断使能位。
  5. **MMS 主模式选择全部 8 个模式都能用:**在CR2的MMS位配置
  6. 可以单独配置每一路通道的预装载(CCMR 寄存器),PWM 模式里非常常用。
  7. 有 OC 输出引脚,可以输出 PWM 波形到 IO 口

从模式

SMCR 寄存器控制,大概可以理解成初始化定时器之后,它不会自己先跑起来,而是等一个TRGO触发信号来触发这个定时器。

信号源有:另外一个定时器的(也可以叫做主模式的定时器)TRGO触发源(也就是内部 ITR 信号)、外部 IO 引脚 TI1/TI2。

TI1/TI2就是CH1/CH2输入信号作为触发源,是外部硬件信号触发定时器。

TRGO触发源,内部ITR:每个定时器有 4 个 ITR 通道 (ITR0~ITR3),每个通道在芯片设计时固定连到某个特定定时器的 TRGO 。用的时候通过 TS 从这 4 个里选一个。

从定时器 ITR0 ITR1 ITR2 ITR3
TIM1 TIM5 TIM2 TIM3 TIM4
TIM2 TIM1 TIM8 TIM3 TIM4
TIM3 TIM1 TIM2 TIM5 TIM4
TIM4 TIM1 TIM2 TIM3 TIM8

从模式有以下几种模式:

  • 复位:信号来了 → CNT 清零,外部信号一到,计数从头开始,用来同步测量信号的相位。
  • 门控:信号高 → 计数;信号低 → 停,测量高电平持续时间。
  • 触发:信号来了 → 启动,之后自己随便跑,触发信号只负责 "点火启动一次"
  • 单脉冲:信号来了 → 跑一轮,跑完自动停,,输出一段固定宽度脉冲,输出一次就停。

TIMx_CR1 通用定时器控制寄存器 1

与基本定时器相比,通用定时器多了 DIR、CMS 这两个,

DIR:设置计数方向,向上或者向下计数,当计数器配置为中央对齐模式或编码器模式时,该位为只读。

CMS1:0:选择中央对齐模式,默认是00,即不使用中央对齐模式。

中央对齐模式有3种。

配置成01:意思是输出比较时,只有在向下计数时,当CCR=CNT时,会触发OCxREF翻转

配置成10:意思是输出比较时,只有在向上计数时,当CCR=CNT时,会触发OCxREF翻转

配置成01:意思是输出比较时,向下计数或向上计数时,CCR=CNT时,就会触发OCxREF翻转

控制寄存器****2(TIMx_CR2)

和基本定时器对比,最大区别:基本定时器的 MMS只有 3 个模式,通用定时器 MMS 全部 8 种模式都开放可用;其余新增位是 CCDS、TI1S、OISx

MMS:MMS的功能就是,,主定时器什么时候作为触发输出(TRGO),基本定时器只有三种,通用定时器有8种。

MMS2:0 名称 主定时器什么时候输出 TRGO
000 复位 复位事件发生时输出 TRGO
001 使能 CEN 写 1、定时器开始计数的瞬间输出 TRGO
010 更新事件 (UEV) 更新事件发生时输出 TRGO(TIM6 也支持,最常用)
011 CC1 比较匹配 CNT == CCR1 的那一刻输出 TRGO
100 CC1OC 信号 OC1REF 边沿变化时刻输出 TRGO
101 CC2OC 信号 OC2REF 边沿变化时刻输出 TRGO
110 CC3OC 信号 OC3REF 边沿变化时刻输出 TRGO
111 CC4OC 信号 OC4REF 边沿变化时刻输出 TRGO

从模式控制寄存器**(TIMx_SMCR)**

SMCR 就是从模式的总配置寄存器,用来两件事:

①选触发源 TS(听哪里来的信号);

②选 SMS(收到信号之后做什么动作),另外还有一些辅助位。

关键认知:TS 决定"听谁",SMS 决定"听到后干什么",ECE/ETP/CPS/ETF 是 ETR 这条独立通路的前端处理。

TS:触发源选择,谁能触发从模式定时器。

TS 触发源 说明
000~011 ITR0~ITR3 来自其他定时器的 TRGO,查寄存器映射可知
100 TI1F_ED TI1 双边沿检测,上升沿和下降沿都产生脉冲
101 TI1FP1 TI1 经滤波、极性选择后的信号
110 TI2FP2 TI2 经滤波、极性选择后的信号
111 ETRF ETR 经 ETP/CPS/ETF 处理后的信号

SMS:触发之后做什么事情

SMS 模式 行为 典型场景
000 关闭 内部时钟正常计数 普通定时
001 编码器 1 TI2FP2 边沿计数,TI1FP1 电平定方向 正交编码器 ×2
010 编码器 2 TI1FP1 边沿计数,TI2FP2 电平定方向 正交编码器 ×2
011 编码器 3 两路边沿都计数 正交编码器 ×4
100 复位模式 TRGI 上升沿复位 CNT 并产生更新事件 主从同步、周期测量、超时复位
101 门控模式 TRGI 高电平期间计数,低电平停止但不复位 测脉宽、有效窗口内计数
110 触发模式 TRGI 上升沿启动计数,不复位 等事件到达再启动
111 外部时钟模式 1 TRGI 上升沿作为计数时钟 外部脉冲计数

TIM6、TIM7 基本定时器,只能做主定时器,可以输出 TRGO;没有 SMCR 从模式寄存器,不能做从定时器,无法接收 ITR、TI 这类外部触发信号来控制自己。

状态寄存器**(TIMx_SR)**

记录着定时器发生过什么,会记录在这里。

位 名称 含义
15~13 保留 ---
12 CC4OF 通道 4 重复捕获标志
11 CC3OF 通道 3 重复捕获
10 CC2OF 通道 2 重复捕获
9 CC1OF 通道 1 重复捕获
8 保留 TIM1/TIM8 为 B2IF(刹车 2)
7 保留 TIM1/TIM8 为 BIF(刹车)
6 TIF 触发事件标志
5 保留 TIM1/TIM8 为 COMIF(换相)
4 CC4IF 通道 4 捕获/比较
3 CC3IF 通道 3 捕获/比较
2 CC2IF 通道 2 捕获/比较
1 CC1IF 通道 1 捕获/比较
0 UIF 更新事件标志

比较重要的有UIF位,用来记录更新事件发生了,如果有更新事件发生,就在这里置1,需要软件置0。

CC1IF~CC4IF就是,在输入捕获模式下,捕捉到边沿了,CCR被写入了,就会置位吗,输出比较下,CNT=CCR了,就会置位。

CC1OF~CC4OF:输入捕获专用,当你输入捕获标志位(CCxIF)没有及时清零时,又来了一个捕获边沿,就会置1,表明你丢了一次捕获。

TIF 记录的是 TRGI 上出现了一个有效触发边沿,至于这个边沿造成什么后果,由 SMS 决定

DMA/中断使能寄存器(TIMx_DIER)

这个寄存器主要是存储中断/DMA请求使能的,需要注意,不要把UIE和UDE(更新中断/DMA请求使能)与TIE和TDE(触发中断/DMA请求使能)搞混。我们常用前者,TIE/TDE 是从模式的"补充",只在你想感知 TRGI 边沿本身时才开。

CCxIE就是比较/捕获中断使能位,CCxDE就是比较/捕获DMA请求使能位。

在输入捕获(CNT的值复制到CCR)或输出比较(CNT=CCR)时,如果使能对应的位,就会允许对应的中断/DMA请求通过。

事件产生寄存器**(TIMx_EGR)**

EGR寄存器可以理解成软件事件源,可以触发更新事件和触发事件,以及捕获/比较事件。

位 名称 产生什么事件 对应 SR 标志
15~8 保留 --- ---
7 BG 刹车事件(仅高级定时器) BIF
6 TG 触发事件 TIF
5 COMG 换相事件(仅高级定时器) COMIF
4 CC4G 通道 4 捕获/比较事件 CC4IF
3 CC3G 通道 3 捕获/比较事件 CC3IF
2 CC2G 通道 2 捕获/比较事件 CC2IF
1 CC1G 通道 1 CC1IF
0 UG 更新事件 UIF

捕获/比较模式寄存器 1(TIMx_CCMR1)与捕获/比较模式寄存器 2(TIMx_CCMR2)

用途 靠哪些位
定方向 CCxS:输入还是输出,输入时选信号从哪来
定输出行为 OCxM:PWM、翻转、强制电平、冻结;OCxPE:预装载;OCxFE/OCxCE:快速响应和单脉冲
定输入行为 ICxPSC:每几个边沿捕获一次;ICxF:滤掉毛刺
给其他模块供信号 CCxS=01 把引脚接到 TI1/TI2,供 SMCR 选作触发源或编码器输入

以捕获/比较模式寄存器 1(TIMx_CCMR1)为例,我们看寄存器,要先知道CCxS是什么意思。

CCxS 含义
00 输出模式(比较输出)
01 输入模式,ICx 映射到 TIx
10 输入模式,ICx 映射到另一路 TI(交叉)
11 输入模式,ICx 映射到 TRC(内部触发,少用)

先定 CCxS,再配其他位。 CCxS=00 时按输出模式解释,非 00 时按输入模式解释。改方向时最好整个字节重写,不要只改一位。

捕获**/比较使能寄存器(TIMx_CCER)**

这个寄存器,复制使能捕获/比较功能,以及控制输入捕获捕获的是上升沿,还是下降沿,输出比较是高电平有效,还是低电平有效。

ARR/CNT/PSC寄存器与CCRx寄存器

存储时基单元的值,以及CCR寄存器的值。

六、总的理解

我对应定时器总的理解就是,以时基单元为核心,以输入捕获/输出比较功能为辅,能够实现定时、或者自主设计触发某一事件的外设。

浅层理解

最简单的就是,我初始化一个定时器,到时间了我就触发中断或者DMA请求,就已经可以做很多事情了。

再深入一点,我们可以通过输出比较输出PWM波形,通过输入捕获监视并获得输入波形的参数。甚至也可以在输出比较模式下,CNT=CCR时更新中断或DMA请求,以及输入捕获模式下,捕获到边沿后,更新中断和DMA请求。

深入了解主模式和从模式的关系和原理

如果在深入一些,就到我最近才了解的了,定时器的主模式和从模式。

主模式的话:

主模式的定时器,通过TRGO信号,触发从模式的定时器、其他外设,基本定时器也能做主定时器,有3种配置方式发送TRGO信号:定时器复位,定时器使能,有更新事件发生。看CR2寄存器里的MMS位配置成什么模式决定什么时候发出TRGO信号。

然后如果是通用定时器,CR2寄存器的MMS位,就会多5种发出TRGO信号的时机,与输出比较(CNT=CCR)和输入捕获(捕获到边沿信号)有关。

从模式的话:

只有通用/高级定时器才能作为从模式的定时器。主模式谁都可以。但是基本定时器能产生 TRGO 但只给 DAC 等外设。

顾名思义,从模式的定时器不直接启动,而是作为一个从机,等待主机发送TRGO信号之后才启动。与SMCR寄存器相关,这个寄存器配置的是主/从模式的各种参数。

从模式也不是只有某个定时器的TRGO信号才能启动它,从模式的定时器也有很多的信号来源。

一共有3种,一种是主定时器的TRGO,接到从定时器的ITR通道触发从定时器;一种是来自外部信号TIx,经过滤波/极性选择之后,输入到从定时器;还有一种是外部触发引脚 ETR,ETR 和 TI1/TI2 是不同的引脚、不同的路径:ETR 有自己独立的极性(ETP)、预分频(CPS)、滤波器(ETF),是一条专门的触发输入通路;TI1/TI2 是通道引脚,走捕获输入级。

更新事件UEV与触发事件(Trigger Event)

更新事件我理解的是能产生定时中断和DMA请求,触发事件我理解的是,指的是主模式/从模式之间的TRGO信号。

更新事件能产生更新中断/DMA 请求;也能通过 MMS=010 让主定时器发送 TRGO。TRGO 传到从定时器后,从定时器的 TRGI 上才产生触发事件。

相关推荐
碧海银沙音频科技研究院30 分钟前
粉色笔记本电脑每次要等把电池电耗尽才能开机问题解决方法
嵌入式硬件
wuyk55515 小时前
Keil工具链-第05讲-启动文件与__main到底做了什么
c语言·stm32·单片机·嵌入式硬件·物联网
shijuejianceliu21 小时前
传统规则视觉与嵌入式AI智能相机的技术差异
人工智能·嵌入式硬件·视觉检测·相机
Zw-awa1 天前
OLED为什么能显示字:软件I2C换成硬件I2C
stm32
不脱发的程序猿1 天前
GD32串口数据收进内存之后DMA如何处理?
单片机·嵌入式硬件·dma·嵌入式·串口通信·gd32
FPGA小迷弟1 天前
FPGA 与千兆以太网校验和:从原理到 Verilog 实现
嵌入式硬件·fpga开发·无人机·ai编程·fpga
Zw-awa2 天前
协议是人为约定:同一个字节能有三种意思
stm32
国科安芯2 天前
83 倍:ASC0108S 在推挽和开漏之间,差的不是速度,是回程
单片机·嵌入式硬件·架构·电平转换·抗辐射
国科安芯2 天前
从遥控到自治:ASP4644S2B支撑星载电源健康管理与容错配电
网络·单片机·嵌入式硬件·安全·dcdc·低轨卫星·商业航天