当前位置:首页 > 技术分析 > 正文内容

[ZigBee] 6、ZigBee基础实验——定时器3和定时器4

ruisui883个月前 (02-20)技术分析12

上一节讲了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 
 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系列文章:

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

@beautifulzzzz2016-07-14 continue~

e-mail:beautifulzzzz@qq.com

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2125.html

标签: 清除定时器
分享给朋友:

“[ZigBee] 6、ZigBee基础实验——定时器3和定时器4” 的相关文章

Ubuntu 24.10发行版登场:Linux 6.11内核、GNOME 47桌面环境

IT之家 10 月 11 日消息,Canonical 昨日发布新闻稿,正式推出代号为 Oracular Oriole 的 Ubuntu 24.10 发行版。新版在内核方面升级到最新 6.11 版本,并采用 GNOME 47 桌面环境。Ubuntu 24.10 发行版调整了内核策略,开始选择最新的上游...

如何在 Linux 发行版中安装微信和 QQ?

很多人因为工作沟通的原因需要用到微信和 QQ,那么如何在 Linux 发行版中安装微信和 QQ 呢?以下是一些尝试的解决方法。QQ上一个版本的 QQ Linux 版还是在2009年,而在现在,基于 NT 架构的全新 QQ Linux版已经被正式推出,为所有用户提供下载。新版本提供了deb、rpm、A...

2024前端面试真题之—VUE篇

添加图片注释,不超过 140 字(可选)1.vue的生命周期有哪些及每个生命周期做了什么? beforeCreate是new Vue()之后触发的第一个钩子,在当前阶段data、methods、computed以及watch上的数据和方法都不能被访问。 created在实例创建完成后发生,当前阶段已...

深入理解Vue.js组件通信:父子组件与子父组件数据交互详解

什么是Vue组件通讯 Vue.js 组件通信是指在 Vue 应用的不同组件之间进行数据交换和状态同步的过程。由于 Vue 的组件是基于单文件组件(SFCs)的模块化设计,每个组件都有自己的作用域,因此它们不能直接访问彼此的数据。为了使组件之间能够协同工作,Vue 提供了几种不同的通信方式。以下是 V...

vue中如何在自定义组件上使用v-model和.sync

自定义事件tips推荐始终使用 kebab-case 的事件名。(v-on会将事件名自动转换为小写,避免匹配不到)changeData ×change-data √自定义组件的v-model用法:父组件定义数据源(不需要定义修改数据的方法),在子组件标签上通过v-model="data...

jvm疯狂吃内存,到底是谁的锅?

jvm应该是每一个java程序员都需要掌握的内容,但是在没有遇到问题之前,很多都是基于理论的,唯有实战才能增加个人的知识储备。本文是从一个角度来分析是谁在狂吃内存,希望对你有所帮助。本文是易观技术人员注意到一台开发机上各个微服务进程占用内存很高,随即便展开了调查......ps:本文来源于:http...