STM32 —— 定时器

STM32 —— 定时器

定时器最基本的功能就是定时处理事情。比如定时发送 USART 数据、定时采集 AD 数据、定时检测 IO 口电位、还可以通过 IO 口输出波形等。可以实现非常丰富的功能

定时器分类

STM32F1 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器。基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部 IO。高级定时器 TIM1/8 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有 8 个外部 IO。

image

我们使用的 STM32F103C8T6 属于中等容量的 STM32F103xx 增强型系列产品,包含 1 个高级控制定时器、 3 个普通定时器,以及 2 个看门狗定时器和 1 个系统嘀嗒定时器

下面将依次介绍不同的计时器

通用计数器 TIMx

简介

通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM),使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整

STM32F103xx 增强型产品中,内置了多达 3 个可同步运行的标准定时器( TIM2、 TIM3 和 TIM4 )。每个定时器都有一个 16 位的自动加载递加/递减计数器、一个 16 位的预分频器和 4 个独立的通道,每个通道都可用于输入捕获、输出比较、 PWM 和单脉冲模式输出,在最大的封装配置中可提供最多 12 个输入捕获、输出比较或 PWM 通道

它们还能通过定时器链接功能与高级控制定时器共同工作,提供同步或事件链接功能。在调试模式下,计数器可以被冻结。任一标准定时器都能用于产生 PWM 输出。每个定时器都有独立的 DMA 请求机制

这些定时器还能够处理增量编码器的信号,也能处理 1 至 3 个霍尔传感器的数字输出。

每个定时器都是完全独立的,没有互相共享任何资源。它们既可以独立使用,也可以一起同步操作

主要功能

基本定时器只具备基本的定时功能,也就是在时钟源的驱动下,从 0 开始累加脉冲计数,直到超过预定值,然后触发中断或者触发 DMA 请求。基本定时器和通用定时器的时钟源都是 TIMxCLK,TIMxCLK 时钟树中的位置如下:

功能框图如下:

通用 TIMx (TIM2、 TIM3、 TIM4和TIM5)定时器功能包括:

  1. 16 位向上、向下、向上/向下自动装载计数器

  2. 16 位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为 1~65536 之间的任意数值

  3. 4个独立通道:

    · 输入捕获

    · 输出比较

    · PWM生成(边缘或中间对齐模式)

    · 单脉冲模式输出

  4. 使用外部信号控制定时器和定时器互连的同步电路

  5. 如下事件发生时产生中断 / DMA:

    · 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)

    · 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)

    · 输入捕获

    · 输出比较

  6. 支持针对定位的增量(正交)编码器和霍尔传感器电路

  7. 触发输入作为外部时钟或者按周期的电流管理

不同定时器功能比较:

基本定时器 TIM6 和 TIM7

简介

基本定时器 TIM6 和 TIM7 各包含一个 16 位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地可以为数模转换器( DAC )提供时钟。实际上,它们在芯片内部直接连接到 DAC 并通过触发输出直接驱动 DAC 。这 2 个定时器是互相独立的,不共享任何资源

主要功能

功能框图:

  1. 时钟源

定时器时钟 TIMxCLK,即内部时钟 CK_INT,经 APB1 预分频器后分频提供,如果 APB1 预分频系数等于 1,则频率不变,否则频率乘以 2,库函数中 APB1 预分频的系数是 2,即 PCLK1=36M,所以定时器时钟 TIMxCLK=36*2=72M

  1. 计数器时钟

定时器时钟经过 PSC 预分频器之后,即 CK_CNT,用来驱动计数器计数。 PSC 是一个 16 位的预分频器,可以对定时器时钟 TIMxCLK 进行 1~65536 之间的任何一个数进行分频。具体计算方式为: CK_CNT=TIMxCLK/(PSC+1)

  1. 计数器

计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数

  1. 自动重装载寄存器

自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。

  1. 定时时间的计算

定时器的定时时间等于计数器的中断周期乘以中断的次数。计数器在 CK_CNT 的驱动下,计一个数的时间则是 CK_CLK 的倒数,等于: 1/(TIMxCLK/(PSC+1)),产生一次中断的时间则等于: 1/(CK_CLK * ARR)。如果在中断服务程序里面设置一个变量 time,用来 记 录 中断 的 次 数,那 么 就 可以 计 算 出我们 需 要 的定 时 时 间等于 : 1/CK_CLK * (ARR+1)*time

TIM6和TIM7定时器的主要功能包括:

  1. 16 位自动重装载累加计数器

  2. 16 位可编程(可实时修改)预分频器,用于对输入的时钟按系数为 1~65536 之间的任意数值分频

  3. 触发 DAC 的同步电路

  4. 在更新事件(计数器溢出)时产生中断 / DMA 请求

高级控制定时器 TIM1

简介

高级控制定时器(TIM1 和 TIM8)和通用定时器在基本定时器的基础上引入了外部引脚,可以实现输入捕获和输出比较功能。高级控制定时器比通用定时器增加了可编程死区互补输出、重复计数器、带刹车(断路)功能,这些功能都是针对工业电机控制方面。下面主要介绍常用的输入捕获和输出比较功能

高级控制定时器时基单元包含一个 16 位自动重装载寄存器 ARR,一个 16 位的计数器 CNT,可向上/下计数,一个 16位可编程预分频器 PSC,预分频器时钟源有多种可选,有内部的时钟、外部时钟。还有一个 8 位的重复计数器 RCR,这样最高可实现 40 位的可编程定时

配套开发板因为 IO 资源紧缺,定时器的 IO 很多已经复用它途,故下表中的 IO 只有部分可用于定时器的实验

高级控制和通用定时器通道引脚分布:

image

主要功能

高级控制定时器功能框图包含了高级控制定时器最核心内容,掌握了功能框图,对高级控制定时器就有一个整体的把握,在编程时思路就非常清晰,图中有些寄存器是带影子的,表示其有影子寄存器

功能框图:

image

高级控制定时器(TIM1)可以被看成是分配到6个通道的三相 PWM 发生器,它具有带死区插入的互补 PWM 输出,还可以被当成完整的通用定时器。四个独立的通道可以用于:

  1. 输入捕获

  2. 输出比较

  3. 产生PWM(边缘或中心对齐模式)

  4. 单脉冲输出

配置为16位标准定时器时,它与 TIMx 定时器具有相同的功能。配置为 16 位 PWM 发生器时,它具有全调制能力(0~100%)

在调试模式下,计数器可以被冻结,同时 PWM 输出被禁止,从而切断由这些输出所控制的开关

很多功能都与标准的 TIM 定时器相同,内部结构也相同,因此高级控制定时器可以通过定时器链接功能与 TIM 定时器协同操作,提供同步或事件链接功能

时钟源

高级控制定时器有四个时钟源可选:

· 内部时钟源 CK_INT

· 外部时钟模式 1:外部输入引脚 TIx(x=1,2,3,4)

· 外部时钟模式 2:外部触发输入 ETR

· 内部触发输入(ITRx)

内部时钟源(CK_INT)

内部时钟 CK_INT 即来自于芯片内部,等于 72M,一般情况下,我们都是使用内部时钟。当从模式控制寄存器 TIMx_SMCR 的 SMS 位等于 000 时,则使用内部时钟:

外部时钟模式1

image

外部时钟模式2

image

内部触发输入

内部触发输入是使用一个定时器作为另一个定时器的预分频器。硬件上高级控制定时器和通用定时器在内部连接在一起,可以实现定时器同步或级联。主模式的定时器可以对从模式定时器执行复位、启动、停止或提供时钟

控制器

高级控制定时器控制器部分包括触发控制器、从模式控制器以及编码器接口。触发控制器用来针对片内外设输出触发信号,比如为其它定时器提供时钟和触发 DAC/ADC 转换。编码器接口专门针对编码器计数而设计。从模式控制器可以控制计数器复位、启动、递增/递减、计数。有关控制器部分只需熟练阅读寄存器描述即可

时基单元

高级控制定时器时基单元功能包括四个寄存器,分别是计数器寄存器(CNT)、预分频器寄存器(PSC)、自动重载寄存器(ARR)和重复计数器寄存器(RCR)。其中重复计数器 RCR 是高级定时器独有,通用和基本定时器没有。前面三个寄存器都是 16 位有效, TIMx_RC 寄存器是 8 位有效

其中时基单元可以分为四部分,预分频器 PSC 、计数器 CNT 、自动重载寄存器 ARR 、重复计数器 RCR

预分频器 PSC

预分频器 PSC ,有一个输入时钟 CK_PSC 和一个输出时钟 CK_CNT 。输入时钟 CK_PSC 就是上面时钟源的输出,输出 CK_CNT 则用来驱动计数器 CNT 计数。通过设置预分频器 PSC的值可以得到不同的 CK_CNT ,实际计算为: fCK_CNT 等于 fCK_PSC/(PSC[15:0]+1),可以实现 1 至 65536 分频

计数器 CNT

高级控制定时器的计数器有三种计数模式,分别为递增计数模式、递减计数模式和递增/递减(中心对齐)计数模式

自动重载寄存器 ARR

自动重载寄存器 ARR 用来存放与计数器 CNT 比较的值,如果两个值相等就递减重复计数器。可以通过 TIMx_CR1 寄存器的 ARPE 位控制自动重载影子寄存器功能,如果 ARPE 位置 1,自动重载影子寄存器有效,只有在事件更新时才把 TIMx_ARR 值赋给影子寄存器。如果 ARPE 位为 0,则修改 TIMx_ARR 值马上有效

重复计数器 RCR

在基本/通用定时器发生上/下溢事件时直接就生成更新事件,但对于高级控制定时器却不是这样,高级控制定时器在硬件结构上多出了重复计数器,在定时器发生上溢或下溢事件是递减重复计数器的值,只有当重复计数器为 0 时才会生成更新事件。在发生 N+1 个上溢或下溢事件(N 为 RCR 的值)时产生更新事件

输入捕获

功能框图:

输入捕获可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,常用的有测量输入信号的脉宽和测量 PWM 输入信号的频率和占空比这两种

输入捕获的大概的原理就是,当捕获到信号的跳变沿的时候,把计数器 CNT 的值锁存到捕获寄存器 CCR 中,把前后两次捕获到的 CCR 寄存器中的值相减,就可以算出脉宽或者频率。如果捕获的脉宽的时间长度超过你的捕获定时器的周期,就会发生溢出,这个我们需要做额外的处理

输出比较

功能框图:

image

输出比较就是通过定时器的外部引脚对外输出控制信号,有冻结、将通道 X(x=1,2,3,4)设置为匹配时输出有效电平、将通道 X 设置为匹配时输出无效电平、翻转、强制变为无效电平、强制变为有效电平、 PWM1 和 PWM2 这八种模式,具体使用哪种模式由寄存器 CCMRx 的位 OCxM[2:0]配置。其中 PWM 模式是输出比较中的特例,使用的也最多

断路功能

断路功能就是电机控制的刹车功能,使能断路功能时,根据相关控制位状态修改输出信号电平。在任何情况下, OCx 和 OCxN 输出都不能同时为有效电平,这关系到电机控制常用的 H 桥电路结构原因

断路源可以是时钟故障事件,由内部复位时钟控制器中的时钟安全系统(CSS)生成,也可以是外部断路输入 IO,两者是或运算关系

系统复位启动都默认关闭断路功能,将断路和死区寄存器(TIMx_BDTR)的 BKE 为置 1,使能断路功能。可通过 TIMx_BDTR 寄存器的 BKP 位设置设置断路输入引脚的有效电平,设置为 1 时输入 BRK 为高电平有效,否则低电平有效

发送断路时,将产生以下效果:

  1. TIMx_BDTR 寄存器中主输出模式使能(MOE)位被清零,输出处于无效、空闲或复位状态

  2. 根据相关控制位状态控制输出通道引脚电平;当使能通道互补输出时,会根据情况自动控制输出通道电平

  3. 将 TIMx_SR 寄存器中的 BIF 位置 1,并可产生中断和 DMA 传输请求

  4. 如果 TIMx_BDTR 寄存器中的 自动输出使能(AOE)位置 1,则 MOE 位会在发生下一个 UEV 事件时自动再次置 1

看门狗

STM32 有两个看门狗,一个是独立看门狗另外一个是窗口看门狗, 独立看门狗号称宠物狗,窗口看门狗号称警犬,本章我们主要分析独立看门狗的功能框图和它的应用。独立看门狗用通俗一点的话来解释就是一个 12 位的递减计数器,当计数器的值从某个值一直减
到 0 的时候,系统就会产生一个复位信号,即 IWDG_RESET。如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。 看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作

功能框图:

image

独立看门狗

独立的看门狗是基于一个 12 位的递减计数器和一个 8 位的预分频器,它由一个内部独立的 40kHz 的 RC 振荡器提供时钟;因为这个 RC 振荡器独立于主时钟,所以它可运行于停机和待机模式。它可以被当成看门狗用于在发生问题时复位整个系统,或作为一个自由定时器为应用程序提供超时管理。通过选项字节可以配置成是软件或硬件启动看门狗。在调试模式下,计数器可以被冻结。

窗口看门狗

窗口看门狗内有一个 7 位的递减计数器,并可以设置成自由运行。它可以被当成看门狗用于在发生问题时复位整个系统。它由主时钟驱动,具有早期预警中断功能;在调试模式下,计数器可以被冻结

系统时基定时器

这个定时器是专用于实时操作系统,也可当成一个标准的递减计数器。它具有下述特性:

  1. 24位的递减计数器

  2. 自动重加载功能

  3. 当计数器为0时能产生一个可屏蔽系统中断

  4. 可编程时钟源

参考文档

  1. STM32基础定时器详解

  2. STM32第六章-TIM定时器详解

posted @ 2022-10-31 21:45  ppqppl  阅读(528)  评论(0编辑  收藏  举报