最近在用stm32计频率的题目,使用一个定时器外部时钟源计数,另一个定时器定时读出计数模式下中寄存器的数值的方式测频。但是如果设置1S定时测稍高(65536HZ)的频率就要用中断了,如果频率再高就会频繁进入中断导致结果的巨大误差。因此我想到STM32F1有定时器级联的功能,查阅网上的级联的资料,写的都不够简单直接,因此在这分享一下我摸索了两天的结果。
首先,要级联两个定时器,就一定会有一个主定时器(master)和一个从定时器(slave)。主定时器计数到65535让从定时器计数值加一。查阅手册得知主模式下定时器送到从定时器的同步信息(TGRO)有复位、使能、更新等等(定时器CR2寄存器位6:4即MMS位),这里我们使用更新模式。另外,STM32F103定时器的内部触发连接在手册中也能找到。
具体的设置语句如下:
TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//设置TIM2为主模式,等同 TIM2->SMCR |=0x0080;
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);//设置TIM2触发输出模式,这里为更新,等同 TIM2->CR2 |=0x0020;
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_External1);//设置TIM4为从模式,选定触发器的的上升沿更新触发器,等同 TIM4->SMCR|=0x0007;
//库中的解释是这样的 TIM_SlaveMode_External1: Rising edges of the selected trigger (TRGI) clock the counter.
TIM_SelectInputTrigger(TIM4, TIM_TS_ITR1);//选定触发器为ITR1,等同 TIM4->SMCR|=0x0010;
通过上面的四步设置就可以将两个16位定时器级联成32位定时器了,当然具体怎么使用还得看具体的情况。比如我使用了将主定时器设置为外部时钟源测频率(计数);将从定时器设定为捕获模式来测周期(两个上升沿之间的时间)。
如果我的理解有不对的地方还请各位大佬指正。
一周热门 更多>