STM32通用定时器
STM32的定时器功能很强大,学习起来也很费劲儿.
其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册…}才搞明白的!所以接下来我以手册的顺序为主线,增加一些自己的理解,并通过11个例程对TIMER做个剖析。实验环境是STM103V100的实验板,MDK3.2 +Library2.东西都不怎么新,凑合用……
TIMER主要是由三部分组成:
时基单元。
输入捕获。
输出比较。
还有两种模式控制功能:从模式控制和主模式控制。
一、 框图
让我们看下手册,一开始是定时器的框图,这里面几乎包含了所有定时器的信息,您要是能看明白,那么接下来就不用再看别的了…
为了方便的看图,我对里面出现的名词和符号做个注解:
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:应该叫做定时器输入信号x
ICx:输入比较x ICxPS:分频后的ICx
OCx:输出捕获x OCxREF:输出参考信号
关于框图还有以下几点要注意:
影子寄存器。
有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器);/STM32/401461/message.aspx)
输入滤波机制
在ETR何TIx输入端有个输入滤波器,它的作用是以采样频率Fdts来采样N次进行滤波的。(具体也请参考版主博客/STM32/263170/message.aspx)
输入引脚和输出引脚是相同的。
二、时基单元
时基单元有三个部分:CNT、PSC、ARR。CNT的计数方式分三种:向上、向下、中央对齐。通俗的说就是0—ARR、ARR—0、0—(ARR-1)—ARR—1.
三、时钟源的选择
这个是难点之一。从手册上我们看到共有三种时钟源:
内部时钟。
也就是选择CK_INT做时钟,这个简单,但是有一点要注意,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器, 当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当?APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。M,APB12分频36M,那么TIMER就是APB1的2倍频,即72M。
怎么选择时钟模式1呢?只要将SMCR中SMS[2:0]弄成000就好了
SMCR
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ETP ECEETPS[1:0]ETF[3:0]MSMTS[2:0]SMS[2:0]
外部时钟模式1
这个比较麻烦,时钟源选择的其实就是TRGI(触发输入),但触发输入选择挺多的,共8个……。看框图,他们是:ITRx、TI1F_ED、
TI1FP1、TI2FP2、ETRF
ITRx的东西跟定时器的级联有关,暂时不管他。要进入这种时钟模式首先置SMS为111,当然这还没完,不像内部时钟那样,什么都配好了,这里你还得配置一下别的参数,比如选择TI1FP1,自然要对输入通道1的参数配置好,这样时钟才能按你需要的方式进来。就是配框图这块
相关寄存器
CCMR1(输入)
IC2F[3:0] IC2PSC[1:0]CC2S[1:0]IC1F[3:0]IC1PSC[1:0]CC1S[1:0]
CCER
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
CC4PCC4ECC3PCC3ECC2PCC2ECC1PCC1ESMCR
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ETP