ZigBee案例笔记 - 定时器

1.片内外设I/O

定时器这样的片内外设也需要I/O口来实现功能,同USART一样,定时器也有2个可选择的I/O位置
在这里插入图片描述
当I/O引脚用作通用I/O时,需要把PxSEL对应位置0,如果时用作外设功能则需要将PxSEL对应位置1
在这里插入图片描述
在PERCFG寄存器中可配置定时器引脚是使用位置1还是位置2(引脚映射)
在这里插入图片描述

2.定时器简介

CC2530有T1、T2、T3、T4共4个定时器,用于控制和测量,可用的5个通道的正计数/倒计数模式。
T1为16位定时/计数器,支持输入采样、输出比较和PWM功能,T1有5个独立的输入采样/输出比较通道,每个通道对应一个I/O口
T2位MAC定时器,T3、T4为8位定时器/计数器,支持输出比较和PWM功能,T3、T4有两个独立的输出比较通道,每一个通道对应一个I/O口

定时器1的功能如下:

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

PERCFG.T1CFG选择是否使用备用位置1或备用位置2。
定时器1由以下寄存器组成:
(1)T1CNTH - 定时器1计数高位。
(2)T1CNTL - 定时器1计数低位。
(3)T1CTL - 定时器1控制。
(4)T1STAT - 定时器1状态。
定时器1寄存器如下图所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.定时器1操作

一般来说,控制寄存器T1CTL用于控制定时器操作。状态寄存器T1STAT保存中断标志。定时器1有三种操作模式,对应不同的定时应用,各种操作模式如下所述。

自由运行模式

在自由运行操作模式下,计数器从0x0000开始,每个活动时钟边沿增加1。当计数器达到0xFFFF(溢出),计数器载入Ox0000,继续递增它的值。当达到最终计数值0xFFFF,设置标志IRCON.T1IF和T1STAT.OVFIF。如果设置了相应的中断屏蔽位TIMIF.OVFIM以及IEN1.T1IE,将产生一个中断请求。自由运行模式可以用于产生独立的时间间隔,输出信号频率。

模模式

当定时器运行在模模式,16位计数器从0x0000开始,每个活动时钟边沿增加1。当计数器达到寄存器T1CC0(溢出)时,寄存器T1CC0H: T1CC0L保存最终计数值,计数器将复位到0x0000,并继续递增。如果定时器开始于T1CC0以上的一个值,当达到最终计数值(0xFFFF)时,设置标志IRCON.T1IF和T1CTL.OVFIF。如果设置了相应的中断屏蔽位TIMIF.OVFIM以及IEN1.T1IE,将产生一个中断请求。模模式被大量用于周期不是0xFFFF的应用程序,模模式计数器的操作如图所示。
在这里插入图片描述

正计数/倒计数模式

在正计数/倒计数模式,计数器反复从0x0000开始,正计数直到达到T1CC0H: T1CCOL保存的值。然后计数器将倒计数达到0x0000,如图所示。这个定时器用于周期必须是对称输出脉冲而不是0xFFFF的应用程序,因为这种模式允许中心对齐的PWM输出应用的实现。在正计数/倒计数模式,当达到最终计数值时,设置标志IRCON.T1IF和T1CTL.OVFIF。如果设置了相应的中断屏蔽位TIMIF.OVFIM以及IEN1.T1EN,将产生一个中断请求。
在这里插入图片描述

5.16位计数器

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

定时器1控制LED 示例

在TI定时器处于8分频下,计数器每8/(32x10^6)s增加1,当计数到0xFFFF发生溢出中断约0.16s,中断300次约5s时间

#include<ioCC2530.h>

#define LED1 P1_0

unsigned int counter = 0;		// 溢出次数

void LED_Init()
{
  	P1SEL &= ~0x01;
  	P1DIR |= 0x01;
  
  	LED1 = 0;
}

void T1_Init()
{
	CLKCONCMD &= ~0x7f;			// 晶振设置为32MHz
	while(CLKCONSTA & 0x40);	// 等待晶振稳定

	EA = 1;						// 开总中断
	T1IE = 1;					// 开T1溢出中断
	T1CTL |= 0x01;				// 设定时器1为自由运行模式
	T1CTL |= 0x04;				// 设置8分频启动定时器1
}

void main()
{
	LED_Init();
	T1_Init();

	while(1);
}

#pragma vector = T1_VECTOR
__interrupt void T1_ISR()
{
	IRCON = 0x00;		// 清除中断标志

	if(counter<300)		counter++;		// 每300次中断切换LED1状态,约5s
	else{
		counter = 0;					// 计数清零
		LED1 = !LED1;					// LED1状态反转
	}
}
6.定时器3概述

定时器3和定时器4的所有定时器功能都是基于8位计数器建立的,所以定时器3和定时器4的最大计数值要远远小于定时器1,常用于较短时间间隔的定时。定时器3和定时器4各有0、1两个通道,功能较定时器1要弱。计数器在每个时钟边沿递增或递减。活动时钟边沿的周期由寄存器位CLKCONCMD.TICKSPD[2:0]定义,由TxCTL.DIV[2:0](其中x指的是定时器号码,3或4)设置的分频器值进一步划分。计数器可以作为一个自由运行计数器、倒计数器、模计数器或正/倒计数器运行。
可以通过寄存器TxCNT读取8位计数器的值,其中,x指的是定时器号码: 3或4。计数器开始和停止是通过设置TxCTL控制寄存器的值实现的。当TxCTL.START写入1时,计数器开始。当TxCTL.START写入0时,计数器停留在它的当前值。

自由运行模式

在自由运行模式操作下,计数器从0x00开始,每个活动时钟边沿递增。当计数器达到0xFF,计数器载入0x00,并继续递增。当达到最终计数值0xFF(比如,发生了一个溢出),就设置中断标志TIMIF.TxOVFIF。如果设置了相应的中断屏蔽位TxCTL.OVFIM,就产生一个中断请求。自由运行模式可以用于产生独立的时间间隔和输出信号频率。

倒计数模式

在倒计数模式,定时器启动之后,计数器载入TxCC0的内容。然后计数器倒计时,直到0x00。当达到0x00时,设置标志TIMIF.TxOVFIF。如果设置了相应的中断屏蔽位TxCTL.OVFIM,就产生一个中断请求。定时器倒计数模式一般用于需要事件超时间隔的应用程序。

模模式

当定时器运行在模模式,8位计数器在0x00启动,每个活动时钟边沿递增。当计数器达到寄存器TxCC0所含的最终计数值时,计数器复位到0x00,并继续递增。当发生这个事件时,设置标志TIMIF.TxOVFIF。如果设置了相应的中断屏蔽位TxCTL.OVFIM,就产生一个中断请求。模模式可以用于周期不是0xFF的应用程序。

正/倒计数模式

在正/倒计数定时器模式下,计数器反复从0x00开始正计数,直到达到TxCC0所含的值,然后计数器倒计数,直到达到0x00。这个定时器模式用于需要对称输出脉冲,且周期不是0xFF的应用程序。因此它允许中心对齐的PWM输出应用程序的实现。
通过写入TxCTL.CLR清除计数器也会复位计数方向,即从0x00模式正计数。
这两个定时器各分配了一个中断向量。当以下定时器事件之一发生时,将产生一个中断。
(1)计数器达到最终计数值。
(2)比较事件。
(3)捕获事件。
SFR 寄存器 TIMIF 包含定时器 3 和定时器 4 的所有中断标志。寄存器位TIMIF.TxOVFIF 和 TIMIF.TxCHnIF分别包含 2 个最终计数值事件,以及四个通道捕获/比较事件的中断标志。仅当设置了相应的中断屏蔽位时,才会产生一个中断请求。如果有其它未决的中断,必须通过 CPU,在一个新的中断请求产生之前,清除相应的中断标志。而且,如果设置了相应的中断标志,使能一个中断屏蔽位将产生一个新的中断请求。

7.定时器3寄存器

在这里插入图片描述
在这里插入图片描述

定时器3控制LED闪烁

定时器3是8为计数器,在自由模式下计数到0xFF产生溢出中断时间约为0.000064秒,定时器3控制的LED闪烁会比定时器1控制的LED闪烁快很多,300次中断约0.0192s

#include<ioCC2530.h>

#define LED1 = P1_0

unsigned int counter = 0;

void LED_Init()
{
  	P1SEL &= ~0x01;
  	P1DIR |= 0x01;
  
  	LED1 = 0;
}

void T3_Init()
{
	CLKCONCMD &= ~0x7f;			// 晶振设置为32MHz
	while(CLKCONSTA & 0x40);	// 等待晶振稳定

	EA = 1;						// 开总中断
	T3IE = 1;					// 开T1溢出中断
	T3CTL |= 0x7C;				// 设定时器3为8分频 自由运行模式 启动定时器3
}

void main()
{
	LED_Init();
	T3_Init();
	
	while(1);
}

#pragma vector = T3_VECTOR
 __interrupt void T3_ISR()
{
	IRCON = 0x00; 	// 清除中断
	if(counter < 300)	counter++;
	else{
		counter = 0;
		LED1 = !LED1;
	}
}

将中断次数counter大小修改为30000时,约每2s LED状态改变一次

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GenCoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值