基于stm32f103zet6的定时器的学习1(理论知识)
扫描二维码
随时随地手机看文章
之前就听到网友说定时器这部分比较复杂,难搞,实验室里有个同学也搞了一段时间,不过它属于哪种专研型的人!学着学者,我也来到了定时器这章。
在网上查看了一下,也翻阅了一些书籍,高级定时器,通用定时器,普通定时器这三种就从通用的开始学吧!
一、首先还是将定时器框图分解一下吧,那么令人窒息的框图着实让人恐怖!虽然窒息,但是还是有必要贴上去!
对上面框图中的寄存器名字解释如下
TIMx_ETR:TIMER外部触发引脚ETR:外部触发输入ETRP:分频后的外部触发输入ETRF:滤波后的外部触发输入
ITRx:内部触发x(由另外的定时器触发)TI1F_ED:TI1的边沿检测器。TI1FP1/2:滤波后定时器1/2的输入TRGI:触发输入
TRGO:触发输出 CK_PSC:应该叫分频器时钟输入CK_CNT:定时器时钟。(定时周期的计算就靠它)
TIMx_CHx:TIMER的输入脚 TIx:应该叫做定时器输入信号xICx:输入比较xICxPS:分频后的ICx
OCx:输出捕获xOCxREF:输出参考信号
1、通用定时器的主要部分是一个【16位计数器】和与其相关的【自动装载寄存器】。
可以实现三种计数方式:
a、【增计数】
b、【减计数】
c、【同时进行增减计数】(注意理解这里的同时,从同时非彼同时)
datasheet上关于计数模式的解释如下!
在向上计数模式中,计数器从0 计数到自动加载值(TIMx_ARR计数器的内容) ,然后重新从0 开始
计数并且产生一个计数器溢出事件。
在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动
装入的值重新开始并且产生一个计数器向下溢出事件。
在中央对齐模式,计数器从0 开始计数到自动加载的值(TIMx_ARR寄存器)?1 ,产生一个计数器
溢出事件,然后向下计数到1并且产生一个计数器下溢事件;然后再从0开始重新计数。
对于中央对齐模式,开始不怎么了解,现在我个人的理解就是相当于:如果初值是3的话,那么它的计数方式就是
3、2、1、0、1、2、3这样,先进性-1操作,后进行+1操作!
完毕!
2、那么首先就引进时钟单元:定时器是由什么提供时钟节拍的呢?
先来看一下几种时钟模式:
计数器时钟可以由下列时钟源提供:
·内部时钟(CK_INT)
·外部时钟模式1:外部输入脚(TIx)
·外部时钟模式2:外部触发输入(ETR)
·内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
由于定时器功能实在过于强大,所以采用内部时钟模式,其它的等有空在说吧!实在扛不住啊!那么什么是内部时钟模式呢??
截取网上的一张图,你就会相当清晰了
TIM1和TIM8是由APB2分频提供的,而TIM2--TIM7是由分频APB1提供的,从时钟来源,我们是否就可以猜测到定时器1和定时器8更加高级呢?
APB2提供,最高可以到72M呀!至少我是这样猜想的!截取某网友对定时器时钟设置这部分的详解,如果你看了,你定会豁然开朗的,我把他的话整理了一下!
1、从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分,注意了是倍频器,不是分频器,继续看!!
2、下面以定时器2~7的时钟说明这个倍频器的作用:(当然定时器和定时器8也是这样的原理)
a、当APB1的预分频系数为1时,这个倍频器不起作用(也就是倍频系数为1),定时器的时钟频率等于APB1的频率;
b、当 APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍(倍频系数为2)。
3、可以通过这几个例子来叙述(对于定时器2至定时器7)
a、假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;
b、当APB1预分频系数=1 时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);当APB1预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。
总结:有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?
答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。
再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。
相信到这里,我们都可以熟悉的操作定时器的时钟了,但是这只是其中的一个模式,也就是内部时钟的模式!
还有其它三种模式暂时不做讨论。
3、跟着时钟有个大概的了解之后,继续看一个难点
所谓的带阴影的寄存器就出来了,看到上图那5个带阴影的寄存器没有,千万别以为是印刷或者扫描的问题,下面一起来看看对这个阴影寄存器的通俗解释:有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preloadregister(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadowregister(影子寄存器);正如手册上的14.3.1节所说,根据TIMx_CR1寄存器中APRE位的设置,preloadregister的内容可以随时传送到shadowregister,即两者是连通的(permanently),或者在每一次更新事件(UEV)时才把preloadregister的内容传送到shadowregister !
现在估计是明白了这个特点了,我的理解 也就是一个复杂的自动重装过程。
4、到这里你一定还发现了大写的 U和那个小箭头了!再看下面的分析:
表示对应寄存器的影子寄存器可以在发生更新事件时,被更新为它的preload register的内容;而图中UI部分,表示对应的Autoreload register可以产生一个更新事件(U)或更新事件中断(UI)。
所谓的时间U ,事件中断UI就是这么来的!
5、这样设计的好处是什么呢?
设计preload register和shadow register的好处是,所有真正需要起作用的寄存器(shadow register)可以在同一个时间(发生更新事件时)被更新为所对应的preload register的内容,这样可以保证多个通道的操作能够准确地同步。如果没有shadow register,或者preload register和shadow register是直通的,即软件更新preload register时,同时更新了shadow register,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。
6、接着看左下角的定时器通道:
TM32的定时器输入通道都有一个滤波单元,分别位于每个输入通路上(下图中的黄色框)和外部触发输入通路上(下图中的兰色框),它们的作用是滤除输入信号上的高频干扰。
具体操作如下:
在TIMx_CR1中的CKD[1:0]可以由用户设置对输入信号的采样频率基准,有三种选择:
1)采样频率基准fDTS=定时器输入频率fCK_INT
2)采样频率基准fDTS=定时器输入频率fCK_INT/2
3)采样频率基准fDTS=定时器输入频率fCK_INT/4
然后使用上述频率作为基准对输入信号进行采样,当连续采样到N次个有效电平时,认为一次有效的输入电平。
实际的采样频率和采样次数可以由用户程序根据需要选择;外部触发输入通道的滤波参数在从模式控制寄存器(TIMx_SMCR)的ETF[3:0]中设置;每个输入通道的滤波参数在捕获/比较模式寄存器1(TIMx_CCMR1)或捕获/比较模式寄存器2(TIMx_CCMR2)的IC1F[3:0]、IC2F[3:0]、IC3F[3:0]和IC4F[3:0]中设置。
注意了:注入的引脚和输出的引脚是一样的!,其实手册上也有说明之前的操作!请看
例如:当fCK_INT=72MHz时,选择fDTS=fCK_INT/2=36MHz,采样频率fSAMPLING=fDTS/2=18MHz且N=6,则频率高于3MHz的信号将被这个滤波器滤除,有效地屏蔽了高于3MHz的干扰。
比如,结合输入捕获的中断,可以轻松地实现按键的去抖动功能,而不需要软件的干预;这可是由硬件实现的去抖动功能,大大节省了软件的开销和程序代码的长度。
每个定时器最多可以实现4个按键的输入,这个方法也可以用于键盘矩阵的扫描,而且因为是通过中断实现,软件不需频繁的进行扫描动作。
这段话,也是摘抄某位网友的,示波器学习的时候就很蛋疼,所以不是很理解!
7、最后来说说比较捕获通道,这个可是核心的东西!
每一个捕获/ 比较通道都是围绕着一个捕获/ 比较寄存器( 包含影子寄存器) ,包括捕获的输入部分
(数字滤波、多路复用和预分频器),和输出部分(比较器和输出控制)。关于影子寄存器已经讲解的很明白了!
首先看着我用红色圈起来的那块,那就是一个捕获比较通道:
异或那块先不管他,好像跟编码器有关,输入有个特色就是可以把TI的输入搞到CC1上去,也可以把T2的输入搞到CC1上去,其实也可以把T1搞到CC1上去同时把T1搞到CC2上去,这样就有了后来的PWM输入。输出上的特色是不直接输出,而是有个OC1REF,这样可以定义高有效还是低有效,输出自己需要的有效电平!
以上只是定时器