[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] 1、 ZigBee简介

[ZigBee] 2、 ZigBee开发环境搭建

[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

[ZigBee] 4、ZigBee基础实验——中断

[ZigBee] 5、ZigBee基础实验——图文与代码详解定时器1(16位定时器)(长文)

 

 

PS:如果您觉得还不错,点个赞,让更多人受益~

@beautifulzzzz 2016-07-14 continue~  
e-mail:beautifulzzzz@qq.com 
sina:http://weibo.com/beautifulzzzz?is_all=1

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 CC2430 的应用开发中,定时器中断是非常常用的一个功能。下面我们将介绍几个关于定时器中断的基础实验。 ## 实验一:定时器中断实验 ### 实验目的 了解 CC2430 的定时器模块,并掌握其中断的使用方法。 ### 实验原理 CC2430 的定时器模块有三个定时器:T1、T2 和 T3。其中,T1 和 T2 是 16 定时器,T3 是 8 定时器。在本实验中,我们将以 T1 定时器为例,介绍定时器中断的使用方法。 T1 定时器的计数器是一个 16 的寄存器,它可以通过以下寄存器进行配置: - T1CC0H/T1CC0L:T1 的比较器 0,可以用来产生比较中断。 - T1CC1H/T1CC1L:T1 的比较器 1,可以用来产生比较中断。 - T1CC2H/T1CC2L:T1 的比较器 2,可以用来产生比较中断。 - T1IE:T1 中断使能寄存器,用来使能 T1 的中断。 - T1CTL:T1 控制寄存器,用来配置 T1 的计数模式、时钟源等参数。 在本实验中,我们将使用 T1 的比较器 0,配置为每隔 1 秒钟产生一次中断。 ### 实验步骤 1. 配置 T1 的计数模式、时钟源等参数。 ```c T1CTL |= 0x0C; // T1 计数模式为比较器模式 T1CTL &= ~0x03; // T1 时钟源为时钟源选择寄存器 CLKCON 的 CLKSPD 所选择的时钟源 T1CTL &= ~0x30; // T1 比较器模式为单次比较模式 ``` 2. 配置 T1 的比较器 0。 ```c T1CC0L = 0x00; // T1 的比较器 0 的低 8 T1CC0H = 0x80; // T1 的比较器 0 的高 8 ``` 3. 使能 T1 的中断。 ```c T1IE = 1; // 使能 T1 的中断 ``` 4. 在主函数中进入循环,等待定时器中断的触发。 ```c while(1); ``` 5. 在定时器中断服务函数中处理中断事件。 ```c #pragma vector = T1_VECTOR __interrupt void T1_ISR(void) { T1IF = 0; // 清除 T1 中断标志 // 中断处理代码 } ``` ### 实验结果 当程序运行后,每隔 1 秒钟会触发一次定时器中断。在中断服务函数中可以添加相应的处理代码,实现定时器中断的功能。 ## 实验二:定时器中断实现 LED 闪烁 ### 实验目的 通过定时器中断实现 LED 的闪烁。 ### 实验原理 在上一个实验中,我们已经学习了如何使用定时器中断。在本实验中,我们将以 T1 定时器为例,通过定时器中断实现 LED 的闪烁。 在本实验中,我们将使用 P0.0 引脚控制 LED 的状态。LED 亮时,P0.0 输出低电平;LED 灭时,P0.0 输出高电平。我们可以通过改变 P0.0 引脚的电平状态,实现 LED 的闪烁。 ### 实验步骤 1. 配置 P0.0 引脚为输出模式。 ```c P0SEL &= ~0x01; // P0.0 引脚配置为 GPIO 模式 P0DIR |= 0x01; // P0.0 引脚配置为输出模式 ``` 2. 配置 T1 的计数模式、时钟源等参数。 ```c T1CTL |= 0x0C; // T1 计数模式为比较器模式 T1CTL &= ~0x03; // T1 时钟源为时钟源选择寄存器 CLKCON 的 CLKSPD 所选择的时钟源 T1CTL &= ~0x30; // T1 比较器模式为单次比较模式 ``` 3. 配置 T1 的比较器 0。 ```c T1CC0L = 0x00; // T1 的比较器 0 的低 8 T1CC0H = 0x80; // T1 的比较器 0 的高 8 ``` 4. 使能 T1 的中断。 ```c T1IE = 1; // 使能 T1 的中断 ``` 5. 在定时器中断服务函数中处理中断事件,改变 P0.0 引脚的电平状态。 ```c #pragma vector = T1_VECTOR __interrupt void T1_ISR(void) { T1IF = 0; // 清除 T1 中断标志 P0_0 = ~P0_0; // P0.0 引脚电平状态取反 } ``` 6. 在主函数中进入循环,等待定时器中断的触发。 ```c while(1); ``` ### 实验结果 当程序运行后,LED 会以 1 秒钟的频率闪烁。如果需要改变 LED 闪烁的频率,可以通过修改 T1 的比较器 0 的值来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值