【灵动微MM32】【标准库】【固件函数库】【MM32G0001A1TC学习日记】【6】_定时器_TIM3 16 位通用定时器 (1)

目录

一、简介

二、主要特征

三、功能描述

3.1        时基单元

3.2        预分频器描述

3.3        计数模式

3.3.1        向上计数模式

3.3.2        向下计数模式

3.3.3        中央对齐模式 (向上/向下计数)

3.4        时钟选择

3.4.1        内部时钟源 (CK_INT)

3.4.2        外部时钟源模式 1

3.5        捕获/比较通道

3.6        输入捕获模式

3.7        PWM 输入模式

3.8        强制输出模式

3.9        输出比较模式

3.10        PWM 模式

3.10.1        向上计数配置

3.10.2        向下计数配置

3.10.3        PWM 中央对齐模式

3.11        单脉冲模式

3.12        编码器接口模式

3.13        定时器输入异或功能

3.14        定时器和外部触发的同步

3.15        从模式:复位模式

3.16        从模式:触发模式

3.14        定时器同步

3.14.1        使用一个定时器作为另一个定时器的预分频器

3.14.2        使用一个定时器使能另一个定时器

3.14.3        使用一个定时器去启动另一个定时器

3.14.4        使用一个外部触发同步地启动 2 个定时器

3.15        调试模式


一、简介

        高级控制定时器 (TIM1) 由一个 16 位的自动装载计数器组成,它由一个可编程的预分频器驱动。

        它适合多种用途,能够提供比较输出、 PWM 输出、死区时间可编程的互补输出、单脉冲模式输出等 多种功能。

        使用定时器预分频器和 RCC 时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫 秒的调节。

        高级控制定时器 (TIM1) 和通用定时器 (TIMx) 是完全独立的,它们不共享任何资源。它们可以同步 操作,具体描述参看通用定时器同步的章节。

二、主要特征

通用 TIMx(TIM3) 定时器功能包括:

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

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

• 4 个独立的通道

        • 输入捕获

        • 输出比较

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

        • 单脉冲模式输出

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

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

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

通用定时器框图:

三、功能描述

3.1        时基单元

        可编程通用定时器的主要部分是一个 16 计数器和与其相关的自动装载寄存器。这个计数器可以向上 计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。

        计数器、自动装载寄存器和预分频器寄存器可以由软件读写,在计数器运行时仍可以读写,时基单元 包含:

• 计数器寄存器 (TIMx_CNT)

• 预分频器寄存器 (TIMx_PSC)

• 自动装载寄存器 (TIMx_ARR)

        自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在 TIMx_CR1 寄 存器中的自动装载预装载使能位 (ARPE) 的设置,预装载寄存器的内容被立即或在每次的更新事件 UEV 时传送到影子寄存器。当计数器达到溢出条件 (向下计数时的下溢条件) 并当 TIMx_CR1 寄存器中的 UDIS 位等于 0 时,产生更新事件。更新事件也可以由软件产生。随后会详细描述每一种配置下更新事件 的产生。

        计数器由预分频器的时钟输出 CK_CNT 驱动,仅当设置了计数器 TIMx_CR1 寄存器中的计数器使 能位 (CEN) 时,CK_CNT 才有效。 (有关计数器使能的细节,请参见控制器的从模式描述)。

3.2        预分频器描述

        预分频器可以将计数器的时钟频率按 1 ~ 65536 之间的任意值分频。它是基于一个 (在 TIMx_PSC 寄存器中的)16 位寄存器控制的 16 位计数器。因为这个控制寄存器带有缓冲器,它能够在工作时被改变。 新的预分频器的参数在下一次更新事件到来时被采用。

        下面两个图分别给出了在预分频器运行时,更改计数器参数的例子。

当预分频器的参数从 1 变到 2 时,计数器的时序图:

当预分频器的参数从 1 变到 4 时,计数器的时序图:

3.3        计数模式

3.3.1        向上计数模式

        在向上计数模式中,计数器从 0 计数到自动加载值 (TIMx_ARR 计数器的内容),然后重新从 0 开 始计数并且产生一个计数器溢出事件。

        每次计数器溢出时可以产生更新事件,在 TIMx_EGR 寄存器中设置 UG 位 (通过软件方式或者使用 从模式控制器) 也同样可以产生一个更新事件。

        设置 TIMx_CR1 寄存器中的 UDIS 位,可以禁止更新事件;这样可以避免在向预装载寄存器中写入 新值时更新影子寄存器。在 UDIS 位被清 0 之前,将不产生更新事件。但是在应该产生更新事件时,计 数器仍会被清 0,同时预分频器的计数也被清 0(但预分频器的数值不变)。此外,如果设置了 TIMx_CR1 寄存器中的 URS 位 (选择更新请求),设置 UG 位将产生一个更新事件 UEV,但硬件不设置 UIF 标志 (即不产生中断请求)。这是为了避免在捕获模式下清除计数器时,同时产生更新和捕获中断。

        当发生一个更新事件时,所有的寄存器都被更新,硬件同时 (依据 URS 位) 设置更新标志位 ( TIMx_SR 寄存器中的 UIF 位)。

• 预分频器的缓冲区被置入预装载寄存器的值 (TIMx_PSC 寄存器的内容)

• 自动装载影子寄存器被重新置入预装载寄存器的值 (TIMx_ARR)

下图给出一些例子,当 TIMx_ARR = 0x36 时计数器在不同时钟频率下的动作:

计数器时序图,内部时钟分频因子为 1:

计数器时序图,内部时钟分频因子为 2:

计数器时序图,内部时钟分频因子为 4:

计数器时序图,内部时钟分频因子为 N:

计数器时序图,当 ARPE = 0 时的更新事件 (TIMx_ARR 没有预装入):

计数器时序图,当 ARPE = 1 时的更新事件 (预装入了 TIMx_ARR):

3.3.2        向下计数模式

        在向下模式中,计数器从自动装入的值 (TIMx_ARR 计数器的值) 开始向下计数到 0,然后从自动装 入的值重新开始并且产生一个计数器向下溢出事件。

        每次计数器溢出时可以产生更新事件,在 TIMx_EGR 寄存器中设置 UG 位 (通过软件方式或者使用 从模式控制器) 也同样可以产生一个更新事件。

        设置 TIMx_CR1 寄存器的 UDIS 位可以禁止 UEV 事件。这样可以避免向预装载寄存器中写入新值 时更新影子寄存器。因此 UDIS 位被清为 0 之前不会产生更新事件。但是计数器仍会从当前自动加载值 重新开始计数,同时预分频器的计数器重新从 0 开始 (但预分频器的速率不能被修改)。

        此外,如果设置了 TIMx_CR1 寄存器中的 URS 位 (选择更新请求),设置 UG 位将产生一个更新事 件 UEV 但不设置 UIF 标志 (因此不产生中断请求),这是为了避免在发生捕获事件并清除计数器时,同 时产生更新和捕获中断。

        当发生更新事件时,所有的寄存器都被更新,并且 (根据 URS 位的设置) 更新标志位 (TIMx_SR 寄 存器中的 UIF 位) 也被设置。

• 预分频器的缓存器被置入预装载寄存器的值 (TIMx_PSC 寄存器的值)。

• 当前的自动加载寄存器被更新为预装载值 (TIMx_ARR 寄存器中的内容)。

注:自动装载在计数器重载入之前被更新,因此下一个周期将是预期的值。

以下是一些当 TIMx_ARR = 0x36 时,计数器在不同时钟频率下的操作实例:

计数器时序图,内部时钟分频因子为 1:

计数器时序图,内部时钟分频因子为 2:

计数器时序图,内部时钟分频因子为 4:

计数器时序图,内部时钟分频因子为 N:

计数器时序图,当没有使用重复计数器时的更新事件:

3.3.3        中央对齐模式 (向上/向下计数)

        在中央对齐模式,计数器从 0 开始计数到自动加载的值 (TIMx_ARR 寄存器)-1,产生一个计数器溢 出事件,然后向下计数到 1 并且产生一个计数器下溢事件;然后再从 0 开始重新计数。

        在这个模式,不能写入 TIMx_CR1 中的 DIR 方向位。它由硬件更新并指示当前的计数方向。更新事 件可以产生在每次计数溢出和每次计数下溢;也可以通过 (软件或者使用从模式控制器) 设置 TIMx_EGR 寄存器中的 UG 位产生,此时,计数器重新从 0 开始计数,预分频器也重新从 0 开始计数。

        设置 TIMx_CR1 寄存器中的 UDIS 位可以禁止 UEV 事件。这样可以避免在向预装载寄存器中写入 新值时更新影子寄存器。因此 UDIS 位被清为 0 之前不会产生更新事件。但是计数器仍会根据当前自动 重加载的值,继续向上或向下计数。

        此外,如果设置了 TIMx_CR1 寄存器中的 URS 位 (选择更新请求),设置 UG 位将产生一个更新事 件 UEV 但不设置 UIF 标志 (因此不产生中断请求),这是为了避免在发生捕获事件并清除计数器时,同 时产生更新和捕获中断。

        当发生更新事件时,所有的寄存器都被更新,并且 (根据 URS 位的设置) 更新标志位 (TIMx_SR 寄 存器中的 UIF 位) 也被设置。

• 预分频器的缓存器被加载为预装载 (TIMx_PSC 寄存器) 的值

• 当前的自动加载寄存器被更新为预装载值 (TIMx_ARR 寄存器中的内容)

注:如果因为计数器溢出而产生更新,自动重装载将在计数器重载入之前被更新,因此下一个周期将 是预期的值 (计数器被装载为新的值)。

以下是一些计数器在不同时钟频率下的操作的例子:

计数器时序图,内部时钟分频因子为 1, TIMx_ARR = 0x06:

计数器时序图,内部时钟分频因子为 2:

计数器时序图,内部时钟分频因子为 4, TIMx_ARR = 0x03:

计数器时序图,内部时钟分频因子为 N:

计数器时序图, ARPE = 1 时的更新事件 (计数器下溢):

计数器时序图, ARPE = 1 时的更新事件 (计数器上溢):

3.4        时钟选择

        计数器时钟可由下列时钟源提供:

• 内部时钟 (CK_INT)。

• 外部时钟模式 1:外部输入脚 (TIx)

• 内部触发输入 (ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器 Timer1 作为另一个定时器 Timer3 的预分频器。

3.4.1        内部时钟源 (CK_INT)

        如果禁止了从模式控制器 (SMS = 000),则 CEN、DIR(TIMx_CR1 寄存器) 和 UG 位 (TIMx_EGR 寄存器) 是事实上的控制位,并且只能被软件修改 (UG 位仍被自动清除)。当 CEN 位被写成 1 时,预分 频器的时钟由内部时钟 CK_INT 提供。

下图显示了控制电路和向上计数器在一般模式下,不带预分频器时的操作。

一般模式下的控制电路,内部时钟分频因子为 1:

3.4.2        外部时钟源模式 1

        当 TIMx_SMCR 寄存器的 SMS = 111 时,此模式被选中。计数器可以在选定输入端的每个上升沿 或下降沿计数。

外部时钟连接例子:

        例如,要配置向上计数器在 T12 输入端的上升沿计数,使用下列步骤:

• 配置 TIMx_CCMR1 寄存器 CC2S = 01,配置通道 2 检测 TI2 输入的上升沿

• 配置 TIMx_CCMR1 寄存器的 IC2F[3: 0],选择输入滤波器带宽 (如果不需要滤波器,保持 IC2F = 0000) 注:捕获预分频器不用作触发,所以不需要对它进行配置

• 配置 TIMx_CCER 寄存器的 CC2P = 0,选定上升沿极

• 配置 TIMx_SMCR 寄存器的 SMS = 111,选择定时器外部时钟模式 1

• 配置 TIMx_SMCR 寄存器中的 TS = 110,选定 TI2 作为触发输入源

• 设置 TIMx_CR1 寄存器的 CEN = 1,启动计数器

当上升沿出现在 TI2,计数器计数一次,且 TIF 标志被设置。

在 TI2 的上升沿和计数器实际时钟之间的延时取决于在 TI2 输入端的重新同步电路。

外部时钟模式 1 下的控制电路:

3.5        捕获/比较通道

        每一个捕获/比较通道都是围绕着一个捕获/比较寄存器 (包含影子寄存器),包括捕获的输入部分 (数 字滤波、多路复用和预分频器),和输出部分 (比较器和输出控制)。

        下面几张图是一个捕获/比较通道概览。输入部分对相应的 TIx 输入信号采样,并产生一个滤波后的 信号 TIxF。然后,一个带极性选择的边缘监测器产生一个信号 (TIxFPx),它可以作为从模式控制器的输 入触发或者作为捕获控制。该信号通过预分频进入捕获寄存器(ICxPS)。

捕获/比较通道 (如:通道 1 输入部分):

输出部分产生一个中间波形 OCxRef(高有效) 作为基准,链的末端决定最终输出信号的极性。

捕获/比较通道 1 的主电路:

捕获/比较通道的输出部分 (通道 1):

        捕获/比较模块由一个预装载寄存器和一个影子寄存器组成。读写过程仅操作预装载寄存器。在捕获模 式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。

        在比较模式下,预装载寄存器的内容被复制到影子寄存器中,然后影子寄存器的内容和计数器进行比 较。

3.6        输入捕获模式

        在输入捕获模式下,当检测到 ICx 信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器 (TIMx_CCRx) 中。当捕获事件发生时,相应的 CCxIF 标志 (TIMx_SR 寄存器) 被置 1,如果开放了中 断,则将产生中断。如果捕获事件发生时 CCxIF 标志已经为高,那么重复捕获标志 CCxOF(TIMx_SR 寄 存器) 被置 1。写 CCxIF = 0 可清除 CCxIF,或读取存储在 TIMx_CCRx 寄存器中的捕获数据也可清除 CCxIF。写 CCxOF = 0 可清除 CCxOF。

        以下例子说明如何在 TI1 输入的上升沿时捕获计数器的值到 TIMx_CCR1 寄存器中,步骤如下:

• 选择有效输入端: TIMx_CCR1 必须连接到 TI1 输入,所以写入 TIMx_CCR1 寄存器中的 CC1S = 01,当 CC1S 不为 00 时,通道被配置为输入,并且 TM1_CCR1 寄存器变为只读。

• 根据输入信号的特点,配置输入滤波器为所需的带宽 (即输入为 TIx 时,输入滤波器控制位是 TIMx_CCMRx 寄存器中的 ICxF 位)。假设输入信号在最多 5 个时钟周期的时间内抖动,我们 须配置滤波器的带宽长于 5 个时钟周期。因此我们可以 (以 fDTS 频率) 连续采样 8 次,以确 认在 TI1 上一次真实的边沿变换,即在 TIMx_CCMR1 寄存器中写入 IC1F = 0011。

• 选择 TI1 通道的有效转换边沿,在 TIMx_CCER 寄存器中写入 CC1P = 0(上升沿)。

• 配置输入预分频器。在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预分频器被禁止 (写 TIMx_CCMR1 寄存器的 IC1PS = 00)。

• 设置 TIMx_CCER 寄存器的 CC1E = 1,允许捕获计数器的值到捕获寄存器中。

• 如果需要,通过设置 TIMx_DIER 寄存器中的 CC1IE 位允许相关中断请求。

当一个输入捕获时:

• 当产生有效的电平转换时,计数器的值被传送到 TIMx_CCR1 寄存器。

• CC1IF 标志被设置 (中断标志)。当发生至少 2 个连续的捕获时,而 CC1IF 未曾被清除。CC1OF 也被置 1。

• 如设置了 CC1IE 位,则会产生一个中断。 为了处理捕获溢出,建议在读出捕获溢出标志之前读取数据,这是为了避免丢失在读出捕获溢出标志 之后和读取数据之前可能产生的捕获溢出信息。

注:设置 TIMx_EGR 寄存器中相应的 CCxG 位,可以通过软件产生输入捕获中断。

3.7        PWM 输入模式

        该模式是输入捕获模式的一个特例,除下列区别外,操作与输入捕获模式相同:

• 两个 ICx 信号被映射同一个 TIx 输入

• 2 个 ICx 信号为边沿有效,但是极性相反

• 其中一个 TIxFP 信号被作为触发输入信号,而从模式控制器被配置成复位模式

例如,你需要测量输入到 TI1 上的 PWM 信号的长度 (TIMx_CCR1 寄存器) 和占空比(TIMx_CCR2 寄存器),具体步骤如下 (取决于 CK_INT 的频率和预分频器的值)

• 选择 TIMx_CCR1 的有效输入:置 TIMx_CCMR1 寄存器的 CC1S = 01(选择 TI1)

• 选择 TI1FP1 的有效极性 (用来捕获数据到 TIMx_CCR1 中和清除计数器):置 CC1P =0(上升 沿有效)。

• 选择 TIMx_CCR2 的有效输入:置 TIMx_CCMR1 寄存器的 CC2S = 10(选择 TI1)。

• 选择 TI1FP2 的有效极性 (捕获数据到 TIMx_CCR2):置 CC2P = 1(下降沿有效)。

• 选择有效的触发输入信号:置 TIMx_SMCR 寄存器中的 TS = 101(选择 TI1FP1)。

• 配置从模式控制器为复位模式:置 TIMx_SMCR 中的 SMS = 100。

• 使能捕获:置 TIMx_CCER 寄存器中 CC1E = 1 且 CC2E = 1。

10-27 PWM 输入模式时序:

        由于只有 TI1FP1 和 TI2FP2 连到了从模式控制器。所以 PWM 输入模式只能使用 TIMx_CH1 / TIMx_CH2 信号。

3.8        强制输出模式

        在输出模式 (TIMx_CCMRx 寄存器中 CCxS = 00) 下,输出比较信号 (OCxREF 和相应的 OCx/OCxN) 能够直接由软件强置为有效或无效状态,而不依赖于输出比较寄存器和计数器间的比较结 果。

        置 TIMx_CCMRx 寄存器中相应的 OCxM = 101,即可强置输出比较信号 (OCxREF/OCx) 为有效状 态。这样 OCxREF 被强置为高电平 (OCxREF 始终为高电平有效),同时 OCx 得到 CCxP 极性相反的 信号。

        例如:CCxP = 0(OCx 高电平有效),则 OCx 被强置为高电平。

        置 TIMx_CCMRx 寄存器中的 OCxM = 100,可强置 OCxREF 信号为低。该模式下,在 TIMx_CCRx 影子寄存器和计数器之间的比较仍然在进行,相应的标志也会被修改。因此仍然会产生相应的中断。这将 会在下面的输出比较模式一节中介绍。

3.9        输出比较模式

        此项功能是用来控制一个输出波形或者指示何时一段给定的时间已经到时。 当计数器与比较寄存器 的内容相同时,输出比较功能做如下操作:

• 将输出比较模式 (TIMx_CCMRx 寄存器中的 OCxM 位) 和输出极性 (TIMx_CCER 寄存器中 的 CCxP 位) 定义的值输出到对应的管脚上。在比较匹配时,输出管脚可以保持它的电平(OCxM = 000)、被设置成有效电平 (OCxM = 001)、被设置成无有效电平 (OCxM= 010) 或进行 翻转 (OCxM = 011)。

• 设置中断状态寄存器中的标志位 (TIMx_SR 寄存器中的 CCxIF 位)。

• 若设置了相应的中断屏蔽 (TIMx_DIER 寄存器中的 CCxIE 位),则产生一个中断。

TIMx_CCMRx 中的 OCxPE 位选择 TIMx_CCRx 寄存器是否需要使用预装载寄存器。在输出比较 模式下,更新事件 UEV 对 OCxREF 和 OCx 输出没有影响。

同步的精度可以达到计数器的一个计数周期。输出比较模式 (在单脉冲模式下) 也能用来输出一个单 脉冲。

输出比较模式的配置步骤:

• 选择计数器时钟 (内部,外部,预分频器)

• 将相应的数据写入 TIMx_ARR 和 TIMx_CCRx 寄存器中

• 如果要产生一个中断请求,设置 CCxIE 位

• 选择输出模式,例如:设置 OCxM = ‘011’、 OCxPE = ‘0’、 CCxP = ‘0’和 CCxE =‘1’,当计数器 CNT 与 CCRx 匹配时翻转 OCx 的输出管脚, CCRx 预装载未用,开启 OCx 输出且高电平 有效

• 设置 TIMx_CR1 寄存器的 CEN 位启动计数器

        TIMx_CCRx 寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器 (OCxPE = ‘0’,否则 TIMx_CCRx 的影子寄存器只能在发生下一次更新事件时被更新)。下图给出了一个 例子。

输出比较模式,翻转 OC1:

3.10        PWM 模式

        脉冲宽度调制模式可以产生一个由 TIMx_ARR 寄存器确定频率、由 TIMx_CCRx 寄存器确定占空比 的信号。

        在 TIMx_CCMRx 寄存器中的 OCxM 位写入‘110’ (PWM 模式 1) 或‘111’ (PWM 模式 2),能够独立 地设置每个 OCx 输出通道产生一路 PWM。必须设置 TIMx_CCMRx 寄存器 OCxPE 位以使能相应的预 装载寄存器,最后还要设置 TIMx_CR1 寄存器的 ARPE 位使能自动重装载的预装载寄存器 (在向上计数 或中心对称模式中)。

        因为仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数 之前,必须通过设置 TIMx_EGR 寄存器中的 UG 位来初始化所有的寄存器。

        OCx 的极性可以通过软件在 TIMx_CCER 寄存器中的 CCxP 位设置,它可以设置为高电平有效活 或低电平有效。

        TIMx_CCER 寄存器中的 CCxE 位控制 OCx 输出使能。详见 TIMx_CCERx 寄存器的 描述。 在 PWM 模式 (模式 1 或模式 2) 下, TIMx_CNT 和 TIM1_CCRx 始终在进行比较, (依据计数 器的计数方向) 以确定是否符合 TIM1_CCRx ≤ TIM1_CNT 或者 TIM1_CNT ≤ TIM1_CCRx。OCxREF 信号只能在下述条件下产生:

• 当比较的结果改变

• 当输出比较模式 (TIMx_CCMRx 寄存器中的 OCxM 位) 从‘冻结’ (无比较, OCxM =‘000’ ) 切 换到某个 PWM 模式 (OCxM = ‘110’或‘111’ )

这样在运行中可以通过软件强置 PWM 输出。根据 TIMx_CR1 寄存器中 CMS 位的状态,定时器能 够产生边沿对齐的 PWM 信号或中央对齐的 PWM 信号。

3.10.1        向上计数配置

        当 TIMx_CR1 寄存器中的 DIR 位为低的时候执行向上计数。参看计数模式章节。

        下面是一个 PWM 模式 1 的例子。当 TIMx_CNT < TIMx_CCRx 时,PWM 参考信号 OCxREF 为 高,否则低。如果 TIMx_CCRx 中的比较值大于自动重装载值 (TIMx_ARR),则 OCxREF 保持为‘1’。如 果比较值为 0,则 OCxREF 保持为‘0’。下图为 TIMx_ARR = 8 时边沿对齐的 PWM 波形实例。

边沿对齐的 PWM 波形 (ARR = 8):

3.10.2        向下计数配置

        当 TIMx_CR1 寄存器的 DIR 位为高时执行向下计数。参看计数模式章节。

        在 PWM 模式 1,当 TIMx_CNT > TIMx_CCRx 时参考信号 OCxREF 为低,否则为高。如果 TIMx_CCRx 中的比较值大于 TIMx_ARR 中的自动重装载值,则 OCxREF 保持为‘1’。该模式下不能产 生 0% 的 PWM 波形。

3.10.3        PWM 中央对齐模式

        当 TIMx_CR1 寄存器中的 CMS 位不为‘00’时为中央对齐模式 (所有其他的配置对 OCxREF/OCx 信号都有相同的作用)。根据不同的 CMS 位的设置,比较标志可以在计数器向上计数时被置 1、在计数 器向下计数时被置 1、或在计数器向上和向下计数时被置‘1’。TIMx_CR1 寄存器中的计数方向位 (DIR) 由 硬件更新,不要用软件修改它。参看计数模式章节的中央对齐模式。

下图给出了一些中央对齐的 PWM 波形的例子

• TIMx_ARR = 8

• PWM 模式 1

• TIMx_CR1 寄存器的 CMS = 01,在中央对齐模式 1 下,当计数器向下计数时设置比较标志

中央对齐的 PWM 波形 (APR = 8):

使用中央对齐模式的提示:

• 进入中央对齐模式时,使用当前的上/下计数配置;这就意味着计数器向上还是向下计数取决于 TIMx_CR1 寄存器中 DIR 位的当前值。此外,软件不能同时修改 DIR 和 CMS 位。

• 不推荐当运行在中央对齐模式时改写计数器,因为会产生不可预知的结果。特别地:

        • 如果写入计数器的值大于自动重加载的值 (TIMx_CNT > TIMx_ARR),则方向不会被更新,例如,如果计数器正在向上计数,它就会继续向上计数

        • 如果将 0 或者 TIMx_ARR 的值写入计数器,方向被更新,但不产生更新事件 UEV

• 使用中央对齐模式最保险的方法,就是在启动计数器之前产生一个软件更新 (设置 TIMx_EGR 位中的 UG 位),不要在计数进行过程中修改计数器的值。

3.11        单脉冲模式

        单脉冲模式 (OPM) 是前述众多模式的一个特例。这种模式允许计数器响应一个激励,并在一个程序 可控的延时之后产生一个脉宽可程序控制的脉冲。

        可以通过从模式控制器启动计数器,在输出比较模式或者 PWM 模式下产生波形。设置 TIMx_CR1 寄存器中的 OPM 位将选择单脉冲模式,这样可以让计数器自动地在产生下一个更新事件 UEV 时停止。

        仅当比较值与计数器的初始值不同时,才能产生一个脉冲。启动之前 (当定时器正在等待触发),必须 如下配置:

• 向上计数方式:计数器 CNT < CCRx ≤ ARR(特别地,0 < CCRx)

• 向下计数方式:计数器 CNT > CCRx

单脉冲模式的例子:

        例如,你需要在从 TI2 输入脚上检测到一个上升沿开始,延迟 tDELAY 之后,在 OC1 上产生一个 长度为 tPULSE 的正脉冲。

假定 TI2FP2 作为触发 1:

• 置 TIMx_CCMR1 寄存器中的 CC2S = 01,把 TI2FP2 映像到 TI2

• 置 TIMx_CCER 寄存器中的 CC2P = 0,使 TI2FP2 能够检测上升沿

• 置 TIMx_SMCR 寄存器中的 TS = 110, TI2FP2 作为从模式控制器的触发 (TRGI)

• 置 TIMx_SMCR 寄存器中的 SMS = 110(触发模式), TI2FP2 被用来启动计数器

OPM 波形由写入比较寄存器的数值决定 (要考虑时钟频率和计数器预分频器)。

• tDELAY 由写入 TIMx_CCR1 寄存器中的值定义。

• tPULSE 由自动装载值和比较值之间的差值定义 (TIMx_ARR - TIMx_CCR1)。

• 假定当发生比较匹配时要产生从 0 到 1 的波形,当计数器到达预装载值是要产生一个从 1 到 0 的波形;首先要置 TIMx_CCMR1 寄存器的 OC1M = 111,进入 PWM 模式 2;根据需要有 选择地使能预装载寄存器:置 TIMx_CCMR1 中的 OC1PE = 1 和 TIMx_CR1 寄存器中的 ARPE;然后在 TIMx_CCR1 寄存器中填写比较值,在 TIMx_ARR 寄存器中填写自动装载值, 设置 UG 位来产生一个更新事件,然后等待在 TI2 上的一个外部触发事件。本例中, CC1P =1。

        在这个例子中, TIMx_CR1 寄存器中的 DIR 和 CMS 位应该置低。

        因为只需一个脉冲,所以必须设置 TIMx_CR1 寄存器中的 OPM = 1,在下一个更新事件(当计数器 从自动装载值翻转到 0) 时停止计数。

        特殊情况:OCx 快速使能:

        在单脉冲模式下,在单脉冲模式下,在 TIx 输入脚的边沿检测逻辑设置 CEN 位以启动计数器。然后 计数器和比较值间的比较操作产生了输出的转换。但是这些操作需要一定的时钟周期,因此它限制了可得 到的最小延时 tDELAY。

        如果要以最小延时输出波形,可以设置 TIMx_CCMRx 寄存器中的 OCxFE 位;此时强制 OCxREF(和 OCx) 直接响应激励而不再依赖比较的结果,输出的波形与比较匹配时的波形一样。OCxFE 只在通道配置为 PWM1 和 PWM2 模式时起作用。

3.12        编码器接口模式

        选择编码器接口模式的方法是:如果计数器只在 TI2 的边沿计数,则置 TIMx_SMCR 寄存器中的 SMS = 001;如果只在 TI1 边沿计数,则置 SMS = 010;如果计数器同时在 TI1 和 TI2 边沿计数,则置 SMS = 011。

        通过设置 TIMx_CCER 寄存器中的 CC1P 和 CC2P 位,可以选择 TI1 和 TI2 极性;如果需要, 还可以对输入滤波器编程。

        两个输入 TI1 和 TI2 被用来作为增量编码器的接口。下表,假定计数器已经启动 (TIMx_CR1 寄存 器中的 CEN = 1),则计数器由每次在 TI1FP1 或 TI2FP2 上的有效跳变驱动。 TI1FP1 和 TI2FP2 是 TI1 和 TI2 在通过输入滤波器和极性控制后的信号;如果没有滤波和变相,则 TI1FP1 = TI1;如果没有滤 波和变相,则 TI2FP2 = TI2。根据两个输入信号的跳变顺序,产生了计数脉冲和方向信号。依据两个输入 信号的跳变顺序,计数器向上或向下计数,同时硬件对 TIMx_CR1 寄存器的 DIR 位进行相应的设置。不 管计数器是依靠 TI1 计数、依靠 TI2 计数或者同时依靠 TI1 和 TI2 计数。在任一输入端 (TI1 或者 TI2) 的跳变都会重新计算 DIR 位。

        编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。这意味着计数器只在 0 到 TIMx_ARR 寄存器的自动装载值之间连续计数 (根据方向,或是 0 到 ARR 计数,或是 ARR 到 0 计数)。 所以在开始计数之前必须配置 TIMx_ARR;同样,捕获器、比较器、预分频器、触发输出特性等仍工作如 常。

        在这个模式下,计数器依照增量编码器的速度和方向被自动的修改,因此计数器的内容始终指示着编 码器的位置。计数方向与相连的传感器旋转的方向对应。下表列出了所有可能的组合,假设 TI1 和 TI2 不 同时变换。

计数方向与编码器信号的关系:

有效边沿

相对信号的电平 (TI1FP1 对 应 TI2,

TI2FP2 对应 TI1)

TI1FP1 信号TI1FP2 信号
上升下降上升下降
仅在 TI1 计数向下计数向上计数不计数不计数
向上计数向下计数不计数不计数
仅在 TI2 计数不计数不计数向上计数向下计数
不计数不计数向下计数向上计数
在 TI1 和 TI2 上 计数向下计数向上计数向上计数向下计数
向上计数向下计数向下计数向上计数

        一个外部的增量编码器可以直接与 MCU 连接而不需要外部接口逻辑。但是,一般使用比较器将编码 器的差动输出转换到数字信号,这大大增加了抗噪声干扰能力。编码器输出的第三个信号表示机械零点, 可以把它连接到一个外部中断输入并触发一个计数器复位。

        下图是一个计数器操作的实例,显示了计数信号的产生和方向控制。它还显示了当选择了双边沿时, 输入抖动是如何被抑制的;抖动可能会在传感器的位置靠近一个转换点时产生。

在这个例子中,我们假定配置如下:

• C1S = ‘01’ (TIMx_CCMR1 寄存器, IC1FP1 映射到 TI1)

• CC2S = ‘01’ (TIMx_CCMR2 寄存器, IC2FP2 映射到 TI2)

• CC1P = ‘0’ (TIMx_CCER 寄存器, IC1FP1 不反相, IC1FP1 = TI1)

• CC2P = ‘0’ (TIMx_CCER 寄存器, IC2FP2 不反相, IC2FP2 = TI2)

• SMS = ‘011’ (TIMx_SMCR 寄存器,所有的输入均在上升沿和下降沿有效)

• CEN = ‘1’ (TIMx_CR1 寄存器,计数器使能)

编码器模式下的计数器操作实例:

下图为当 IC1FP1 极性反相时计数器的操作实例 (CC1P = ‘1’,其他配置与上例相同)

IC1FP1 反相的编码器接口模式实例:

        当定时器配置成编码器接口模式时,提供传感器当前位置的信息。使用第二个配置在捕获模式定时器 测量两个编码器事件的间隔,可以获得动态的信息 (速度,加速度,减速度)。指示机械零点的编码器输出 可被用做此目的。根据两个事件间的间隔,可以按照固定的时间读出计数器。如果可能的话,你可以把计 数器的值锁存到第三个输入捕获寄存器 (捕获信号必须是周期的并且可以由另一个定时器产生)。

3.13        定时器输入异或功能

        TIMx_CR2 寄存器中的 TI1S 位,允许通道 1 的输入滤波器连接到一个异或门的输出端,异或门的 3 个输入端为 TIMx_CH1、 TIMx_CH2 和 TIMx_CH3。

3.14        定时器和外部触发的同步

        TIMx 定时器能够在多种模式下和一个外部的触发同步:复位模式、门控模式和触发模式。

3.15        从模式:复位模式

        在发生一个触发输入事件时,计数器和它的预分频器能够重新被初始化;同时,如果 TIMx_CR1 寄 存器的 URS 位为低,还产生一个更新事件 UEV ;然后所有的预装载寄存器 (TIMx_ARR ,TIMx_CCRx) 都被更新了。

在以下的例子中, TI1 输入端的上升沿导致向上计数器被清零

• 配置通道 1 以检测 TI1 的上升沿。配置输入滤波器的带宽 (在本例中,不需要任何滤波器,因 此保持 IC1F = 0000)。触发操作中不使用捕获预分频器,所以不需要配置。 CC1S 位只选择输入捕获源,即 TIMx_CCMR1 寄存器中 CC1S = 01。置 TIMx_CCER 寄存器中 CC1P = 0 以 确定极性 (只检测上升沿)

• 置 TIMx_SMCR 寄存器中 SMS = 100,配置定时器为复位模式;置 TIMx_SMCR 寄存器中 TS = 101,选择 TI1 作为输入源

• 置 TIMx_CR1 寄存器中 CEN = 1,启动计数器

        计数器开始依据内部时钟计数,然后正常运转直到 TI1 出现一个上升沿;此时,计数器被清零然后从 0 重新开始计数。同时,触发标志 (TIMx_SR 寄存器中的 TIF 位) 被设置,根据 TIMx_DIER 寄存器中 TIE(中断使能) 位,产生一个中断请求。

下图显示当自动重装载寄存器 TIMx_ARR = 0x36 时的动作。在 TI1 上升沿和计数器的实际复位之 间的延时取决于 TI1 输入端的重同步电路。

复位模式下的控制电路:

3.16        从模式:门控模式

        计数器的使能依赖于选中的输入端的电平。

在如下的例子中,计数器只在 TI1 为低时向上计数:

• 配置通道 1 以检测 TI1 上的低电平。配置输入滤波器带宽 (本例中,不需要滤波,所以保持 IC1F = 0000)。触发操作中不使用捕获预分频器,所以不需要配置。 CC1S 位用于选择输入捕获 源,置 TIMx_CCMR1 寄存器中 CC1S = 01。置 TIMx_CCER 寄存器中 CC1P= 1 以确定极性 (只检测低电平)。

• 置 TIMx_SMCR 寄存器中 SMS = 101,配置定时器为门控模式;置 TIMx_SMCR 寄存器中 TS = 101,选择 TI1 作为输入源。

• 置 TIMx_CR1 寄存器中 CEN = 1,启动计数器。在门控模式下,如果 CEN = 0,则计数器不能 启动,不论触发输入电平如何。 只要 TI1 为低,计数器开始依据内部时钟计数,在 TI1 变高时停止计数。当计数器开始或停止时都设置 TIMx_SR 中的 TIF 标置。

TI1 上升沿和计数器实际停止之间的延时取决于 TI1 输入端的重同步电路。

门控模式下的控制电路:

3.16        从模式:触发模式

        计数器的使能依赖于选中的输入端上的事件。

        在下面的例子中,计数器在 TI2 输入的上升沿开始向上计数:

• 配置通道 2 检测 TI2 的上升沿。配置输入滤波器带宽 (本例中,不需要任何滤波器,保持 IC2F = 0000)。触发操作中不使用捕获预分频器,不需要配置。 CC2S 位只用于选择输入捕获源,置 TIMx_CCMR1 寄存器中 CC2S = 01。置 TIMx_CCER 寄存器中 CC1P= 1 以确定极性 (只检 测低电平)。

• 置 TIMx_SMCR 寄存器中 SMS = 110,配置定时器为触发模式;置 TIMx_SMCR 寄存器中 TS = 110,选择 TI2 作为输入源。 当 TI2 出现一个上升沿时,计数器开始在内部时钟驱动下计数,同时设置 TIF 标志。

TI2 上升沿和计数器启动计数之间的延时取决于 TI2 输入端的重同步电路。

3.14        定时器同步

        所有 TIMx 定时器在内部相连,用于定时器同步或链接。当一个定时器处于主模式时,它可以对另一 个处于从模式的定时器的计数器进行复位、启动、停止或提供时钟等操作。

下图显示了触发选择和主模式选择模块的概况。

主/从定时器的例子

3.14.1        使用一个定时器作为另一个定时器的预分频器

如:可以配置定时器 1 作为定时器 3 的预分频器。参考上图,进行下述操作:

• 配置定时器 1 为主模式,它可以在每一个更新事件 UEV 时输出一个周期性的触发信号。在 TIM1_CR2 寄存器的 MMS = ‘010’时,每当产生一个更新事件时在 TRGO1 上输出一个上升沿 信号。

• 连接定时器 1 的 TRGO1 输出至定时器 3,设置 TIM3_SMCR 寄存器的 TS = ‘000’,配置定 时器 3 为使用 ITR1 作为内部触发的从模式。

• 然后把从模式控制器置于外部时钟模式 1(TIM3_SMCR 寄存器的 SMS = 111);这样定时器 3 即可由定时器 1 周期性的上升沿 (即定时器 1 的计数器溢出) 信号驱动。

• 最后,必须设置相应 (TIMx_CR1 寄存器) 的 CEN 位分别启动两个定时器。

注:如果 OCx 已被选中为定时器 1 的触发输出 (MMS = 1xx),它的上升沿用于驱动定时器 3 的计 数器。

3.14.2        使用一个定时器使能另一个定时器

        在这个例子中,定时器 3 的运行受由定时器 1 的输出比较控制。参考下图。只当定时器 1 的 OC1REF 为高时定时器 3 才对分频后的内部时钟计数。两个定时器的时钟频率都是由预分频器对 CK_INT 除以 3(fCK_CNT = fCK_INT/3) 得到。

• 配置定时器 1 为主模式,送出它的输出比较参考信号 (OC1REF) 为触发输出 (TIM1_CR2 寄存 器的 MMS = 100)

• 配置定时器 1 的 OC1REF 波形 (TIM1_CCMR1 寄存器)

• 配置定时器 3 从定时器 1 获得输入触发 (TIM3_SMCR 寄存器的 TS = 001)  配置定时器 3 为门控模式 (TIM3_SMCR 寄存器的 SMS = 101)

• 置 TIM3_CR1 寄存器的 CEN = 1 以使能定时器 3

• 置 TIM1_CR1 寄存器的 CEN = 1 以使能定时器 1

注:定时器 3 的时钟不与定时器 1 的时钟同步,这个模式只影响定时器 3 计数器的使能信号。

定时器 1 的 OC1REF 控制定时器 3:

        在上图的例子中,在定时器 3 启动之前,它们的计数器和预分频器未被初始化,因此它们从当前的数 值开始计数。可以在启动定时器 1 之前复位 2 个定时器,使它们从给定的数值开始,即在定时器计数器 中写入需要的任意数值。写 TIMx_EGR 寄存器的 UG 位即可复位定时器。

        在下一个例子中,需要同步定时器 1 和定时器 3。定时器 1 是主模式并从 0 开始,定时器 3 是从 模式并从 0xE7 开始; 2 个定时器的预分频器系数相同。写 0 到 TIM1_CR1 的 CEN 位将禁止定时器 1,定时器 3 随即停止。

• 配置定时器 1 为主模式,送出输出比较 1 参考信号 (OC1REF) 做为触发输出 (TIM1_CR2 寄 存器的 MMS = 100)。

• 配置定时器 1 的 OC1REF 波形 (TIM1_CCMR1 寄存器)。

• 配置定时器 3 从定时器 1 获得输入触发 (TIM3_SMCR 寄存器的 TS = 000)

• 配置定时器 3 为门控模式 (TIM3_SMCR 寄存器的 SMS = 101)

• 置 TIM1_EGR 寄存器的 UG = 1,复位定时器 1。

• 置 TIM3_EGR 寄存器的 UG = 1,复位定时器 3。

• 写 0xE7 至定时器 3 的计数器 (TIM3_CNT),初始化它为 0xE7。

• 置 TIM3_CR1 寄存器的 CEN = 1 以使能定时器 3。

• 置 TIM1_CR1 寄存器的 CEN = 1 以启动定时器 1。

• 置 TIM1_CR1 寄存器的 CEN = 0 以停止定时器 1。

通过使能定时器 1 可以控制定时器 3:

3.14.3        使用一个定时器去启动另一个定时器

        在这个例子中,使用定时器 1 的更新事件使能定时器 3。参考下图。当定时器 1 产生更新事件时, 定时器 3 即从它当前的数值 (可以是非 0) 按照分频的内部时钟开始计数。在收到触发信号时,定时器 3 的 CEN 位被自动地置 1,同时计数器开始计数直到写 0 到 TIM3_CR1 寄存器的 CEN 位。两个定时器 的时钟频率都是由预分频器对 CK_INT 除以 3(fCK_CNT=fCK_INT/3)。

• 配置定时器 1 为主模式,送出它的更新事件 (UEV) 做为触发输出 (TIM1_CR2 寄存器的 MMS = 010)。

• 配置定时器 1 的周期 (TIM1_ARR 寄存器)。

• 配置定时器 3 从定时器 1 获得输入触发 (TIM3_SMCR 寄存器的 TS = 000) 。

• 配置定时器 3 为触发模式 (TIM3_SMCR 寄存器的 SMS = 110) 。

• 置 TIM1_CR1 寄存器的 CEN = 1 以启动定时器 1。

使用定时器 1 的更新触发定时器 3:

        在上一个例子中,可以在启动计数之前初始化两个计数器。下图显示在相同配置情况下,使用触发模 式而不是门控模式 (TIM3_SMCR 寄存器的 SMS = 110) 的动作。

利用定时器 1 的使能触发定时器 3:

3.14.4        使用一个外部触发同步地启动 2 个定时器

        这个例子中当定时器 1 的 TI1 输入上升时使能定时器 1,使能定时器 1 的使能定时器 3。为保证 计数器的对齐,定时器 1 必须配置为主/从模式 (对应 TI1 为从,对应定时器 3 为主):

• 配置定时器 1 为主模式,送出它的使能作为触发输出 (TIM1_CR2 寄存器的 MMS=‘001’)

• 配置定时器 1 为从模式,从 TI1 获得输入触发 (TIM1_SMCR 寄存器的 TS = ‘100’ )

• 配置定时器 1 为触发模式 (TIM1_SMCR 寄存器的 SMS=‘110’ )

• 配置定时器 3 从定时器 1 获得输入触发 (TIM3_SMCR 寄存器的 TS = 000)

• 配置定时器 3 为触发模式 (TIM3_SMCR 寄存器的 SMS = 110)

        当定时器 1 的 TI1 上出现一个上升沿时,两个定时器同步地按照内部时钟开始计数,两个 TIF 标志 也同时被设置。

        注:在这个例子中,在启动之前两个定时器都被初始化 (设置相应的 UG 位),两个计数器都从 0 开 始,但可以通过写入任意一个计数器寄存器 (TIMx_CNT) 在定时器间插入一个偏移。下图中能看到主/从 模式下在定时器 1 的 CNT_EN 和 CK_PSC 之间有个延迟。

使用定时器 1 的 TI1 输入触发定时器 1 和定时器 3:

3.15        调试模式

        当微控制器进入调试模式时 (CPU 核心停止),根据 DBG 模块中 DBG_TIM3_STOP 的设置,TIMx 计数器可以或者继续正常操作,或者停止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JuJu陈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值