参考:官方文档《stm32f4xx参考手册.pdf》
级联功能,可以把两个定时器的功能关联起来,具体有以下几种:
本文只讲其中一个功能,定时器1给定时器2当分频器。这种功能可以把两个32位定时器,合并为为一个64位定时器,可以把2个16位定时器合并为一个32位定时器、甚至可以把4个16位定时器合并为一个64位定时器。这可以增加计时长度。虽然用定时中断+软件加法计数,也可实现任意时长计时,但是太耗CPU了,既然STM32硬件具备这种硬件级联功能,我们就要用起来。
定时器的输入脉冲默认来自于系统时钟总线APB1/APB2,
根据上图,我们发现,TIM1可以输出一个脉冲(时钟)信号TRGO,这个信号被连接到STM32 内部的一根信号线上,这根信号线叫ITR0(STM32内部共有4根这样的信号线,你也可以理解为4个没有被引出的引脚插针)。
TRGO是一个事件输出信号,只有TIM被设置为主模式时,才能使用。参见下文CR2寄存器的MMS位域。
级联功能,并不是任意两个TIM都能随意连接的,而是被固定死的,如以下3个表所示。
以表72的第一个单元格为例,意思是:TIM5的输出信号TRGO可以连接到TIM1的ITR0上,作为TIM1的时钟输入。这样如果我们让TIM5每1ms发出一次TRGO脉冲,那么TIM1的计数寄存器每过1ms就+1。
下面看一下CR2寄存器的MMS位段:
根据上图可见,每个定时器的时钟输入可以来自内部信号(ITR0/1/2/3)、也可以来自时钟总线RCC的TIMxCLK、也可以来自外部引脚输入ETR等等,每个定时器有一个内部输出信号TRGO。
在芯片内部,某些定时器的输出信号TRGO可以连接到另一个定时器的内部输入信号上。这样就实现了定时器级联。
定时器基本初始化代码就不贴了,只贴级联相关代码,TIM3做主机,TIM2做从机为例。
首先查询前面表格得知:TIM3做主机,TIM2做从机时,TIM2必须要从自己的ITR2信号线上获得时钟输入。
从定时器部分:
//设置SMCR寄存器的SMS位域,TIM_SlaveMode_External1=上图SMS中的111
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_External1);
//TIM3设置成了主模式,根据手册表76,TIM2作为从机,输入信号只能来自ITR2
TIM_SelectInputTrigger(TIM2, TIM_TS_ITR2);
//主定时器部分
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);//TIM3设置为主模式
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);//设置TGRO信号的触发时机为:当定时器溢出(update)时
以上代码的效果是,当TIM3溢出时(无需设置溢出中断),就会发出TRGO脉冲到TIM2的ITR2信号线上,TIM2每收到一个脉冲,并分频后,CNT计数寄存器就+1。
注意:TIM2的分频寄存器PSC,是对ITR2的分频,不再是系统APB的TIM时钟。