×
单片机 > 单片机程序设计 > 详情

定时器的使用方法总结

发布时间:2020-08-25 发布时间:
|

首先理解看门狗定时器方式的使用,简单说,就是有个控制器,选择时钟源,计数方式,等等的控制参数,再配合一个一个累加计数器来确定时间,通过固定的时间间隔来执行中断函数,来得到自己想要的实验结果。

理解之后我们就对最简单的定时器有了一个简单的感念了,了解了基本的定时功能,现在了解下单片机中的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 */

关键字:定时器  使用方法  寄存器

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多