首页 > 编程知识 正文

zigbee射频模块,无线传感器网络的典型应用

时间:2023-05-04 06:06:54 阅读:54476 作者:1983

ZigBee2-2定时器定时/计数器基本原理CC2530定时/计数器CC2530定时/计数器中断系统定时器T1例定时器T1-轮询方式源代码分析定时器T3例:定时器T3-分配

计时器计时器/计数器的基本原理

定时/计数器是对内部时钟信号和外部输入信号进行计数,在计数值达到设定请求时向CPU发出中断处理请求,从而实现定时和计数功能的外围设备。

计时器/计数器的基本工作原理是进行计数。 无论是计时器还是计数器,本质上都是计数器。 可以递增1 (递减1 )进行计数。 每次发出计数信号时,计数器展自动增加1 (增加1 ) (减少1 )。 计数值从0变为最大值)或从最大值变为0 )溢出时,计时器/计数器向CPU发出中断请求。

CC2530的计时器/计数器CC2530共有五个计时器/计数器,其中计时器1是16位的计时器,应该在APP应用中优先选择CC2530中功能最全的计时器/计数器。 计时器1的工作模式有三种:

自由运行模式:计数器从000000开始,对活动时钟的每个边沿递增1,当计数器达到0xFFFF时使其跟踪,且计数通道重新加载0x0000以开始新的向上计数。 该模式的计数周期为恒定值0xFFFF,因此在达到最终计数值0xFFFF时,标志位T1IF和OVFIF被设定。 模式:计数器从0x0000开始,在活动时钟的每个边上递增1。 计数器达到T1CC0寄存器中保持的值时溢出,计数器从0x0000开始新的递增计数。 模式的计数周期可以由用户自己设定。 向上计数/向下计数模式:计数器重复从0x0000开始,向上计数到存储在TICC0中的最终计数值,

然后,倒计时到0x0000并达到最终计数值时,标志位T1IF和OVFIF被设置。 在CC2530的计时器/计数器中断系统计时器中,有3种情况下会产生中断请求:

输入计数器达到最终计数值(溢出或返回零)的捕获事件。 输出比较事件(模式时使用) ) ) ) ) )。

使用模式时需要特别注意,打开通道0的输出比较模式。 否则,计数器值达到T1CCO后,不会发生溢出中断。 计时器t1 )设定计时器1的最大计数值

计时器共有5组T1CCxH和T1CCxL寄存器,分别与通道0至通道4对应。 使用计时器1的计时器功能时,使用T1CCOH和T1CC0L两个寄存器,保存最大计数值的前8位和后8位。

最大计数值=计时器时间/计时器计数周期。 如果我们按时计算100ms怎么办?

如果系统没有设置工作频率,则默认为2分频器,即32M/2=16M,系统时钟为16MHz,并且分频因子为128,计时器01秒,最大计数值为:

当系统时钟为16MHz时,每一16位计时器溢出的值为65536,从而溢出时间可以为t=1/(16m/128 ) *65536=0.524s

CC2530的T1计时器(16位)必须配置3个寄存器T1CTL、T1STAT和IRCON。 寄存器的作用说明

T1CTL

(0xE4 ) ) ) )。

计时器1控制和状态t1CTL(bit:2 )分频器对值进行如下分割

00:标记频率/1

01:标记频率/8

10:标记频率/32

11:标记频率/128

选择tictl(bit1:0 )计时器1模式:

00:暂停运行。

01:自由运行,从0x0000到0xFFFF重复计数。

10:型,从0x0000到T1CCO反复计数。

11:倒计时/倒计时,从0x0000到T1CC0重复倒计时,从T1CCO到0x0000倒计时。

T1stat(0xaf )

计时器1的状态Bit5:计时器计数器溢出中断标志

Bit4:计时器1通道4中断标志

Bit3:定时器1通道3中断标志

Bit2:计时器1通道2中断标志

Bit1:计时器1通道1中断标志

Bit0:计时器1通道0中断标志

是ircon(0xc0)

中断标志4Bit1:计时器1中断标志。 计时器1发生中断时设定为1,CPU矢量指向中断服务例程时清除。

0:无中断未解决

1:中断未解决例定时器T1-轮询方式按照表寄存器的内容配置Led1和T1。 Led1由以下:组成

P1SEL=0x01; //配置P1.0为通用I0端口PIDIR=0x01; //配置P1.0作为输出T1如下配置:T1CTL=0x0d; //128分频,0x0000-0xFFFF T1STAT=0x21; //通道0中断有效源分析知识点:系统在每次定时器溢出时t=1/(16m/128 * 660 ),因为如果不设置操作频率,则缺省情况下将进行2分频,即32M/2=16M

/* * * * * * * * * * * * * * * * * * * * * * * * * * *说明:定时器T1是LED1的周期性闪烁* * * * * * * * * * * * * * * * * * * * *。

************/#include <ioCC2530.h>typedef unsigned char uchar;typedef unsigned int uint;#define LED1 P1_0 // P1.0口控制LED1/***************************************************************************** 名 称: InitLed()* 功 能: 设置LED灯相应的IO口* 入口参数: 无* 出口参数: 无****************************************************************************/void InitLed(void){ P1DIR |= 0x01; //P1.0定义为输出 LED1 = 1; //使LED1灯上电默认为熄灭 }/***************************************************************************** 名 称: InitT1()* 功 能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz* 入口参数: 无* 出口参数: 无****************************************************************************/void InitT1(){ T1CTL = 0x0d; //128分频,自动重装 0x0000-0xFFFF T1STAT= 0x21; //通道0,中断有效 }/***************************************************************************** 程序入口函数****************************************************************************/void main(void){ uchar count=0; InitLed(); //调用初始化函数 InitT1(); while(1) { if(IRCON > 0) { IRCON=0; if(count++ >= 1) //约1s周期性闪烁,示波器测大约为1025MS { count=0; LED1 = !LED1; //LED1闪烁 } } }} 定时器T3

系统在不配置工作频率时默认为2分频,即32M/2=16M,系统时钟为16MHz,分频系数为 128要定时01秒,最大计数值为:

要定时500ms则12500*5=62500
相关寄存器:CC2530定时器T3

例:定时器T3-中断方式

按照表格寄存器的内容,对T3进行配置,由于定时器T3为8位所以配置稍有不同。

T3CTL|= 0x08; //开溢出中断 T3IE=1; //开总中断和 T3中断 T3CTL|=0xE0; //128分频128/16000000*N=0.5SN=62500 T3CTL &= ~0x03; //自动重装00->0xff62500/255=245(次) T3CTL= 0x10; //启动 EA=1; //开总中断 源码分析: /***************************************************************************** 文 件 名: main.c* 作 者: Andy* 修 订: 2013-01-08* 版 本: 1.0* 描 述: 定时器T3通过中断方式控制LED1周期性闪烁****************************************************************************/#include <ioCC2530.h>typedef unsigned char uchar;typedef unsigned int uint;#define LED1 P1_0 // P1.0口控制LED1uint count; //用于定时器计数/***************************************************************************** 名 称: InitLed()* 功 能: 设置LED灯相应的IO口* 入口参数: 无* 出口参数: 无****************************************************************************/void InitLed(void){ P1DIR |= 0x01; //P1.0定义为输出 LED1 = 1; //使LED1灯上电默认为熄灭 }/***************************************************************************** 名 称: InitT3()* 功 能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz* 入口参数: 无* 出口参数: 无****************************************************************************/void InitT3(){ T3CTL |= 0x08 ; //开溢出中断 T3IE = 1; //开总中断和T3中断 T3CTL |= 0xE0; //128分频,128/16000000*N=0.5S,N=62500 T3CTL &= ~0x03; //自动重装 00->0xff 62500/255=245(次) T3CTL |= 0x10; //启动 EA = 1; //开总中断}//定时器T3中断处理函数#pragma vector = T3_VECTOR __interrupt void T3_ISR(void) { IRCON = 0x00; //清中断标志, 也可由硬件自动完成 if(count++ > 244) //245次中断后LED取反,闪烁一轮(约为0.5 秒时间) { //经过示波器测量确保精确 count = 0; //计数清零 LED1 = ~LED1; //改变LED1的状态 } }/***************************************************************************** 程序入口函数****************************************************************************/void main(void){ InitLed(); //设置LED灯相应的IO口 InitT3(); //设置T3相应的寄存器 while(1) {};}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。