定时器种类有基本定时器、通用定时器、高级控制定时器,以AT32F435xx举例,下表为各种类型定时器的功能总表。本文主要就定时器溢出中断进行基础讲解和案列解析。定时器溢出中断是定时器最基础功能,进入中断的时间周期可由相关寄存器配置。
其中,TMRxCLK虽然来源于APB1/2时钟,但下图时钟架构可以看出,档APB1/2 Divider存在非1除频时,TMRxCLK会有x2。例如AHB=240 MHz,APB1/2=120MHz,TMRxCLK的实际频率为240 MHz.以向上计数模式举例,TMREN bit使能后,TMRx_CVAL会开始进行累加1,直到其值等于TMRx_PR后,OVFIF位会置起并且定时器会触发溢出中断事件,(若溢出中断有开启,则会产生溢出中断),同时TMRx_CVAL会再次从0开始计数,周而复始。project\at_start_xxx\examples\tmr\timer_base- 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
- TMR1_OVF_TMR10_IRQHandler中断函数代码描述
定时器的输出部分由比较器和输出控制构成,用于编程输出信号的周期、占空比、极性。高级定时器的输出部分在不同通道上有所不同。高级定时器在通道1到通道3上拥有互补输出,且配备死区调节;通道1到通道4拥有刹车控制。通用定时器的输出部分没有上述功能,只配备了4个通道输出。基本定时器、通用定时器和高级定时器的具体功能差异可查看RM的TMR章节。
如下图为高级定时器通道1到3输出部分原理图:
PWM输出是定时器最常用的输出模式,分为PWM模式A和PWM模式B。其差异在于:
-OWCDIR=0,若TMRx_C1DT>TMRx_CVAL时设置C1ORAW为高,否则为低;-OWCDIR=1,若TMRx_C1DT<TMRx_CVAL时设置C1ORAW为低,否则为高。-OWCDIR=0,若TMRx_C1DT>TMRx_CVAL时设置C1ORAW为低,否则为高;-OWCDIR=1,若TMRx_C1DT<TMRx_CVAL时设置C1ORAW为高,否则为低。project\at_start_xxx\examples\tmr\7_pwm_output- 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
图中通道1到4输出频率相同但占空比不同的波形,互补通道通过输出极性的调节与其对应的通道输出相同的波形。定时器的输入部分由专门的捕获电路实现,可用于对输入信号的滤波、选择、分频和输入捕获功能;通过对捕获值的计算,可得到输入波形的频率和占空比。如下图为输入部分原理图:
输入模式下,当选中的触发信号被检测到时,通道寄存器(TMRx_CxDT)会记录当前计数器计数值,并将捕获比较中断标志位(CxIF)置1,若已使能通道中断(CxIEN)、通道DMA请求(CxDEN)则产生相应的中断和DMA请求。若在CxIF已置1后检测到选中的触发信号,则将CxOF位置1。
另外,还提供了更加高效的PWM波输入捕获功能,可以更方便的计算出输入波形的频率和占空比。此模式的通过内部两个CxDT寄存器实现,输入波形通过定时器的通道1或者通道2输入即可。将定时器配置成PWM输入模式后,可通过C1DT和C2DT的值计算出对应PWM波形的频率和占空比:
project\at_start_xxx\examples\tmr\pwm_input- 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
- 将串口1连接到上位机,然后通过上位机串口工具即可看到打印信息。
通过对外部信号的上升沿或者下降沿进行捕获可以实现对外部信号输入捕获并计算频率的功能。本例程实现了对外部信号进行捕获并通过串口打印出频率。
project\at_start_xxx\examples\tmr\input_capture- 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
- 将串口1连接到上位机,然后通过上位机串口工具即可看到打印信息。
定时器拥有强大的DMA传输能力,基本每个定时器都支持DMA请求的产生。这使得应用更加灵活。本实验将src_buffer[0]、src_buffer[1]和src_buffer[2]数据通过DMA传输到TMR的TMRx_C3DT寄存器。实现了每个周期占空比都发生改变,且占空比在src_buffer[0]、src_buffer[1]和src_buffer[2]的值之间进行有序的切换。
project\at_start_xxx\examples\tmr\dma- 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
高级定时器和通用定时器除了支持常规的DMA传输功能,还额外支持DMA burst传输功能。在配置为burst传输后,当TMR产生一个DMA请求可连续传输以TMR地址为起始地址的多笔数据;传输数据的起始地址和数据量可通过软件配置。如何配置burst传输:
1. 配置TMRx_DMACTRL寄存器,此寄存器的bit0到bit4为DMA传输地址偏移,此值决定了DMA传输的起始地址;bit8到bit12为DMA传输长度配置,此值决定了DMA传输的数据笔数。2. 配置DMA通道,此配置流程与常规DMA通道配置相同;需要注意的是DMA通道的源与目标地址寄存器中的一个必须为TMRx_DMADT寄存器地址;具体是源还是目标就由数据传输的方向决定。本实验将src_buffer[0]和src_buffer[2]数据通过burst传输到TMR的TMRx_PR和TMRx_C1DT寄存器。
project\at_start_xxx\examples\tmr\dma_burst- 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
单脉冲输出模式是PWM模式的特例,将OCMEN位置1可开启单周期模式,此模式下,仅在当前计数周期中进行比较匹配,完成当前计数后,TMREN位清0,因此仅输出一个脉冲。当配置为向上计数模式时,需要严格配置CVAL<CxDT≤PR;向下计数时,需严格配置CVAL>CxDT。当TMR受到外部触发或者软件使能CNT时,TMR开始计数并在此次overflow事件时停止计数。此过程中输出也会根据配置产生波形。
单脉冲输出原理如下图:
图中当受到外部触发后,TMR开始计数,当CVAL等于CxDT时,改变输出状态,当CVAL溢出时,输出状态再次改变从而达到输出一个单脉冲的目的。
本实验将TMR4配置为单脉冲模式。TMR4的通道1配置为输入并充当触发输入的源头,通道2配置为输出模式,充当单脉冲输出的端口。
project\at_start_xxx\examples\tmr\one_cycle- 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
使用逻辑分析仪打出波形如下:
部分定时器可支持扩展为32位定时器(具体请查看RM)。扩展后,不单CVAL寄存器为32位,DIV和CxDT都会自动扩展为32位。使能32位定时器只需要设置TMRx_CTRL1寄存器的bit10为1即可。
本实验将TMR2配置为32位定时器模式,然后配置为PWM输出模式使其输出PWM波形。
project\at_start_xxx\examples\tmr\tmr2_32bit- 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
主次定时器之间可由内部连接信号进行同步。主定时器可由PTOS[2:0]位选择主定时器输出,即同步信息;次定时器由SMSEL[2:0]位选择从模式,即次定时器的工作模式。复位模式:
此模式下,当次定时器收到一个同步信号后,次定时器复位计数器和预分频器,定时器的 CVAL寄存器变为0重新开始计数。若OVFS位为0,将产生一个溢出事件。挂起模式:
挂起模式下,计数的计数和刹车受选中触发输入信号控制,当触发输入为高电平时计数器开始计数;当为低电平时,计数器暂停计数。触发模式:
触发模式下,次定时器当受到外部触发信号后,自动启动定时器,即硬件置TMR_EN为1。所以在触发模式下,初始化定时器后软件不需要使能定时器。本例程实现了TMR2同步TMR3和TMR4。主定时器TMR2选择溢出事件作为同步信号输出,次定时器TMR3和TMR4选择挂起模式作为从模式。project\at_start_xxx\examples\tmr\parallel_synchro- 配置定时器TMRx_DIV寄存器和TMRx_PR寄存器
- 通过PA6/PA0/PB6输出波形,可使用逻辑分析仪抓取波形查看。