【复旦微FM33 MCU 底层开发指南】高级定时器ATIM
0 前言
本系列基于复旦微FM33LC0系列MCU的DataSheet编写,提供基于寄存器开发指南、应用技巧、注意事项等
本文章及本系列其他文章将持续更新,本系列其它文章请跳转↓↓↓
【复旦微FM33 MCU 寄存器开发指南】总集篇
本文章最后更新日期:2025/04/13
文章目录
- 0 前言
- 1 概述
- 2 基本描述
- 2.1 ATIM工作时钟
- 2.2 ATIM计数源
- 2.2.1 内部时钟模式
- 2.2.2 外部时钟模式1
- 2.2.3 外部时钟模式2
- 2.2.4 内部触发模式
- 2.3 ATIM复位
- 3 基础功能描述
- 3.1 从机模式
- 3.1.1 复位模式
- 3.1.2 门控模式
- 3.1.3 触发模式
- 3.1.4 外部事件触发的外部时钟计数模式(触发模式的一个应用)
- 3.2 输入捕捉模式
- 3.2.1 输入捕捉示例:ATIM_CH1上升沿捕获
- 3.2.2 输入捕捉示例:PWM占空比计算
- 3.3 输出比较模式
- 3.3.1 比较通道CH1—CH3
- 3.3.2 比较通道CH4
- 3.4 PWM输出模式
- 3.5 编码器接口模式
- 4 附加功能描述
- 4.1 自动重装载
- 4.2 软件Force输出
- 4.3 互补输出和死区插入
- 4.3.1 互补输出
- 4.3.2 死区插入
- 4.4 刹车功能
- 4.5 6-step PWM输出
- 4.6 单脉冲输出
- 4.7 外部事件清除OCxREF
- 4.8 输入异或功能
- 4.9 Debug模式
- 5 应用Tips
- 5.1 调试记录:P端和N端的极性?
1 概述
(我觉得FM33LC0
的ATIM
和STM32F407
的TIM1
可能是一个IP,因为寄存器基本都是一样的)
2 基本描述
2.1 ATIM工作时钟
在使用ATIM
之前,必须在RCC
中配置RCC->OPCCR1
寄存器的ATCKE
和ATCKS
,以使能ATIM工作时钟,并配置工作时钟源。
2.2 ATIM计数源
ATIM有四个计数源:内部时钟、外部时钟1、外部时钟2、内部触发。
注意:DataSheet上仍将该部分命名为工作时钟,我认为这不恰当。因为这里的“ATIM
计数源”指的是定时器的计数值,无论是否使用ATIM
的工作时钟作为计数源,都必须使能工作时钟。因此本文使用计数源这个名词代替。
2.2.1 内部时钟模式
ATIM
默认使用的就是内部时钟模式,不需要特别配置寄存器。
如前文所述,ATIM
的工作时钟可以来源于APBCLK2
、USB
、PLL
的2倍频。
在该模式下,ATIM
的工作时钟经过分频后作为计数源。
分频值可以在ATIM->PSC
寄存器配置。
2.2.2 外部时钟模式1
外部时钟模式1直接使用外部引脚输入信号作为计数时钟。
外部时钟模式1外部时钟同步采用简单的2级触发器结构,因此为了避免亚稳态,要求外部输入时钟宽度至少大于2个APBCLK
周期,如果不满足该条件,需要用外部时钟模式2。
从上图可以看到,需要对ATIM->CCMR1
、ATIM->CCER
、ATIM->SMCR
寄存器配置。
ATIM->CCMR1
寄存器的IC2F
定义如下图所示,用于配置输入捕捉的数字滤波。
(ATIM->CCMR1
寄存器在输出比较和输入捕捉配置下,寄存器的功能定义是不同的。在外部时钟模式1下,使用的是输入捕捉配置。)
ATIM->CCMR1
寄存器的CC2S
和IC2PSC
定义如下图所示,这里将CC2S
配置为01
。
ATIM->CCER1
寄存器的CC2P
和CC2E
定义如下图所示。在输出模式下,用于配置输出极性和输出使能;在输入模式下,用于配置边沿捕获和捕获使能,这里是输入模式。
ATIM->SMCR
寄存器的ETP
、ECE
和ETPS
定义如下图所示。
ATIM->SMCR
寄存器的TS
用于配置ATIM
同步计数器的触发源,需要配置TS
为110
。
ATIM->SMCR
寄存器的SMS
用于配置ATIM
的外部时钟模式1,需要配置SMS
为111
。
以上寄存器介绍就完成了,手册给出了配置寄存器的顺序和时序图。
2.2.3 外部时钟模式2
外部时钟模式2使用ATIM_ETR
管脚输入信号的上升沿或下降沿(不支持双沿)来计数。
外部时钟模式2与外部时钟模式1的主要差别是,ETR
输入直接被分频后再进行滤波,产生CK_PSC
时钟,这意味着可以支持ETR
输入频率高于APBCLK
的应用场景,这种情况下,需要首先对ETR
输入进行预分频,再用于驱动计数器。
ATIM->SMCR
寄存器的ETP
、ECE
、ETPS
、ETF
定义如下图所示。
以上寄存器介绍就完成了,手册给出了配置寄存器的顺序和时序图。
2.2.4 内部触发模式
ATIM支持4个内部触发输入,可用于计数触发或者内部信号捕捉。
当用于内部信号(TRC
)捕捉时,需要将ATIM->SMCR
寄存器的TS
配置为000
、001
、010
、011
,用于选择ITR0
,ITR1
,ITR2
,ITR3
;
并将ATIM->CCMR1
或ATIM->CCMR2
的CCxS
(x=1,2,3,4,即选择4个ATIM通道之一用作捕捉TRC
信号)配置为11
,即将TRC
选为捕捉信号。
ATIM->SMCR
寄存器的TS
定义如下:
ATIM->CCMR1
的CC1S
定义如下:
2.3 ATIM复位
如果需要对ATIM
复位,则需要在RCC
中配置RCC->APBRSTCR2
寄存器,先写1
复位,再写0
取消复位。
3 基础功能描述
3.1 从机模式
和手册顺序不同,这里先说ATIM
的从机模式,因为后面一些基础功能实现需要用到从机模式。
ATIM
从机模式的配置在ATIM->SMCR
寄存器中的SMS
,可以配置为三种工作模式:复位模式(100)、门控模式(101)和触发模式(110)。
3.1.1 复位模式
此模式下,外部输入的事件将导致TIM内部所有preload寄存器重新初始化, CNT回到0开始计数。
以下图为例,计数器正常计数,外部TI1输入上升沿时,触发计数器清零,重新开始计数。
注:
TI1
—外部输入信号;UG
—软件UPDATE事件标志;CEN
—使能;Timer clock
—计数时钟;
Atim_CNT
——计数值,对应ATIM->CNT
寄存器;TIF
—触发事件中断标志
上图对应的配置如下:
3.1.2 门控模式
门控模式下,计数器仅在输入信号为特定电平时工作。电平变换导致计数器开始或停止计数时,都会触发中断标志。
注:
TI1
—外部输入信号;CEN
—使能;Timer clock
—计数时钟;
Atim_CNT
——计数值,对应ATIM->CNT
寄存器;TIF
—触发事件中断标志
上图对应的配置如下:
3.1.3 触发模式
触发模式下,计数器在外部输入的某个事件到来后才开始计数。
注:
TI1
—外部输入信号;CEN
—使能;Timer clock
—计数时钟;
Atim_CNT
——计数值,对应ATIM->CNT
寄存器;TIF
—触发事件中断标志;
上图对应的配置如下:
3.1.4 外部事件触发的外部时钟计数模式(触发模式的一个应用)
可以将ETR
设置为计数时钟,同时使用另一个外部输入作为计数器启动触发信号。比如在检测到TI1
的上升沿之后,计数器开始以ATIM_ETR
引脚输入的上升沿计数。
注:
TI1
—外部输入信号;CEN
—使能;ETR
—ATIM_ETR
引脚输入的时钟信号;Timer clock
—计数时钟;
Atim_CNT
——计数值,对应ATIM->CNT
寄存器;TIF
—触发事件中断标志
上图对应的配置如下:
3.2 输入捕捉模式
以通道1为例,输入/比较通道的示意图如下:
捕捉/比较通道的主电路示意图如下(供参考,不需了解):
手册提供了如下两个应用示例:
3.2.1 输入捕捉示例:ATIM_CH1上升沿捕获
这个应用示例用于获取ATIM_CH1
数字信号两个上升沿之间的时间间隔,结果将保存到ATIM->CCR1
寄存器。
注:
ATIM->CCR1
寄存器保存的是时钟数,要转换单位为ms:
两个上升沿时间间隔(ms) =ATIM->CCR1
/ATIM
工作时钟(MHz)
3.2.2 输入捕捉示例:PWM占空比计算
这个示例用于获取一个PWM信号的占空比。
需要将PWM信号接入ATIM_CH1
通道的外部引脚(TI1输入),通过内部配置将PWM信号输入到ATIM的CH1和CH2通道,一个通道捕获上升沿,另一个通道捕获下降沿。
这里用到了ATIM
从机模式的复位模式,选择IC1
信号(即PWM的上升沿)为TRGI
信号。在复位模式下,TRGI
信号会初始化计数器(即ATIM->CNT
),并触发UPDATE
事件。
注:
Timer clock
—计数时钟;Atim_CNT
——计数值,对应ATIM->CNT
寄存器;TI1
—外部输入信号;
ATIM_CCR1
—IC1
的捕获值,对应ATIM->CCR1
寄存器;
ATIM_CCR2
—IC2
的捕获值,对应ATIM->CCR2
寄存器
具体的寄存器配置步骤如下:
3.3 输出比较模式
3.3.1 比较通道CH1—CH3
ATIM->CCMR1
捕捉/比较模式寄存器1,通道1相关配置定义如下:
ATIM->CCER
捕捉/比较使能寄存器CC1E
、CC1P
、CC1NE
、CC1NP
定义如下:
ATIM->BDTR
刹车和死区控制寄存器的DTG
定义如下:
ATIM->CR2
控制寄存器2的OIS1
和OIS1N
定义如下:
3.3.2 比较通道CH4
捕捉/比较通道4不支持死区插入、互补输出等功能。
3.4 PWM输出模式
3.5 编码器接口模式
编码器接口模式涉及到两个外部输入信号, ATIM根据其中一个信号的边沿相对于另一个信号的电平来决定递增还是递减计数值。
下表是计数方式与两路输入信号之间的关系:
4 附加功能描述
4.1 自动重装载
自动重装载(Preload),其实就是在改写一些寄存器时,ATIM
不会立刻应用这些值,而是等待下一次Update
事件的时候,再加载这些值。
因此,自动重装载至少需要两组物理实体:
- Shadow register:影子寄存器,存储定时器实际使用的值。
- Preload register:预装载寄存器,供软件访问,临时存储软件修改的值。
使能自动重装载功能:软件在修改预装载寄存器时,不会立刻更新到影子寄存器中,而是当Update事件发生的时候再更新。
没有使能自动重装载功能:软件在修改预装载寄存器时,会立刻更新到影子寄存器中。
ATIM->ARR
、ATIM->RCR
、ATIM->PSC
、ATIM->CCR
、ATIM->CCER
的CCxE
和CCxNE
(x=1,2,3,4)、ATIM->CCMR1
和ATIM->CCMR2
的OCxM
(x=1,2,3,4)是支持预装载功能的。
预装载功能在ATIM->CR1
寄存器中配置。
4.2 软件Force输出
在比较输出模式下,软件可以直接将OCxREF
force成特定电平,而独立于CCR
和计数器的比较结果。
软件通过写OCxM
=101,可以直接将OCxREF
强制为有效(OCxREF固定为高有效),通过写OCxM
=100可以直接将OCxREF
强制为无效(低电平)。以下是ATIM->CCMR1
寄存器OC1M
的定义:
但是软件force操作不会取消比较过程,CCR和计数器的比较还会一直进行。
4.3 互补输出和死区插入
4.3.1 互补输出
互补输出通过控制两个相位相反的信号(如上桥臂和下桥臂的驱动信号),确保同一时刻只有一个开关管导通,避免直通短路。这种设计可降低开关损耗,提升能量转换效率,尤其适用于高频开关场景。
ATIM->CCER
捕捉/比较使能寄存器CC1E
、CC1P
、CC1NE
、CC1NP
定义如下:
4.3.2 死区插入
死区时间是在互补信号切换时插入的一段短暂延迟,确保上桥臂和下桥臂的开关管不会同时导通。这避免了因开关速度差异或信号延迟导致的直通短路,保护开关管免受过流损坏。
手册上提供了死区插入的三种情况,如下图右侧所示(左侧是没有死区插入的波形)
其中,OCxREF
是输出基准信号,OCx
是P端引脚的输出信号,OCxN
是N端引脚的输出信号。
手册写明:输出信号OCx
与参考信号OCxREF
同相, OCxN
与参考信号反相;OCx
的上升沿是OCxREF
上升沿的delay, OCxN
的上升沿是OCxREF
下降沿的delay。
从上图的三个例子来理解这句话:
例1: delay的时长 < OCxREF
的低电平脉宽,delay的时长 < OCxREF
的高电平脉宽
OCx
的上升沿相对于OCxREF
的上升沿延迟delay;
OCxN
的上升沿相对于OCxREF
的下降沿延迟delay。
例2: delay的时长 > OCxREF
的低电平脉宽,delay的时长 < OCxREF
的高电平脉宽
OCx
的上升沿相对于OCxREF
的上升沿延迟delay;
OCxN
的上升沿相对于OCxREF
的下降沿延迟delay,但由于这时候OCxN
已经应该是低电平了,所以OCxN
不会有任何高电平输出。
例3: delay的时长 < OCxREF
的低电平脉宽,delay的时长 > OCxREF
的高电平脉宽
OCx
的上升沿相对于OCxREF
的上升沿延迟delay,但由于这时候OCx
已经应该是低电平了,所以OCx
不会有任何高电平输出。
OCxN
的上升沿相对于OCxREF
的下降沿延迟delay。
死区时间可以通过ATIM->BDTR
寄存器的DTG
设置:
4.4 刹车功能
4.5 6-step PWM输出
六步换相通过控制电机三相绕组的通电顺序,产生旋转磁场,驱动转子持续旋转。每一步切换两个绕组的电流方向,保持一个绕组不通电,形成六步循环,对应电机转子每旋转一圈的六个关键位置。
(手册已经很详细了,且没有更深的理解,因此不进一步描述了)
当某个通道使用互补输出时,OCxM
,CCxE
,CCxNE
寄存器支持preload功能,preload寄存器的值在换相(COM)事件发生时被装载到shadow寄存器中。用户因此可以预先设置下一步配置,并在COM事件发生时同步更新所有通道。
COM事件可以由软件写ATIM->EGR
中的COM位触发,或者由TRGI
上升沿硬件触发。当COM事件发生时,换相标志寄存器置位,并且可以产生中断或DMA
请求。
4.6 单脉冲输出
(手册已经很详细了,且没有更深的理解,因此不进一步描述了)
单脉冲输出是比较输出模式的特殊情况,允许用户在某个事件发生后,经过可编程的延迟,输出一个可编程宽度的脉冲信号。
与其他输出模式不同的是,在下一次update event到来时,计数器会自动停止。只有当CCR
和计数器初值不同时,脉冲才有可能正确输出。在向上计数时,要求NT
<CCR
<=ARR
,在向下计数时,要求CNT
>CCR
。
上图是以TI2
输入为计数器触发信号,计数值等于CCR
后OCxREF
输出低电平,计数到ARR
后OCxREF
回到高电平,并且计数器回滚到0,停止计数。
4.7 外部事件清除OCxREF
OCxREF
的有效状态为高电平,通过对外部ETR
引脚施加高电平,可以直接拉低OCxREF
,直到下一次update event。此功能仅在输出比较和PWM模式下有效。使能此功能需要将OCxCE
置1。
ATIM->CCMR1
的OC1CE
定义如下:
4.8 输入异或功能
通道1~3的输入信号可以被异或起来之后,接入到通道1的滤波和边沿电路输入,用于通道1的输入捕捉或者触发。
ATIM->CR2
寄存器的TI1S
用于选择通道1的输入是否来自于三个通道输入的异或。
4.9 Debug模式
DBG->CR
寄存器可以控制在Debug模式下,ATIM
的工作状态。
5 应用Tips
5.1 调试记录:P端和N端的极性?
高级定时器有多个通道,每个通道都有P端和N端。通过配置寄存器,可以分别控制使能和极性。
比如可以将通道3的P端和N端配置为完全相同的PWM输出,也可以配置为互补的PWM输出。
但在我调试中发现:如果一个通道只使能P端,另一个通道只使能N端时,在不配置极性的情况下,他们的输出是完全相同的(而非希望的互补输出)
解决该问题有两种可参考的方法:
(1)将开启N端的那个通道的P端也使能。
(2)配置开启N端那个通道的输出极性。