定时器的使用方法总结
2020-03-03 来源:eefocus
首先理解看门狗定时器方式的使用,简单说,就是有个控制器,选择时钟源,计数方式,等等的控制参数,再配合一个一个累加计数器来确定时间,通过固定的时间间隔来执行中断函数,来得到自己想要的实验结果。
理解之后我们就对最简单的定时器有了一个简单的感念了,了解了基本的定时功能,现在了解下单片机中的TA和TB两个定时器:
首先看TA:
和学习之前的功能一样,先了解寄存器,以及寄存器功能:
定时器A的控制寄存器:
定时器A的计数器:
重点来了:
定时器A的捕获/比较功能寄存器以及中断向量寄存器:
前面的控制寄存器和计数器还好理解一点,主要是选择定时器A的功能和一些基本参数的,这里简单讲下设置步骤:
①选择TA的时钟源和分频;//TACTL |= TASSEL_1 + ID_0;
#define ID_0 (00x40u) / Timer A input divider: 0 - /1 /
#define ID_1 (10x40u) /* Timer A input divider: 1 - /2 /
#define ID_2 (20x40u) /* Timer A input divider: 2 - /4 /
#define ID_3 (30x40u) /* Timer A input divider: 3 - /8 /
#define TASSEL_0 (00x100u) /* Timer A clock source select: 0 - TACLK /
#define TASSEL_1 (10x100u) /* Timer A clock source select: 1 - ACLK /
#define TASSEL_2 (20x100u) /* Timer A clock source select: 2 - SMCLK /
#define TASSEL_3 (30x100u) /* Timer A clock source select: 3 - INCLK /
②TA的计数方式的选择:
#define MC_0 (00x10u) /* Timer A mode control: 0 - Stop /
#define MC_1 (10x10u) /* Timer A mode control: 1 - Up to CCR0 /
#define MC_2 (20x10u) /* Timer A mode control: 2 - Continous up /
#define MC_3 (30x10u) /* Timer A mode control: 3 - Up/Down /
③设置中断使能与标志位:
#define TAIE (0x0002u) / Timer A counter interrupt enable /
#define TAIFG (0x0001u) / Timer A counter interrupt flag */
关于TAR计数器是16位的:2^16=65536
上面的难点就在于选择TA的4种计数方式:(简单介绍一下)
00:计数器停止
01:增计数方式:
计数值最大范围到65536,但是taccr0值一定小于65536,所以,每计数都是从0~TACCR0(自定义);
注意这个模式下:TACCR0 作为周期寄存器使用;
所以通过改变 TACCR0 来改变计数周期;每个计数周期写作 (TACCR0 + 1);
可以发现这用模式可以使两者中断标志位置一,一个是TAIFG,另一个是 TACCR0 CCIFG(这个后面讲捕获比较的时候会提到)现在了解一下,就是说引起中断的时候要注意区分,是那种中断类型
10:连续计数模式
就是从0~65536再从0 ~65536 一直循环:
注意这个模式下:TACCR0 做为一般捕获比较寄存器使用;
因为这个模式下 TACCR0 作为普通寄存器使用了,所以这种模式下只会引起一种中断标志置位,就是TAIFG;
这个模式想要变更计数周期,就只能每次溢出之后给TAR赋初值;
11:增减计数方式:
与增计数方式有些相似,都是通过 TACCR0 来确定周期的,所以,TACCR0 作为周期寄存器使用;
周期是 2*TACCR0
因为这种模式是0 ~ 6553 ~ 0;所以周期长,最大周期为131070;
四种工作模式就是上面介绍的,下面讲下关于,捕获比较的特点和编辑方式:
TACCTLx是捕获比较寄存器,TA里有三个这个寄存器,分别是TACCTL0; TACCTL1;TACCTL2
这里要注意的是,如果计数模式选择增计数,或者增减计数模式,TACCR0会被用来做周期计数器,所以此时的TACCR0不能使用捕获比较功能
这里可以按照功能区分成三个单元来说:比较单元,捕获单元,输出单元
①首先通过模式选择功能模式(CAP)
0:比较模式<缺省>
1:捕获模式
这里先讲比较模式:就是设置一个定时长度(TACCRn),比较单元会一直比较TACCRn和TAR的值,当TACCRn = TAR时;CCIE置位,发起中断;
所以常用来写定时任务,如键盘扫描,定时查询等
捕获模式:用来进行测量,如测量时钟频率,脉冲宽度等
1
2
3
4
②设置捕获方式:(CMx)
00:不捕获
01:上升沿捕获
10:下降沿捕获
11:上升&下降沿捕获
③捕获/比较的输入选择:(CCISx)(选择输入信号)
00:CCIxA
01:CCIxB
10:GND
11:Vcc
CCIxA:P1.1~P1.3;CCIxB:P2.2;这个要查看 I/O引脚的第二功能;
④SCS:同步(1)或异步(0)捕获,一般用同步;
SCCI是CCIxA或CCIxB的信号读取位,只能读。
#define CCIS_0 (00x1000u) / Capture input select: 0 - CCIxA /
#define CCIS_1 (10x1000u) /* Capture input select: 1 - CCIxB /
#define CCIS_2 (20x1000u) /* Capture input select: 2 - GND /
#define CCIS_3 (30x1000u) /* Capture input select: 3 - Vcc /
#define CM_0 (00x4000u) /* Capture mode: 0 - disabled /
#define CM_1 (10x4000u) /* Capture mode: 1 - pos. edge /
#define CM_2 (20x4000u) /* Capture mode: 1 - neg. edge /
#define CM_3 (30x4000u) /* Capture mode: 1 - both edges */
输出单元:
主要由
OUTMODx;OUT;控制,用老输出PWM波形(以后用到再看)
#define OUTMOD_0 (00x20u) / PWM output mode: 0 - output only /
#define OUTMOD_1 (10x20u) /* PWM output mode: 1 - set /
#define OUTMOD_2 (20x20u) /* PWM output mode: 2 - PWM toggle/reset /
#define OUTMOD_3 (30x20u) /* PWM output mode: 3 - PWM set/reset /
#define OUTMOD_4 (40x20u) /* PWM output mode: 4 - toggle /
#define OUTMOD_5 (50x20u) /* PWM output mode: 5 - Reset /
#define OUTMOD_6 (60x20u) /* PWM output mode: 6 - PWM toggle/set /
#define OUTMOD_7 (70x20u) /* PWM output mode: 7 - PWM reset/set */
#define OUT (0x0004u) /* PWM Output signal if output mode 0 */
对于最后的中断向量寄存器,要注意的是这里是没有TACCR0的中断向量的,所以TACCR0是个单源中断,二中断向量寄存器内的是多源中断,区分两种中断方式很关键
/* TA3IV Definitions /
#define TAIV_NONE (0x0000u) / No Interrupt pending /
#define TAIV_TACCR1 (0x0002u) / TACCR1_CCIFG /
#define TAIV_TACCR2 (0x0004u) / TACCR2_CCIFG /
#define TAIV_6 (0x0006u) / Reserved /
#define TAIV_8 (0x0008u) / Reserved /
#define TAIV_TAIFG (0x000Au) / TAIFG */
上一篇:关于定时器A的官方例子解读
下一篇:msp430的看门狗总结