有些应用场合,我们需要使用多个定时器主从级联,然后让各个定时器同时启动并做同频同相的PWM波形输出。要完成这个功能,有时发现实现起来似乎并没有那么顺畅,这里基于STM32F1系列芯片做个配置示例。之所以选择STM32F1芯片主要是考虑到有部分人使用STM32F1芯片并基于标准库做开发,那么,我这里就Cube库和标准库给出两套相关主从配置的示例代码,供有需要的人参考。
在调试验证过程中我选择STM32F103 Nucleo板,主芯片为STM32F103RB.将片内定时器TIM1/TIM2/TIM3/TIM4四个定时器主从首尾相连,同时启动并要求四个定时器输出同频同相信号。
先查看STM32F1参考手册相关章节【这个环节是必不可少的】,各类定时器从模式控制寄存器描述部分往往有定时器内部触发连接表格。我们要看的是下面这个表格:
结合上面定时器内部触发连接表格,让四个定时器建立如下主从级联关系。
基本原理是这样的【实际上是结合上图看图说话】:
TIM1工作在主模式,TIM4工作在从模式,TIM2和TIM3处于双角色,既做主又做从。其中TIM2/TIM3/TIM4的从模式都配置在触发从模式,即Trigger Slave Mode.
TIM1的定时器使能操作作为触发输出[TRGO]触发TIM2并使能TIM2的计数器,同时TIM2的定时器使能操作又作为触发输出信号连接到TIM3,并触发TIM3的定时器启动。同样,TIM3的定时器使能信号又作为TIM4的触发信号,连接到TIM4的内部触发输入端,触发启动TIM4. 在所有定时器使用相同时钟源、相同时基参数配置的前提下,同时输出多路完美同频同相的PWM波形,像下面的样子。【我为了截图方便,图形来自于IDE的逻辑分析仪模拟效果】
这里的配置要点,就是软件只需使能TIM1的计数器,其它定时器的计数器靠触发信号启动并保持同步计数。这里只用到定时器的使能信号作为触发输出[TRGO]并连到下一级从模式定时器。当然可以作为触发输出的信号很多,读者可以进一步查看相关资料。
一、基于stm32F1标准库的跟定时器主从配置相关代码如下【关于时基配置和PWM输出配置这里就没放进来了。重点关注这几个定时器的主从配置】:
我们在添加用户应用代码时,要注意的一点就是TIM2/TIM3/TIM4的计数器不必、也不可手动启动,我们只需手动使能TIM1计数器的工作就好,并开启各ARR/CCR寄存器的预取功能。
二、上面是基于STM32F1标准库有关定时器主从配置的参考配置代码,如果是基于CubeMx配置工具来配置的话,参照下面配置操作后即可生成相关配置代码。【主从配置关注红色方框内的配置】
TIM1的相关主从配置:
TIM2的相关主从配置:
TIM3的相关主从配置:
TIM4的相关主从配置:
同样,在用户代码里只需开启TIM2/TIM3/TIM4的相关PWM输出功能,不要软件使能它们三个定时器的计数器。配置好TIM1的PWM输出功能后,只需软件使能TIM1的计数器,令其产生触发输出,让4个定时器同步计数并做PWM输出。
关于上面4个定时器实现同频同相输出的主从配置主要就这些内容,用户程序里只需使能第一个主定时器的计数器工作,其它定时器的工作全靠触发从模式触发启动。另外,在启动第一个主定时器的时候,其它从定时器一定都已经配置好了,也就是说要注意用户代码中的那几行代码的先后顺序。总之,保证一点,在启动定时器时所有定时器的初始化工作都要已经完成,不能启动后才去做初始化,不然会导致计数和输出不同步。
其实,即使使用CubeMx进行配置,也会面临各种从模式的选择问题,关于各种定时器从模式的特征和用法,以及定时器触发信号内容请自行查看手册或相关资料进一步阅读了解,带着问题去查看资料会更有效率些。