01、模块介绍
高级控制定时器(TIMER1)由一个 16 位的自动装载计数器组成,它由一个可编程的预分频器驱动。它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补 PWM 等)。
使用定时器预分频器和 CMU 时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。
高级控制定时器(TIMER1)和通用定时器(TIMERx)是完全独立的,它们不共享任何资源。
02、功能特点
• 16 位向上、向下、向上/下自动装载计数器
• 16 位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为 1~65535 之间的任意数值
• 多达 4 个独立通道:
– 输入捕获
– 输出比较
– PWM 生成(边缘或中间对齐模式)
– 单脉冲模式输出
• 死区时间可编程的互补输出
• 使用外部信号控制定时器和定时器互联的同步电路
• 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器
• 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态
• 如下事件发生时产生中断/DMA:
– 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
– 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
– 输入捕获
– 输出比较
– 刹车信号输入
• 支持针对定位的增量(正交)编码器和霍尔传感器电路
• 触发输入作为外部时钟或者按周期的电流管理
03、功能说明
1 时基单元
可编程高级控制定时器的主要部分是一个 16 位计数器和与其相关的自动装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。
计数器、自动装载寄存器和预分频器寄存器可以由软件读写,即使计数器还在运行读写仍然有效。
时基单元包含:
• 计数器寄存器(TIMERx_CNT)
• 预分频器寄存器 (TIMERx_PSC)
• 自动装载寄存器 (TIMERx_ARR)
• 重复次数寄存器 (TIMERx_RCR)
自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在TIMERx_CR1 寄存器中的自动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被立即或在每次的更新事件 UEV 时传送到影子寄存器。当计数器达到溢出条件(向下计数时的下溢条件)并当 TIMERx_CR1寄存器中的 UDIS 位等于 0 时,产生更新事件。更新事件也可以由软件产生。随后会详细描述每一种配置下更新事件的产生。
计数器由预分频器的时钟输出 CK_CNT 驱动,仅当设置了计数器 TIMERx_CR1 寄存器中的计数器使能位(CEN)时,CK_CNT 才有效。(更多有关使能计数器的细节,请参见控制器的从模式描述)。
注意,在设置了 TIMERx_CR 寄存器的 CEN 位的一个时钟周期后,计数器开始计数。
预分频器描述:
预分频器可以将计数器的时钟频率按 1 到 65536 之间的任意值分频。它是基于一个(在 TIMERx_PSC寄存器中的)16 位寄存器控制的 16 位计数器。因为这个控制寄存器带有缓冲器,它能够在运行时被改变,新的预分频器的参数在下一次更新事件到来时被采用。
以下两图给出了在预分频器运行时,更改计数器参数的例子。
当预分频器的参数从 1 变到 2 时,计数器的时序图:
2 计数器模式
向上计数模式:
在向上计数模式中,计数器从 0 计数到自动加载值(TIMERx_ARR 计数器的内容),然后重新从 0 开始计数并且产生一个计数器溢出事件。
如果使用了重复计数器功能,在向上计数达到设置的重复计数次数(TIMERx_RCR)时,产生更新事件 (UEV);否则每次计数器溢出时才产生更新事件。
在 TIMERx_EGR 寄存器中(通过软件方式或者使用从模式控制器)设置 UG 位也同样可以产生一个更新事件。
设置 TIMERx_CR1 寄存器中的 UDIS 位,可以禁止更新事件;这样可以避免在向预装载寄存器中写入新值时更新影子寄存器。在 UDIS 位被清‘0’之前,将不产生更新事件。但是在应该产生更新事件时,计数器仍会被清‘0’,同时预分频器的计数也被清 0(但预分频器的数值不变)。此外,如果设置了TIMERx_CR1 寄存器中的 URS 位(选择更新请求),设置 UG 位将产生一个更新事件 UEV,但硬件不设置UIF 标志(即不产生中断或 DMA 请求)。这是为了避免在捕获模式下清除计数器时,同时产生更新和捕获中断。
当发生一个更新事件时,所有的寄存器都被更新,硬件同时(依据 URS 位)设置更新标志位(TIMERx_SR寄存器中的 UIF 位)。
• 重复计数器被重新加载为 TIMERx_RCR 寄存器的内容。
• 自动装载影子寄存器被重新置入预装载寄存器的值(TIMERx_ARR)。
• 预分频器的缓冲区被置入预装载寄存器的值(TIMERx_PSC 寄存器的内容)。
下图给出一些例子,当 TIMERx_ARR=0x36 时计数器在不同时钟频率下的动作。
计数器时序图,预分频参数为 1
计数器时序图,预分频参数为 2
计数器时序图,当 ARPE=0 时的更新事件(TIMERx_ARR 没有预装入)
计数器时序图,当 ARPE=1 时的更新事件(预装入了 TIMERx_ARR)
向下计数模式:
在向下模式中,计数器从自动装入的值(TIMERx_ARR 计数器的值)开始向下计数到 0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。
如果使用了重复计数器,当向下计数重复了重复计数寄存器(TIMERx_RCR)中设定的次数后,将产生更新事件(UEV),否则每次计数器下溢时才产生更新事件。
在 TIMERx_EGR 寄存器中(通过软件方式或者使用从模式控制器)设置 UG 位,也同样可以产生一个更新事件。
设置 TIMERx_CR1 寄存器的 UDIS 位可以禁止 UEV 事件。这样可以避免向预装载寄存器中写入新值时更新影子寄存器。因此 UDIS 位被清为 0 之前不会产生更新事件。然而,计数器仍会从当前自动加载值 重新开始计数,并且预分频器的计数器重新从 0 开始(但预分频系数不变)。
此外,如果设置了 TIMERx_CR1 寄存器中的 URS 位(选择更新请求) ,设置 UG 位将产生一个更新事件 UEV 但不设置 UIF 标志(因此不产生中断和 DMA 请求),这是为了避免在发生捕获事件并清除计数器时,同时产生更新和捕获中断。
当发生更新事件时,所有的寄存器都被更新,并且(根据 URS 位的设置)更新标志位(TIMERx_SR 寄存
器中的 UIF 位)也被设置。
• 重复计数器被重新加载为 TIMERx_RCR 寄存器的内容。
• 预分频器的缓冲区被置入预装载寄存器的值(TIMERx_PSC 寄存器的内容)。
• 当前的自动加载寄存器被更新为预装载值(TIMERx_ARR 寄存器中的内容)。注:自动装载在计数器重载入之前被更新,因此下一个周期将是预期的值。
以下是一些当 TIMERx_ARR=0x36 时,计数器在不同时钟频率下的操作例子。
计数器时序图,预分频参数为 1
计数器时序图,预分频参数为 2
中央对齐模式(向上/向下计数):
在中央对齐模式,计数器从 0 开始计数到自动加载的值(TIMERx_ARR 寄存器)−1,产生一个计数器溢出事件,然后向下计数到 1 并且产生一个计数器下溢事件;然后再从 0 开始重新计数。
在此模式下,不能写入 TIMERx_CR1 中的 DIR 方向位。它由硬件更新并指示当前的计数方向。
可以在每次计数上溢和每次计数下溢时产生更新事件;也可以通过(软件或者使用从模式控制器)设置TIMERx_EGR 寄存器中的 UG 位产生更新事件。然后,计数器重新从 0 开始计数,预分频器也重新从 0 开始计数。
设置 TIMERx_CR1 寄存器中的 UDIS 位可以禁止 UEV 事件。这样可以避免在向预装载寄存器中写入新值时更新影子寄存器。因此 UDIS 位被清为 0 之前不会产生更新事件。然而,计数器仍会根据当前自动重加载的值,继续向上或向下计数。
此外,如果设置了 TIMERx_CR1 寄存器中的 URS 位(选择更新请求) ,设置 UG 位将产生一个更新事件 UEV 但不设置 UIF 标志(因此不产生中断和 DMA 请求),这是为了避免在发生捕获事件并清除计数器时, 同时产生更新和捕获中断。
当发生更新事件时,所有的寄存器都被更新,并且(根据 URS 位的设置)更新标志位(TIMERx_SR 寄存器中的 UIF 位)也被设置。
• 重复计数器被重新加载为 TIMERx_RCR 寄存器的内容。
• 预分频器的缓冲区被置入预装载寄存器的值(TIMERx_PSC 寄存器的内容)。
• 当前的自动加载寄存器被更新为预装载值(TIMERx_ARR 寄存器中的内容)。注:如果因为计数器溢出而产生更新,自动重装载将在计数器重载入之前被更新,因此下一个周期将是预期的值(计数器被装载为新的值)。
以下是一些计数器在不同时钟频率下的操作的例子:
计数器时序图,内部时钟分频因子为 1,TIMERx_ARR=0x6
计数器时序图,ARPE=0 时的更新事件(计数器下溢)
计数器时序图,ARPE=1 时的更新事件(计数器溢出)
3 重复计数器
“时基单元”解释了计数器上溢/下溢时更新事件(UEV)是如何产生的,然而事实上它只能在重复计数达到 0 的时候产生。这个特性对产生 PWM 信号非常有用。
这意味着在每 N 次计数上溢或下溢时,数据从预装载寄存器传输到影子寄存器(TIMERx_ARR 自动重载入寄存器,TIMERx_PSC 预装载寄存器,还有在比较模式下的捕获/比较寄存器 TIMERx_CCRx),N是TIMERx_RCR 重复计数寄存器中的值。
重复计数器在下述任一条件成立时递减:
• 向上计数模式下每次计数器溢出时
• 向下计数模式下每次计数器下溢时
• 中央对齐模式下每次上溢和每次下溢时。虽然这样限制了 PWM 的最大循环周期为 128,但它能够在
每个 PWM 周期 2 次更新占空比。在中央对齐模式下,因为波形是对称的,如果每个 PWM 周期中仅刷新一次比较寄存器,则最大的分辨率为 2xTck 。
重复计数器是自动加载的,重复速率是由 TIMERx_RCR 寄存器的值定义(参考下图 15-21)。当更新事件由软件产生(通过设置 TIMERx_EGR 中的 UG 位)或者通过硬件的从模式控制器产生,则无论重复计数器的值是多少,立即发生更新事件,并且 TIMERx_RCR 寄存器中的内容被重载入到重复计数器。
不同模式下更新速率的例子,及 TIMERx_RCR 的寄存器设置
4 时钟选择
计数器时钟可由下列时钟源提供:
• 内部时钟(CK_INT)
• 外部时钟模式 1:外部输入引脚
• 外部时钟模式 2:外部触发输入 ETR
• 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器。如可以配置一个定时器 Timer1而作为另一个定时器 Timer2 的预分频器。详见下一章。
内部时钟源 内部时钟源(CK_INT)
如果禁止了从模式控制器(SMS=000),则 CEN、DIR(TIMERx_CR1 寄存器)和 UG 位(TIMERx_EGR寄存器)是事实上的控制位,并且只能被软件修改(UG 位仍被自动清除)。只要 CEN 位被写成“1”,预分频器的时钟就由内部时钟 CK_INT 提供。
下图显示控制电路和向上计数器在一般模式下,不带预分频器时的操作。
一般模式下的控制电路,预分频参数为 1
外部时钟源模式 1
当 TIMERx_SMCR 寄存器的 SMS=111 时,此模式被选中。计数器可以在选定输入端的每个上升沿或下降沿计数。
TI2 外部时钟连接例子
例如,要配置向上计数器在 T12 输入端的上升沿计数,使用下列步骤:
配置 TIMERx_CCMR1 寄存器 CC2S=01,配置通道 2 检测 TI2 输入的上升沿
配置 TIMERx_CCMR1 寄存器的 IC2F[3:0],选择输入滤波器带宽(如果不需要滤波器,保持 IC2F=0000)
配置 TIMERx_CCER 寄存器的 CC2P=0,选定上升沿极性
配置 TIMERx_SMCR 寄存器的 SMS=111,选择定时器外部时钟模式 1
配置 TIMERx_SMCR 寄存器中的 TS=110,选定 TI2 作为触发输入源
设置 TIMERx_CR1 寄存器的 CEN=1,启动计数器
注:捕获预分频器不用作触发,所以不需要对它进行配置
当上升沿出现在 TI2,计数器计数一次,且 TIF 标志被设置。
在 TI2 的上升沿和计数器实际时钟之间的延时,取决于在 TI2 输入端的重新同步电路。
外部时钟模式 1 下的控制电路
外部时钟源模式 2:
选定此模式的方法为:令 TIMERx_SMCR 寄存器中的 ECE=1,计数器能够在外部触发 ETR 的每一个上升沿或下降沿计数。
下图是外部触发输入的框图
例如,要配置在 ETR 下每 2 个上升沿计数一次的向上计数器,使用下列步骤:
本例中不需要滤波器,置 TIMERx_SMCR 寄存器中的 ETF[3:0]=0000
设置预分频器,置 TIMERx_SMCR 寄存器中的 ETPS[1:0]=01
选择 ETR 的上升沿检测,置 TIMERx_SMCR 寄存器中的 ETP=0
开启外部时钟模式 2,写 TIMERx_SMCR 寄存器中的 ECE=1
启动计数器,写 TIMERx_CR1 寄存器中的 CEN=1
计数器在每 2 个 ETR 上升沿计数一次。
在 ETR 的上升沿和计数器实际时钟之间的延时取决于在 ETRP 信号端的重新同步电路。
5 捕获/比较通道
每一个捕获/比较通道都是围绕着一个捕获/比较寄存器(包含影子寄存器),包括捕获的输入部分(数字滤波、多路复用和预分频器),和输出部分(比较器和输出控制)。
以下三图是一个捕获/比较通道概览。
输入部分对相应的 TIx 输入信号采样,并产生一个滤波后的信号 TIxF。然后,一个带极性选择的边缘监测器产生一个信号(TIxFPx),它可以作为从模式控制器的输入触发或者作为捕获控制。该信号通过预分频进入捕获寄存器(ICxPS)。
输出部分产生一个中间波形 OCxRef(高有效)作为基准,链的末端决定最终输出信号的极性。
捕获/比较模块由一个预装载寄存器和一个影子寄存器组成。读写过程仅操作预装载寄存器。
在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。
在比较模式下,预装载寄存器的内容被复制到影子寄存器中,然后影子寄存器的内容和计数器进行比较。
6 输入捕获模式:
在输入捕获模式下,当检测到 ICx 信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMERx_CCRx)中。当发生捕获事件时,相应的 CCxIF 标志(TIMERx_SR 寄存器)被置 1,如果开放了中断或者 DMA 操作,则将产生中断或者 DMA 请求。如果发生捕获事件时 CCxIF 标志已经为高,那么重复捕获标志 CCxOF(TIMERx_SR 寄存器)被置 1。写 CCxIF=0 可清除 CCxIF,或读取存储在 TIMERx_CCRx 寄存器中的捕获数据也可清除 CCxIF。写 CCxOF=0 可清除 CCxOF。
以下例子说明如何在 TI1 输入的上升沿时捕获计数器的值到 TIMERx_CCR1 寄存器中,步骤如下:
• 选择有效输入端:TIMERx_CCR1 必须连接到 TI1 输入,所以写入 TIMERx_CCMR1 寄存器中的CC1S=01,只要 CC1S 不为“00”,通道被配置为输入,并且 TIMERx_CCR1 寄存器变为只读。
• 根据输入信号的特点,配置输入滤波器为所需的带宽(即输入为 TIx 时,输入滤波器控制位是TIMERx_CCMRx 寄存器中的 ICxF 位)。假设输入信号在最多 5 个内部时钟周期的时间内抖动,我们须配置滤波器的带宽长于 5 个时钟周期;因此我们可以(以 f DTS 频率)连续采样 8 次,以确认在 TI1上一次真实的边沿变换,即在 TIMERx_CCMR1 寄存器中写入 IC1F=0011。
• 选择 TI1 通道的有效转换边沿,在 TIMERx_CCER 寄存器中写入 CC1P=0(上升沿)。
• 配置输入预分频器。在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预分频器被禁止(写 TIMERx_CCMR1 寄存器的 IC1PS=00)。
• 设置 TIMERx_CCER 寄存器的 CC1E=1,允许捕获计数器的值到捕获寄存器中。
• 如果需要,通过设置 TIMERx_DIER 寄存器中的 CC1IE 位允许相关中断请求,通过设置 TIMERx_DIER寄存器中的 CC1DE 位允许 DMA 请求。
• 当发生一个输入捕获时:
• 产生有效的电平转换时,计数器的值被传送到 TIMERx_CCR1 寄存器。
• CC1IF 标志被设置(中断标志)。当发生至少 2 个连续的捕获时,而 CC1IF 未曾被清除,CC1OF 也被置1。
• 如设置了 CC1IE 位,则会产生一个中断。
• 如设置了 CC1DE 位,则还会产生一个 DMA 请求。
• 为了处理捕获溢出,建议在读出捕获溢出标志之前读取数据,这是为了避免丢失在读出捕获溢出标志之后和读取数据之前可能产生的捕获溢出信息。
注:设置 TIMERx_EGR 寄存器中相应的 CCxG 位,可以通过软件产生输入捕获中断和/或 DMA 请求。
7 PWM 输入模式
该模式是输入捕获模式的一个特例,除下列区别外,操作与输入捕获模式相同:
• 两个 ICx 信号被映射至同一个 TIx 输入。
• 这 2 个 ICx 信号为边沿有效,但是极性相反。
• 其中一个 TIxFP 信号被作为触发输入信号,而从模式控制器被配置成复位模式。
例如,你需要测量输入到 TI1 上的 PWM 信号的长度(TIMERx_CCR1 寄存器)和占空比(TIMERx_CCR2寄存器),具体步骤如下(取决于 CK_INT 的频率和预分频器的值)
• 选择 TIMERx_CCR1 的有效输入:置 TIMERx_CCMR1 寄存器的 CC1S=01(选中 TI1)。
• 选择 TI1FP1 的有效极性(用来捕获数据到 TIMERx_CCR1 中和清除计数器):置 CC1P=0(上升沿有效)。
• 选择 TIMERx_CCR2 的有效输入:置 TIMERx_CCMR1 寄存器的 CC2S=10(选中 TI1)。
• 选择 TI1FP2 的有效极性(捕获数据到 TIMERx_CCR2):置 CC2P=1(下降沿有效)。
• 选择有效的触发输入信号:置 TIMERx_SMCR 寄存器中的 TS=101(选择 TI1FP1)。
• 配置从模式控制器为复位模式:置 TIMERx_SMCR 中的 SMS=100。
• 使能捕获:置 TIMERx_CCER 寄存器中 CC1E=1 且 CC2E=1。
因为只有 TI1FP1 和 TI2FP2 连到了从模式控制器,所以 PWM 输入模式只能使用TIMERx_CH1/TIMERx_CH2 信号。
8 强制输出模式:
在输出模式(TIMERx_CCMRx 寄存器中 CCxS=00)下,输出比较信号(OCxREF 和相应的 OCx/OCxN)能够直接由软件强置为有效或无效状态,而不依赖于输出比较寄存器和计数器间的比较结果。
置 TIMERx_CCMRx 寄存器中相应的 OCxM=101,即可强置输出比较信号(OCxREF/OCx)为有效状态。这样 OCxREF 被强置为高电平(OCxREF 始终为高电平有效),同时 OCx 得到 CCxP 极性相反的信号。
例如:CCxP=0(OCx 高电平有效),则 OCx 被强置为高电平。
置 TIMERx_CCMRx 寄存器中的 OCxM=100,可强置 OCxREF 信号为低。
该模式下,在 TIMERx_CCRx 影子寄存器和计数器之间的比较仍然在进行,相应的标志也会被修改。因此仍然会产生相应的中断和 DMA 请求。这将会在下面的输出比较模式一节中介绍。
9 输出比较模式
此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。
当计数器与捕获/比较寄存器的内容相同时,输出比较功能做如下操作:
• 将输出比较模式(TIMERx_CCMRx 寄存器中的 OCxM 位)和输出极性(TIMERx_CCER 寄存器中的 CCxP 位)定义的值输出到对应的引脚上。在比较匹配时,输出引脚可以保持它的电平(OCxM=000)、被设置成有效电平(OCxM=001)、被设置成无效电平(OCxM=010)或进行翻转(OCxM=011)。
• 设置中断状态寄存器中的标志位(TIMERx_SR 寄存器中的 CCxIF 位)。
• 若设置了相应的中断屏蔽(TIMERx_DIER 寄存器中的 CCxIE 位),则产生一个中断。
• 若设置了相应的使能位(TIMERx_DIER 寄存器中的 CCxDE 位,TIMERx_CR2 寄存器中的 CCDS 位选择 DMA 请求功能),则产生一个 DMA 请求。
TIMERx_CCMRx 中的 OCxPE 位选择 TIMERx_CCRx 寄存器是否需要使用预装载寄存器。
在输出比较模式下,更新事件 UEV 对 OCxREF 和 OCx 输出没有影响。
同步的精度可以达到计数器的一个计数周期。输出比较模式(在单脉冲模式下)也能用来输出一个单脉冲。
输出比较模式的配置步骤:
1. 选择计数器时钟(内部,外部,预分频器)。
2. 将相应的数据写入 TIMERx_ARR 和 TIMERx_CCRx 寄存器中。
3. 如果要产生一个中断请求,设置 CCxIE 位。
4. 选择输出模式,例如:
– 要求计数器与 CCRx 匹配时翻转 OCx 的输出引脚,设置 OCxM=011
– 置 OCxPE = 0 禁用预装载寄存器
– 置 CCxP = 0 选择极性为高电平有效
– 置 CCxE = 1 使能输出
5. 设置 TIMERx_CR1 寄存器的 CEN 位启动计数器
TIMERx_CCRx 寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=‘0’,否则 TIMERx_CCRx 的影子寄存器只能在发生下一次更新事件时被更新)。下图给出了一个例子。
输出比较模式,翻转 OC1
04、代码配置
(1)定时器计数模式:
(2)定时器捕获功能:
来源:珠海巨晟科技股份有限公司
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。