历史上的今天
返回首页

历史上的今天

今天是:2024年08月31日(星期六)

2018年08月31日 | STM32高级定时器的使用

2018-08-31 来源:eefocus

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

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

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

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


    先贴张重要的图:



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

        接下来看下ARPE位:



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

          CMS位和DIR位配置:


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






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

    OPM位配置:


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


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



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

       CEN位的配置:


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

 

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






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

       MMS位的配置:



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



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



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

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




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




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

 

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

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





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

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





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






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




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





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




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




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

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





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

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

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



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



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

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



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

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



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



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



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



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



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


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



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


推荐阅读

史海拾趣

Holmes Co Inc公司的发展小趣事

面对突如其来的新冠疫情挑战,Holmes Electronics迅速调整策略,加速数字化转型。他们利用云计算、大数据和人工智能等先进技术,构建了高效的远程办公和智能制造体系。通过数字化转型,公司不仅有效保障了员工的安全健康和生产效率,还进一步提升了产品质量和客户满意度。此外,Holmes Electronics还积极开发防疫相关的电子产品,如智能体温检测设备和消毒机器人等,为抗击疫情贡献了自己的力量。

Able Systems公司的发展小趣事

Able Systems公司成立于1982年,初创时期面临着资金短缺、市场竞争激烈等诸多挑战。然而,公司凭借对微型打印机技术的深刻理解和独特见解,成功开发出了具有竞争力的产品。通过不懈的努力和持续的技术创新,Able Systems逐渐在市场中站稳了脚跟,并赢得了客户的信任。

Abbatron公司的发展小趣事

在电子行业的激烈竞争中,Abbatron公司以其创新的技术赢得了市场的认可。某年,公司研发团队成功开发出了一款新型的高效能芯片,这款芯片不仅性能卓越,而且功耗极低,引起了业界的广泛关注。通过这一技术突破,Abbatron公司在市场上占据了有利地位,并逐渐成为了行业内的佼佼者。

Gazelle Microcircuits Inc公司的发展小趣事
负电压的生成需要额外的电路和功耗,取消这些电压输出可以降低主板的整体功耗和发热量,提高能效。
Cermetek Microelectronics公司的发展小趣事

随着公司规模的扩大和业务的增长,Cermetek Microelectronics公司开始实施国际化战略。公司积极拓展海外市场,与多个国家和地区的客户建立了合作关系。同时,公司还在海外设立了研发中心和生产基地,以更好地服务全球客户。这种全球布局不仅提升了公司的国际竞争力,也为公司的长远发展奠定了坚实的基础。

GE公司的发展小趣事

在电子行业快速发展的背景下,Cermetek Microelectronics公司深知创新的重要性。公司不断加大对研发的投入,引进先进的研发设备和人才,持续推出具有创新性的微电子产品。这些新产品不仅具有更高的性能和更低的功耗,还更加符合市场需求,为公司带来了更多的商业机会。

问答坊 | AI 解惑

ADF7020远距离无线数传模块

1.微发射功率:最大17dbm(50mW)的发射功率。 2. 工作载频频率470-490MHz,无需申请频点。 3.专业工业级嵌入式设计,体积小(32.5×20×5mm)。 4.基于GFSK调制方式的高效前向纠错编码方式提高高抗干扰能力和低误码率。 5.传输距离远。在视距情 ...…

查看全部问答>

从哪开始学单片机与ARM7

公司现在有2个产品一个是ARM7的还有个是SyncMOS sm8958A的板子上还有个Atmel ATF1508AS,现在要我接手,我该从哪学起呢?我以前是做Windows下软件开发的会Java和C#,C也会,但很久没用了,重新上手的话,估计时间不长。还望各位解答,谢谢。…

查看全部问答>

关于CMUX的调试

各位大虾:     本人在调试SIMCOM_SIM500模块的CMUX时遇到了以下几个问题:         1.在模块启动后,通过发AT+CMUX=0 使模块启动多路用,此时模块回送 AT+CMUX=0  OK   根据SIMCOM多路复 ...…

查看全部问答>

什么时候转ARM,DSP比较好????

工作一年了,主要是编写单片机程序和VC的小运用程序。感觉单片机学得差不多了(也许是自我感觉良好而已),想学硬件电路设计,但是公司不许。在这个公司呆着也学不到什么东西了,想换换地方转去学ARM,DSP,硬件。但是又有很多东西不懂,担心是不是 ...…

查看全部问答>

TCPIP连接请求报文问题

我在EASYARM2200上集成TCPIP,在实时轮询时可以稳定的运行,可是我改成中断触发模式后,我的板向PC机发送连接请求,发现前句分钟PC应答的报文总是ACK,过了好几分钟才变成SYN+ACK,有没有哪位大侠了解的?…

查看全部问答>

求一段简单的串行通信接收程序(汇编)

是从串行调试助手发的, 只要接收就可以了。…

查看全部问答>

端口P1使用问题

我把P1端口的P1.7作为中断用,下降沿有效,并且检测到P1IFG置 0x80, 但是while(P1IFG&0X80)或while((P1IN&0X80)==0)就不能用,进入不了循环 换成while(!(P1IN&BIT0))就可以,,这是为什么…

查看全部问答>

关于149模拟IIC通信的怪问题,请牛人帮忙啊

我现在在调一个光传感器,它是IIC通信的,直接与单片机IO相连,没有其他硬件结构,我之前在51开发板上调通了,效果很好。现在转到149的板子上就一直出不来,我把具体情况说下哈,还请大牛把把脉啊。 一:51调通了,再加上除了传感器没有其他硬件结 ...…

查看全部问答>

分享一本射频书,非常不成

射频电路设计-理论与应用 其实射频不难,不信看看这本书,肯定你看懂。…

查看全部问答>