基于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:输入比较x ICxPS:分频后的ICx

OCx:输出捕获x OCxREF:输出参考信号


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个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器);正如手册上的14.3.1节所说,根据TIMx_CR1寄存器中APRE位的设置,preload register的内容可以随时传送到shadow register,即两者是连通的(permanently),或者在每一次更新事件(UEV)时才把preload register的内容传送到shadow register !

现在估计是明白了这个特点了,我的理解 也就是一个复杂的自动重装过程。
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,这样可以定义高有效还是低有效,输出自己需要的有效电平!

以上只是定时器的一些基本的,非全面的知识介绍,接下来,就通过分析代码来深入的了解这写个定时器了!

我和你还没完     !待续。。





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值