写这篇文章的原因是发现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库一起写下的,子在川上日:逝者如斯夫,就算了吧。
上一篇:STM32定时器(TIM)之通用定时器
下一篇:STM32外部中断及定时器编程示例
推荐阅读
史海拾趣
在追求经济效益的同时,Chemi-Con公司也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。此外,Chemi-Con还积极参与社会公益事业,为社会的和谐发展做出贡献。这种负责任的态度不仅赢得了社会各界的认可,也为公司的长远发展注入了正能量。
这五个故事展示了Chemi-Con公司在电子行业中的发展历程和取得的成就。通过技术创新、品质管理、市场拓展、多元化发展和社会责任等方面的努力,Chemi-Con逐渐在电子行业中崭露头角,成为了铝电解电容器领域的佼佼者。
随着品牌影响力的不断提升,EPT开始积极拓展OEM/ODM业务。公司凭借先进的生产技术和严格的质量管理体系,成功与多家国内外知名企业建立了合作关系。通过为客户提供定制化的产品和服务,EPT不仅实现了业务的快速增长,还为其积累了丰富的行业经验。
EPT公司在其发展历程中,始终重视与科研机构的合作。早年间,EPT与哈尔滨工业大学共同研发了一种新型电池材料,这种材料具有更高的能量密度和更长的循环寿命。通过双方的技术交流和深度合作,EPT成功将这种材料应用到其产品线中,极大地提升了产品的竞争力。这一合作不仅为EPT带来了技术上的突破,也为其在电子行业树立了良好的口碑。
在竞争激烈的电子行业中,Conflux始终保持对技术创新的追求。公司团队不断研发新的区块链应用场景,如供应链管理、物联网安全等。通过将这些技术应用于实际业务中,Conflux不仅提升了自身的竞争力,也推动了整个电子行业的进步。同时,公司还积极参与国际技术交流和合作,不断引进国际先进理念和技术,为公司的持续创新提供了有力支持。
近年来,全球经济形势复杂多变,Beckhoff也面临着诸多挑战。然而,公司始终坚持创新驱动的发展战略,不断研发新产品、新技术,以应对市场的不断变化。同时,公司也积极调整业务结构,优化供应链管理,降低运营成本,以应对经济下行的压力。在这样的背景下,Beckhoff依然保持着稳健的发展态势,为电子行业的持续进步做出了重要贡献。
这五个故事从不同角度展示了Beckhoff Automation GmbH公司在电子行业中的发展历程和成就。从创始与早期发展,到基于PC控制技术的创新,再到全球业务拓展和中国市场的发展,以及应对经济挑战与持续创新,Beckhoff始终保持着对技术创新的追求和对市场变化的敏锐洞察。这些故事不仅展现了公司的实力和成就,也体现了其在电子行业中的重要地位和影响。
物联网技术的快速发展为网络安全带来了新的挑战和机遇。Defender Security公司积极应对这一变化,加大了对物联网安全领域的投入。他们与多家物联网企业合作,共同研发了适用于物联网设备的安全防护方案。通过不断优化和升级产品,Defender Security成功帮助物联网企业解决了安全问题,同时也为自己带来了新的增长点。
提出了一种基于重复控制和电网电压前馈控制相结合的光伏并网发电系统。重复控制可以抑制周期性的负载扰动,改善稳态情况下的并网电流波形;同时,采用电网电压的前馈控制来抵消电网的影响,使系统近似成为一个简单的无源跟随系统。实验结果表明,控 ...… 查看全部问答∨ |
Wince5.0 下将camera由30万改为130万都需要改哪些地方?? 刚接到个任务,要将摄像头由之前的30万升级为130万,不知道具体要改哪些地方,请各位指点一下。 看了一下具体的源代码,有了初步的了解,但还有很多地方需要向大家请教: 1.照片大小的计算方法,假如现在所拍摄照片为640*480,RGB16模式,其大小是不是应 ...… 查看全部问答∨ |
一块片子,两个单片机串口通讯,一个发送数据,一个显示。 分别烧进代码,一切正常,数据能发送也能显示。 现在我再烧一次发送的代码进单片机(只烧发送代码),执行发送程序,那边接收显示的数据就不对了。 为什么?… 查看全部问答∨ |
如题. 不管是在软件上调试(奇校验),还是在硬件上,RB8总是零.比如我发9,RB8==0,发7也是0 请各位帮帮忙。谢谢 void STR_int(void) interrupt 4 using 2 { if(RI) { &nbs ...… 查看全部问答∨ |
GetAdaptersInfo 总是返回ERROR_NO_DATA 在vs2005上用GetAdaptersInfo获取本机IP和网卡MAC,总是返回ERROR_NO_DATA IP_ADAPTER_INFO * pAdptInfo = NULL; IP_ADAPTER_INFO * pNextAd = NULL; ULONG ...… 查看全部问答∨ |
|
此处的int.是什么意思?----1.8V int., 3.3V memory, 3.3V external I/O microprocessor with 16KB I-Cache/16KB D-Cache/MMU… 查看全部问答∨ |
发现一个 bug 赏黄金千两! http://www.tengyunjiawu.com 这是我用 C语言开发的网站! 用户登陆功能开始公开测试了,请各位管理员积极测试! 采用了 cookies 记录24小时功能 外加 base64加密算法! 测试用户: tengyunjiawu 测试密码: 888888 ...… 查看全部问答∨ |