STM32高级定时器的使用

       写这篇文章的原因是发现net上很少有从STM32的寄存器的角度去解析其原理的文章,也许是太简单的缘故各位大哥都不愿意动笔。那么我来写下,尽量写得简单易懂,以此留个纪念。写得肯定不好或者有的地方不准确,请不要喷哈。

         STM32中定时器的强大之处在于,你不但可以清纯的像C51那样只用内部时钟和外部引脚来进行定时或计数,更可以通过其自身所具备的主从模式,捕获/比较通道来进行更复杂的一些operation。比如将其内部的多个定时器进行级联,捕获或产生PWM波,使用刹车死区功能,记录编码器的数值等。其中有的功能C51可以通过其IO引脚进行模拟,有的却是不能的。

    言归正传,结合较新的HAL库,现在我们一起就来探讨下STM32的寄存器吧。

    先说CR1寄存器,手册最开始就是CKD控制位:


    先贴张重要的图:


         这幅图非常重要,因为其中隐藏着太多重要的信息,从这张图里可以看到CK_INT是内部时钟,即是由单片机的时钟系统所提供的时钟。以该时钟为基准,根据该位的配置得到tDTS,这个时钟的作用是用于判断死区和采样的。这个用到的时候再写。

        接下来看下ARPE位:



        因为STM32的定时器中有一个影子寄存器的概念,ARR寄存器就有一个影子寄存器,另外两类有影子寄存器的是PSRCCRX,这个影子寄存器我们是无法直接操作的,最终对TIM产生效果的其实是这个影子寄存器,如果将该位配置为1,则我们更新ARR寄存器的值得时候我们不能直接更新影子寄存器,需等待更新事件后才能将预装载寄存器的值放入影子寄存器,如果配置为0,当我们更新ARR时,会使TIM的自动重载值立即生效。

          CMS位和DIR位配置:


        这个位配置手册说得清楚了,在hal库中该如何配置呢?






    这几个参数就是配置该位的。

    OPM位配置:


    手册给出了单脉冲模式的一个应用案例如图:


       该图是TIMPWM1模式下使用单脉冲模式的一个案例,单脉冲模式的应用不局限于此,所以不能被该图所局限。



       该位的配置比较简单,就是用来配置和使能哪些事件可以成为更新事件,更新事件产生后,如果使能了相应的中断会置起该中断的标志位,并且进入中断向量指向的中断程序,需要在该中断程序中清除该中断位。如果配置了相应的DMA,即可使用DMA模式将存储器的值写入写出TIM的各个寄存器,这个貌似没有什么用,DMA一般都用在具有传输通讯性质的外设中,如USARTUSB等。除此之外,更新事件还将各影子寄存器的值进行更新,将CNT重新开始计数。

       CEN位的配置:


       如果没有将SMS从模式选择位配置为门控模式和触发模式,该位就用于启动和停止定时器。若配置了门控模式和触发模式则根据其触发条件启动和停止定时器。

 

       TIMCR1寄存器就完了,接下来就是CR2寄存器,后面由于很多寄存器的配置都有一定的逻辑联系,所以不按照寄存器的顺序来写了,先说TI1S位的配置:






       指的就是这个东西,既然这里是个异或门,则将其配置为1后,TI1的输入信号由这三个通道的异或值获得。

       MMS位的配置:



       上面应该是[2:0]不是[1:0]哈,这个位的配置挺关键的,是主从模式中主TIM的所需要配置的东西,这8个配置说白的就是谁去给TRGO信号,复位模式是UG位给,使能模式是CEN位给,更新模式是更新事件给,比较脉冲模式是CNTCCRX比较发生匹配的时候给,其他几个模式就是四个输出通道的参考电平。这个TRGO信号输出后若其他TIM配置为从模式,可将该信号用于从TIM的计数时钟和触发计数,相关的配置需参照SMS从模式选择位的配置。那么看下SMS的配置:



       不想使用从模式直接将其配置为禁止从模式就可以,这是TIM的计数只靠内部时钟,触发靠CEN。编码器的这个模式还是比较有用的,因为编码器有ABZ三项,将AB项接到TIMTI1TI2通道,然后通过配置CC1SCC2S位将IC1映射到TI1上,将IC2映射到TI2上,再配置CC1PCC2P位选择输入极性不反向,这样进入从模式控制器的电平就和编码器产生的电平一样了,最后根据编码器输出的电平特性配置从模式为编码器模式,有3种配置模式如图:



       最后CEN置位开始进行计数,这里的编码器都是指的是相对编码器。

       复位模式比较好理解,就是TRGI出现上升沿的时候,产生事件更新,TRGI的信号由TS位配置产生,如果说复位模式下的TRGI负责产生更新事件,那么门控模式和触发模式则负责产生启停定时器,外部时钟模式1模式则赋值定时器的计数,他们的信号均是TS为配置产生的,TS位的配置如图:




       这里后面几个配置都可以从可以从总系统图上看到,ITR0ITR1ITR2ITR3这几个配置的输入则要参考下表:



       这里由于是TIM1TIM8的内容,所以只有这两个TIM作为从定时器时,相应的ITRX所接入的TIMXTRGO,比如说在TIM1TS位选择配置000,则TIM5TRGO端口接到TIM1TRGI端口,TRGO又是通过上面说的MMS位配置所决定的。

 

    主从模式说完TIM的另一个重要的内容就是输入输出通道的应用,这得先从CCMR1CCMR2寄存器说起。

       CCMR1寄存器和CCMR2寄存器是类似的,只不过一个是TIM1,2通道的配置,另一个是3,4通道的配置,如图:




       很显然,低8位是配置通道1的,高8位是配置通道配置通道2的,以通道1为例子来说明,首先是CC1S位的配置:

       该位指示了通道1到底是配置成输入还是输出,只能选择一种模式来进行配置,根据这个配置,该寄存器其他位的值的含义也是不相同的。




       好的,我们假设先配置成输出模式,即CC1S位设置为00,那么其他位的配置均按照上面那一排的来弄。有哪些嘛,0C1CE,0C1M,0C1PE,0C1FE这几个,先说0C1M这个位的配置:





       别个手册第一句话就说了这些位定义了OC1OC1N的输出参考信号OC1REF的行为,对头哈,只是定义了OC1REF的动作,为撒子不直接定义OC10C1N的动作呢?因为这两个的是通道的实际电平的输出,它还取决于其他相关的控制,这里只要晓得0C1REF的电平就可以了,这个电平的定义是定死了的,就是有效状态为高电平,无效状态为低电平。再贴一张重要的图:




       通过这幅图我们看得出控制OC1REF的是0C1CEOC1M位。OC1M位可以配置为以上那8种模式,核心就是TIM的计数值CNTCCR值在不同关系下输出不同的0C1REF电平,后面的事是交给其他寄存器去控制的,可以说不同的行业应用对后面的那些寄存器的配置是不同的。还有一个就是OC1CE位的配置:




       配置了这个位后OC1REF的电平就要受到ETRF的影响了,这个ETRF是怎么来的呢?这个要从外部时钟模式2说起:




       由图看得出,这里面的控制都和SMCR寄存器有关,这个寄存器就是开始我们说过的从模式寄存器,哈哈哈,几个位的配置就一起说了:




       结合图很好理解,ETP位用于确定有效边沿,ETPS位用于分频外部触发的信号,ETF位是一个滤波器配置,我们最开始在CR1寄存器中配置的CKD位在这里就有用的,fDTS的频率就是取决于CKD位的配置的,fSAMPLING是什么意思呢?比如说配置为1000,即Fsampling=Fdts/8N=6,意思是每个外部脉冲的有效电平至少保持8tDTS的周期才算做有效的一个脉冲,当有6个这样的脉冲发生时,才算成一个有效的外部脉冲。ECE位则是使能外部时钟模式2的,当然,ETRF也可以接入外部时钟模式1,前提是从模式要配置成外部时钟模式1并且TS为要选择外部触发输入111

接下来继续说输出的事情,还有两个位的配置一个是OC1PE还有一个是OC1FE





       OC1PE就是CCR1预装载的配置位,前面说了影子寄存器的概念,这里是类似的。

OC1FE这个位的配置我不是很了解了,查了些资料也没有很好的答案,按其手册的意思是可以快速输出,反正使用PWM输出时将其配置为1是没还有问题的。

输出完了就说一下输入了,同样先贴一张图方便说明理解:



       不出所料先配置CC1S位,当这个位配置为输入模式时有三种选择,简而言之,01这种配置信号是从自己的通道TI1进来,10这种配置的信号是从相邻的2通道TI2进来,11这种配置是从从模式信号的TRC进来,TRC在哪里,系统大图上可以看清楚,当然进来的信号肯定是通过处理过的,这个处理的过程取决于其他几位的配置。这个寄存器中的IC1FIC1PSC就是干这个事情的:



       和ETR的输入配置一样,这个依样画葫芦就可以理解它了,这里还有一个位的配置也影响输入的有效电平,就是CC1PCC1NP这个就是我马上要说的东西了。

       这两个位的配置在当该通道被配置为输入或输出时依然具有不同的含义,我就以1通道作为例子,刚在说输入,就先说这两个位的输入配置,看图:



       由图可知,当通道配置为输入的时候,输入信号的有效电平和极性是由CCER寄存器中的CC1NPCC1P位联合配置决定的,NP在前,P在后,我在这里理解的是当TRGI所选择的输入为TI1FP1且从模式配置为复位,外部时钟1,触发模式的时候,配置成00时,该信号的上升沿使TRGI产生上升沿,配置成01时,该信号下降沿使TRGI产生上升沿,配置成11时,该信号的上升沿和下降沿均使TRGI产生上升沿。当从模式配置为门控或者编码器模式的时候,配置成00或者01只将信号起到一个正反相作用。

这个说完接下来说当通道1配置为输出的时候这两个位的作用:



       感觉手册对其说得模棱两可的,先看看输出那幅图吧,很明显,这两个位的配置只对输出信号起到一个非门的作用,也就是说当配置为1时将OC1REF信号进行逻辑非,我们知道OC1REF的有效电平是高电平,所以当配置为1的时候,当OC1REF有效时输出的是一个低电平,反之则是一个高电平。当然这还不是OC1OC1N输出的最后一道关口,最后一个控制其电平的是输出使能电路,说这个先介绍CCER寄存器的CC1ECC1NE位:



       很明显,这两个位就是使能输入或输出通道的,貌似很简单,但其真是有些玄机的哟。因为这两个位的含义还取决于其他的一些配置,首先就是MOE这个位的配置,在BDTR寄存器中:



       所以嘛,要想OCOCN正常输出这个位还必须要为1才得行哟,那么这个位位0的时候有什么效果呢,重点是两个输出通道将强制为空闲状态,什么是空闲状态,且看OSSROSSI的配置I就是idle的意思:



       先看OSSR位,这个位是在MOE=1即运行模式下有效的,当其配置为0时,当OC1REF为无效状态的时候,就将输出禁止了,相当于把CC1ECC1NE都清0,当OC1REF为有效状态时,并且CC1ECC1NE都使能的时,则根据CC1NPCC1P的配置该输出什么电平就输出什么电平。当其配置为1时,对输出时不影响的。再看OSSI,这个是MOE=0时配置生效的,用下面这个表去整体理解下



       这个要注意的是,当OC1EOC1NE均设置为使能状态下的时候,OC1输出的电平是OC1REF+极性,而OC1N输出的电平是OC1REF的互补相+极性。说了这么多关于输出的控制,STM32搞这么复杂就是为了应用于复杂的场合中,比如死区的应用:


       很典型的死区时序图,通过OCXOCXN的互补输出外加一个死区时间,如何配置互补输出前面已经说过了,那怎么配置这个死区时间呢?则通过DTG位来进行配置:



       看嘛,又用到tDTS了,又回到了开篇所讲的东西了,哎,写这么多也是总结下以前所学的知识,虽然比较简单,都是照葫芦画瓢,但是总归总结下还是有一定的好处的吧,本来还想结合HAL库一起写下的,子在川上日:逝者如斯夫,就算了吧。




  • 28
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lawrencetang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值