ZigBee快速入门04

CC2530的定时器

    • 定时器
      • 定时器简介
      • 定时器T1
        • 16位计数器
        • 定时器1的操作
        • T1相关寄存器
        • 代码

定时器

定时器简介

CC2530有5个定时器,即定时器1(16位定时器),定时器2(MAC定时器),定时器3和4,睡眠定时器

  • 定时器1:一个16位定时器,具有定时器/计数器/PWM功能
  • 定时器2:专门为支持IEEE 802.15.4 MAC或软件中其他时槽的协议设计。
  • 定时器3和定时器4:两个都是8位定时器,具有定时器/计数器/PWM功能。它们有一个可编程的分频器、一个8位周期值、一个可编程的计数器通道(具有一个8位的比较值)。每个计数器通道可以用作一个PWM输出。
  • 睡眠定时器:一个超低功耗的定时器,用于计算32kHz晶体振荡器或32kHz RC振荡器的周期。

定时器T1

定时器1是一个独立的16位定时器,支持典型的定时/计数功能,比如输入捕获、输出比较和PWM功能。该定时器拥有5个独立的捕获/比较通道。每个通道使用一个I/O引脚。定时器1用于广泛的控制和测量应用,5个通道具备正计数/倒计数模式,允许诸如电机控制应用的实现。

定时器1功能特征如下:

  • 5个捕获/比较通道
  • 上升沿、下降沿和任何边沿的输入捕获
  • 设置、清除或切换输出比较
  • 自由运行、模或正计数/倒计数操作
  • 1,8,32或128时钟分频
  • 在每个捕获/比较和最终计数上生成中断请求
  • DMA触发功能

16位计数器

  1. 定时器1包含一个16位计数器,在每个活动时钟边沿递增或递减。活动时钟边沿周期由寄存器位CLKCONCMD.TICKSPD定义,它设置全局系统时钟的划分,提供了从0.25MHz到32MHz不同的时钟标签频率(可使用32MHz晶体振荡器作为时钟源)。
    在定时器1中,由T1CTL.DIV设置的分频器进一步划分。这个分频器值可以为1,8,32或128。因此,当32MHz晶体振荡器用作系统时钟源时,定时器1可以使用的最低时钟频率是1953.125Hz,最高为32MHz。当16MHz RC振荡器用作系统时钟源时,定时器1可以使用的最高时钟频率为16MHz
  2. 这个16位计数器可作为一个自由运行计数器、模计数器,或在中心对齐的PWM里使用的正计数器/倒计数器运行。
    可以通过两个8位的SFR寄存器T1CNTHT1CNTL读取16位计数器的值,分别包含高位字节和低位字节。当读取T1CNTL时,计数器的高位字节在那时被缓冲到T1CNTH,以便高位字节可以从T1CNTH中读出。因此,T1CNTL必须总是在读取T1CNTH之前首先读取。
    T1CNTL寄存器的所有写入访问将复位16位计数器。
    当达到最终计数值(溢出)时,计数器产生一个中断请求。可以用T1CTL控制寄存器设置启动和停止该计数器。当一个不是00的值写入到T1CTL.MODE时,计数器开始运行。如果00写入到T1CTL.MODE,计数器将停止在它现在的值上。

定时器1的操作

一般来说,控制寄存器T1CTL用于控制定时器1的操作,状态寄存器T1STAT保存中断标志。

  • 自由运行模式

16位计数器从0x0000开始,在每个活动边沿增加1,当计数器达到0xFFFF(溢出)时,计数器载入0x0000,继续递增它的值。当达到最终计数值0xFFFF时,设置标志IRCON.T1IFT1STAT.OVERIF。如果设置了相应的中断屏蔽位TIMIF.OVRIM以及IEN1.T1EN,将产生一个中断请求。自由运行模式可以用于产生独立的时间间隔和输出信号频率。
ZigBee快速入门04_第1张图片

  • 模模式

16位计数器从0x0000开始,在每个活动边沿增加1,当计数器达到T1CC0(溢出),即寄存器T1CC0H: T1CC0L保存的最终计数值时,计数器将复位到0x0000,并继续递增。如果定时器开始于T1CC0以上的一个值,当达到最终计数值0xFFFF时,设置标志IRCON.T1IFT1STAT.OVERIF。如果设置了相应的中断屏蔽位TIMIF.OVRIM以及IEN1.T1EN,将产生一个中断请求。模模式可以用于周期不是0xFFFF的应用程序。
ZigBee快速入门04_第2张图片

  • 正计数/倒计数模式

在正计数/倒计数模式,计数器反复从0x0000开始,正计数直到达到T1CC0H:T1CC0L保存的值,然后计数器将倒计数直到0x0000。这个用于周期必须是对称输出脉冲而不是0xFFFF的应用程序,因此允许中心对齐的PWM输出应用的实现。在正计数/倒计数模式下,当达到最终计数值时,设置标志IRCON.T1IFT1STAT.OVERIF。如果设置了相应的中断屏蔽位TIMIF.OVRIM以及IEN1.T1EN,将产生一个中断请求。
ZigBee快速入门04_第3张图片

T1相关寄存器

T1计数器T1CNTHT1CNTL
ZigBee快速入门04_第4张图片
定时器1控制寄存器T1CTL
ZigBee快速入门04_第5张图片
定时器1状态寄存器T1STAT
ZigBee快速入门04_第6张图片
定时器1通道0捕获/比较控制寄存器T1CCTL0
ZigBee快速入门04_第7张图片
定时器1通道0捕获/比较值寄存器T1CC0HT1CC0L
ZigBee快速入门04_第8张图片
定时器1/3/4中断掩码/标志寄存器TIMIF
ZigBee快速入门04_第9张图片
定时器3控制寄存器T3CTL
ZigBee快速入门04_第10张图片
定时器4控制寄存器T4CTL
ZigBee快速入门04_第11张图片

代码

  • 定时器1查询方式
#include 

int main()
{
    int count = 0;
    //set LED
    P1DIR |= 0x01; //0000 0001

    T1CTL = 0x0D; //0000 1101 128 free-running

    while(1){
        if( IRCON > 0 ){
            IRCON = 0;
            if(++count==1){
                count = 0;
                P1_0 ^= 1;
            }
        }
    }
}
  • 定时器3中断方式
#include 

int count = 0;
int main()
{
    //set timer3
    T3CTL |= 0xE0;  // 1110 0000
    T3CTL &= 0xFC;  // 1111 1100
    T3CTL |= 0x10;

    // set timers3 overflow interrupt
    T3CTL |= 0x08;
    T3IE = 1;
    EA = 1;

    //set led2 P1_1
    P1DIR |= 0x02; //0000 0010

    while(1);
}

#pragma vector=T3_VECTOR
__interrupt void T3_ISR(){
    if(TIMIF &= 0x01){
        if(++count>244){
            count = 0;
            P1_1 ^= 1;
        }
    }
    TIMIF &= 0xFE; //1111 1110
    T3IF = 0;
}

你可能感兴趣的:(ZigBee,单片机,物联网)