[ZigBee] 6、ZigBee基础实验——定时器3和定时器4(8 位定时器)
上一节讲了16位定时器1,本节讲8位定时器3和定时器4!
1、综述
Timer 3 and Timer 4 are two 8-bit timers(8位定时器). Each timer has two independent capture/compare channels(独立的捕获/比较通道),each using one I/O pin per channel.
Features:
· Two capture/compare channels
· Set, clear or toggle output compare
· Clock prescaler for divide by 1, 2, 4, 8, 16, 32, 64, 128(分频)
· Interrupt request generated on each capture/compare and terminal-count event
· DMA trigger function
2、8-Bit Timer Counter
#如何设置周期# 定时器3和定时器4所有功能都是基于8位定时计数器的。计数器在每个时钟边沿递增或递减。活动时钟边沿的周期首先可以通过寄存器CLKCONCMD.TICKSPD[2:0]来设定,更细的分频可以通过设置TxCTL.DIV[2:0]寄存器 (where x refers to the timer number, 3 or 4)。The counter operates as either a free-running counter, a down counter, a modulo counter or an up/down counter(自由运行计数器,倒计数器,模计数器,或正/倒计数器)。
#如何读取计数器的值# It is possible to read the 8-bit counter value through the SFR register TxCNT, where x refers to the timer number, 3 or 4.
#停止和开始控制# 清除和暂停定时器是通过TxCTL控制寄存器来实现的。 The counter is started when a 1 is written to TxCTL.START. If a 0 is written to TxCTL.START, 保留在当前值。
3、Timer 3/Timer 4 Mode Control
In general, the control register TxCTL is used to control the timer operation.
3.1 Free-Running Mode(自由计数模式)
在此模式,定时器从0x00开始计时,每次上升沿递增。当值达到0xFF时,定时器被重置为0x00并继续计数。当最终达到0xFF(例如:发生一次溢出),中断标志位TIMIF.TxOVFIF被置1。如果设置了相应的中断屏蔽位TxCTL.OVFIM为1,就会产生一个中断请求。自由运行模式可以用于产生独立的时间间隔和输出信号频率。
3.2 Down Mode(倒计数模式)
在倒计数模式,定时器启动之后,计数器载入TxCC0 的内容。然后计数器倒计时,直到0x00。当达到0x00时,设置标志TIMIF.TxOVFIF。如果设置了相应的中断屏蔽位TxCTL.OVFIM,就产生一个中断请求。定时器倒计数模式一般用于需要事件超时间隔的应用程序。
3.3 Modulo Mode(模模式)
当定时器运行在模模式,8 位计数器在0x00 启动,每个活动时钟边沿递增。当计数器达到寄存器TxCC0所含的最终计数值时,计数器复位到0x00,并继续递增。当发生这个事件时,设置标志IMIF.TxOVFIF 。如果设置了相应的中断屏蔽位TxCTL.OVFIM,就产生一个中断请求。模模式可以用于周期不是0xFF 的应用程序。
3.4 Up/Down Mode(正/倒计数模式)
在正/倒计数定时器模式下,计数器反复从0x00 开始正计数,直到达到TxCC0 所含的值,然后计数器倒计数,直到达到0x00。这个定时器模式用于需要对称输出脉冲,且周期不是0xFF 的应用程序。因此它允许中心对齐的PWM 输出应用程序的实现。
注意:通过写入TxCTL.CLR 清除计数器也会复位计数方向,即从0x00 模式正计数!!!
这四种模式其实区别不大,自由模式是从0x00到0xFF,然后再从0x00到0xFF;倒计数模式是从设定值(TxCC0)开始倒着计数,直到0x00;模模式则是从0x00->TxCC0,然后再从0x00继续重复之前的循环;正倒计数模式和模模式不同之处是当达到TxCC0之后,而是从TxCC0倒着计数到0x00。
4、通道模式控制
对于通道0 和1,每个通道的模式是由控制和状态寄存器TxCCTLn 设置的,其中n 是通道号码0 或1。设置包括捕获和比较模式。
5、输入捕获模式
当一个通道配置为一个输入捕获通道,通道相关的I/O 引脚配置为一个输入。定时器启动之后,输入引脚上的一个上升沿、下降沿或任何边沿都会触发一个捕获,即捕获8 位计数器内容到相关的捕获寄存器中。因此,定时器能够捕获一个外部事件发生的时间。
注意:在定时器使用一个I/O 引脚之前,所需的I/O 引脚必须配置为一个定时器3/定时器4 外设引脚。
通道输入引脚与内部系统时钟是同步的。因此,输入引脚上的脉冲的最小持续时间必须大于系统时钟周期。通道n 的8 位捕获寄存器的内容从寄存器T3CCn/T4CCn 中读出。当发生一个捕获,对应实际通道的中断标志就被设置。这是TIMIF.TxCHnIF。如果相应的中断屏蔽位TxCCTLn.IM 被设置,就产生一个中断请求。
插一句:这个输入捕获在设计汽车倒车雷达——多路超声波测距时很有用,一旦外部超声波接收部分的滤波电路产生一个电平变化都会被捕获到时间点,用来计算距离。
6、输出比较模式
在输出比较模式下,与该通道相关的I/O 引脚必须设置为输出。定时器启动之后,the content of the counter is compared with the contents of channel compare register TxCC0n。如果比较寄存器等于计数器的内容,根据比较输出模式TxCCTL.CMP1:0 的设置,输出引脚被设置1、复位0或切换。注意当运行在一个给定的比较输出模式下,输出引脚上的所有边沿都是无故障运行的。
For simple PWM use, output compare modes 4 and 5 are preferred.
Writing to compare register TxCC0 or TxCC1 does not take effect on the output compare value until the counter value is 0x00.
当一个比较发生时, 实际通道的相应的中断标志位就会被设置。该中断标志位即:TIMIF.TxCHnIF。如果相应的中断屏蔽位TxCCTLn.IM被设置了,那么就会产生中断请求。(CC2530的中断请求产生目前来看似乎都需要设置相应的中断屏蔽位!)
A compare output pin is initialized to the value listed in Table 6-1 when:
‘1’写到TxCNTR.CLR(所有定时器x 通道)
0x7 写到TxCCTLn.CMP(定时器x,通道n)
初始的比较输出值(比较模式)
7、定时器3 和定时器4 中断
为这两个定时器各分配了一个中断向量。他们是T3 和T4。当以下定时器事件之一发生时,将产生一个中断请求:
● 计数器达到最终计数值
● 比较事件
● 捕获事件
SFR 寄存器TIMIF包含定时器3 和定时器4 的所有中断标志。寄存器位TIMIF.TxOVFIF 和TIMIF.TxCHnIF分别包含2 个最终计数值事件,以及四个通道捕获/比较事件的中断标志。仅当设置了相应的中断屏蔽位时,才会产生一个中断请求。如果有其它未决的中断,必须通过CPU,在一个新的中断请求产生之前,清除相应的中断标志。而且,如果设置了相应的中断标志,使能一个中断屏蔽位将产生一个新的中断请求。
8、定时器3 和定时器4 DMA 触发
有两个与定时器3 相关的DMA 触发,同样有两个与定时器4 相关的DMA 触发。这些触发如下:
● T3_CH0:定时器3 通道0 捕获/比较
● T3_CH1:定时器3 通道1 捕获/比较
● T4_CH0:定时器4 通道0 捕获/比较
● T4_CH0:定时器4 通道1 捕获/比较
9、例子
上一节介绍的TIMER1中已经介绍,这里timer3的初始化也大同小异,参照T3CTL便能明白初始化设置的含义,当然也必不可少开T3IE中断和总中断。这样中断请求就会被相应的中断函数接收到。
代码:
1 /**************************************************************************** 2 * 文 件 名: main.c 3 * 版 本: 1.0 4 * 描 述: 定时器T3通过中断方式控制LED1周期性闪烁 5 ****************************************************************************/ 6 #include <ioCC2530.h> 7 8 typedef unsigned char uchar; 9 typedef unsigned int uint; 10 11 #define LED1 P1_0 // P1.0口控制LED1 12 13 uint count; //用于定时器计数 14 15 /**************************************************************************** 16 * 名 称: InitLed() 17 * 功 能: 设置LED灯相应的IO口 18 * 入口参数: 无 19 * 出口参数: 无 20 ****************************************************************************/ 21 void InitLed(void) 22 { 23 P1DIR |= 0x01; //P1.0定义为输出 24 LED1 = 1; //使LED1灯上电默认为熄灭 25 } 26 27 /**************************************************************************** 28 * 名 称: InitT3() 29 * 功 能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz 30 * 入口参数: 无 31 * 出口参数: 无 32 ****************************************************************************/ 33 void InitT3() 34 { 35 T3CTL |= 0x08 ; //开溢出中断 36 T3IE = 1; //开总中断和T3中断 37 T3CTL |= 0xE0; //128分频,128/16000000*N=0.5S,N=62500 38 T3CTL &= ~0x03; //自动重装 00->0xff 62500/255=245(次) 39 T3CTL |= 0x10; //启动 40 EA = 1; //开总中断 41 } 42 43 //定时器T3中断处理函数 44 #pragma vector = T3_VECTOR 45 __interrupt void T3_ISR(void) 46 { 47 IRCON = 0x00; //清中断标志, 也可由硬件自动完成 48 if(count++ > 244) //245次中断后LED取反,闪烁一轮(约为0.5 秒时间) 49 { //经过示波器测量确保精确 50 count = 0; //计数清零 51 LED1 = ~LED1; //改变LED1的状态 52 } 53 } 54 55 56 /**************************************************************************** 57 * 程序入口函数 58 ****************************************************************************/ 59 void main(void) 60 { 61 InitLed(); //设置LED灯相应的IO口 62 InitT3(); //设置T3相应的寄存器 63 while(1) 64 {}; 65 }
Zigbee系列文章:
[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭
[ZigBee] 5、ZigBee基础实验——图文与代码详解定时器1(16位定时器)(长文)
PS:如果您觉得还不错,点个赞,让更多人受益~
@beautifulzzzz 2016-07-14 continue~
e-mail:beautifulzzzz@qq.com
sina:http://weibo.com/beautifulzzzz?is_all=1