复旦微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 概述

    (我觉得FM33LC0ATIMSTM32F407TIM1可能是一个IP,因为寄存器基本都是一样的)

    2 基本描述

    2.1 ATIM工作时钟

    在使用ATIM之前,必须在RCC中配置RCC->OPCCR1寄存器的ATCKEATCKS,以使能ATIM工作时钟,并配置工作时钟源。

    2.2 ATIM计数源

    ATIM有四个计数源:内部时钟、外部时钟1、外部时钟2、内部触发。

    注意:DataSheet上仍将该部分命名为工作时钟,我认为这不恰当。因为这里的“ATIM计数源”指的是定时器的计数值,无论是否使用ATIM的工作时钟作为计数源,都必须使能工作时钟。因此本文使用计数源这个名词代替。

    2.2.1 内部时钟模式

    ATIM默认使用的就是内部时钟模式,不需要特别配置寄存器。

    如前文所述,ATIM的工作时钟可以来源于APBCLK2USBPLL的2倍频。
    在该模式下,ATIM的工作时钟经过分频后作为计数源。

    分频值可以在ATIM->PSC寄存器配置。

    2.2.2 外部时钟模式1

    外部时钟模式1直接使用外部引脚输入信号作为计数时钟。

    外部时钟模式1外部时钟同步采用简单的2级触发器结构,因此为了避免亚稳态,要求外部输入时钟宽度至少大于2APBCLK周期,如果不满足该条件,需要用外部时钟模式2

    从上图可以看到,需要对ATIM->CCMR1ATIM->CCERATIM->SMCR寄存器配置。

    ATIM->CCMR1寄存器的IC2F定义如下图所示,用于配置输入捕捉的数字滤波
    ATIM->CCMR1寄存器在输出比较和输入捕捉配置下,寄存器的功能定义是不同的。在外部时钟模式1下,使用的是输入捕捉配置。)

    ATIM->CCMR1寄存器的CC2SIC2PSC定义如下图所示,这里将CC2S配置为01

    ATIM->CCER1寄存器的CC2PCC2E定义如下图所示。在输出模式下,用于配置输出极性和输出使能;在输入模式下,用于配置边沿捕获和捕获使能,这里是输入模式。

    ATIM->SMCR寄存器的ETPECEETPS定义如下图所示。

    ATIM->SMCR寄存器的TS用于配置ATIM同步计数器的触发源,需要配置TS110

    ATIM->SMCR寄存器的SMS用于配置ATIM外部时钟模式1,需要配置SMS111

    以上寄存器介绍就完成了,手册给出了配置寄存器的顺序和时序图。

    2.2.3 外部时钟模式2

    外部时钟模式2使用ATIM_ETR管脚输入信号的上升沿或下降沿(不支持双沿)来计数。

    外部时钟模式2外部时钟模式1的主要差别是,ETR输入直接被分频后再进行滤波,产生CK_PSC时钟,这意味着可以支持ETR输入频率高于APBCLK的应用场景,这种情况下,需要首先对ETR输入进行预分频,再用于驱动计数器。

    ATIM->SMCR寄存器的ETPECEETPSETF定义如下图所示。

    以上寄存器介绍就完成了,手册给出了配置寄存器的顺序和时序图。

    2.2.4 内部触发模式

    ATIM支持4个内部触发输入,可用于计数触发或者内部信号捕捉。

    当用于内部信号(TRC)捕捉时,需要将ATIM->SMCR寄存器的TS配置为000001010011,用于选择ITR0ITR1ITR2ITR3
    并将ATIM->CCMR1ATIM->CCMR2CCxS(x=1,2,3,4,即选择4个ATIM通道之一用作捕捉TRC信号)配置为11,即将TRC选为捕捉信号。

    ATIM->SMCR寄存器的TS定义如下:

    ATIM->CCMR1CC1S定义如下:

    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—使能; ETRATIM_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_CCR1IC1的捕获值,对应ATIM->CCR1寄存器;
    ATIM_CCR2IC2的捕获值,对应ATIM->CCR2寄存器

    具体的寄存器配置步骤如下:

    3.3 输出比较模式

    3.3.1 比较通道CH1—CH3


    ATIM->CCMR1 捕捉/比较模式寄存器1,通道1相关配置定义如下:

    ATIM->CCER捕捉/比较使能寄存器CC1ECC1PCC1NECC1NP定义如下:

    ATIM->BDTR刹车和死区控制寄存器的DTG定义如下:

    ATIM->CR2控制寄存器2的OIS1OIS1N定义如下:

    3.3.2 比较通道CH4

    捕捉/比较通道4不支持死区插入、互补输出等功能。

    3.4 PWM输出模式

    3.5 编码器接口模式

    编码器接口模式涉及到两个外部输入信号, ATIM根据其中一个信号的边沿相对于另一个信号的电平来决定递增还是递减计数值。

    下表是计数方式与两路输入信号之间的关系:

    4 附加功能描述

    4.1 自动重装载

    自动重装载(Preload),其实就是在改写一些寄存器时,ATIM不会立刻应用这些值,而是等待下一次Update事件的时候,再加载这些值。

    因此,自动重装载至少需要两组物理实体:

  • Shadow register:影子寄存器,存储定时器实际使用的值。
  • Preload register:预装载寄存器,供软件访问,临时存储软件修改的值。
  • 使能自动重装载功能:软件在修改预装载寄存器时,不会立刻更新到影子寄存器中,而是当Update事件发生的时候再更新。
    没有使能自动重装载功能:软件在修改预装载寄存器时,会立刻更新到影子寄存器中。

    ATIM->ARRATIM->RCRATIM->PSCATIM->CCRATIM->CCERCCxECCxNE(x=1,2,3,4)、ATIM->CCMR1ATIM->CCMR2OCxM(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捕捉/比较使能寄存器CC1ECC1PCC1NECC1NP定义如下:

    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输出

    六步换相通过控制电机三相绕组的通电顺序,产生旋转磁场,驱动转子持续旋转。每一步切换两个绕组的电流方向,保持一个绕组不通电,形成六步循环,对应电机转子每旋转一圈的六个关键位置。

    (手册已经很详细了,且没有更深的理解,因此不进一步描述了)

    当某个通道使用互补输出时,OCxMCCxECCxNE寄存器支持preload功能,preload寄存器的值在换相(COM)事件发生时被装载到shadow寄存器中。用户因此可以预先设置下一步配置,并在COM事件发生时同步更新所有通道。

    COM事件可以由软件写ATIM->EGR中的COM位触发,或者由TRGI上升沿硬件触发。当COM事件发生时,换相标志寄存器置位,并且可以产生中断或DMA请求。

    4.6 单脉冲输出

    (手册已经很详细了,且没有更深的理解,因此不进一步描述了)

    单脉冲输出是比较输出模式的特殊情况,允许用户在某个事件发生后,经过可编程的延迟,输出一个可编程宽度的脉冲信号。

    与其他输出模式不同的是,在下一次update event到来时,计数器会自动停止。只有当CCR和计数器初值不同时,脉冲才有可能正确输出。在向上计数时,要求NT<CCR<=ARR,在向下计数时,要求CNT>CCR


    上图是以TI2输入为计数器触发信号,计数值等于CCROCxREF输出低电平,计数到ARROCxREF回到高电平,并且计数器回滚到0,停止计数。


    4.7 外部事件清除OCxREF

    OCxREF的有效状态为高电平,通过对外部ETR引脚施加高电平,可以直接拉低OCxREF,直到下一次update event。此功能仅在输出比较和PWM模式下有效。使能此功能需要将OCxCE置1。

    ATIM->CCMR1OC1CE定义如下:

    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端那个通道的输出极性。

    作者:冷凝雨

    物联沃分享整理
    物联沃-IOTWORD物联网 » 复旦微FM33 MCU高级定时器ATIM底层开发指南详解

    发表回复