当前位置: 首页 > news >正文

ZigBee案例笔记 - 定时器

文章目录

        • 1.片内外设I/O
        • 2.定时器简介
        • 3.定时器1寄存器
        • 4.定时器1操作
          • 自由运行模式
          • 模模式
          • 正计数/倒计数模式
        • 5.16位计数器
          • 定时器1控制LED 示例
        • 6.定时器3概述
          • 自由运行模式
          • 倒计数模式
          • 模模式
          • 正/倒计数模式
        • 7.定时器3寄存器
          • 定时器3控制LED闪烁

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_0unsigned int counter = 0;		// 溢出次数void LED_Init()
{P1SEL &= ~0x01;P1DIR |= 0x01;LED1 = 0;
}void T1_Init()
{CLKCONCMD &= ~0x7f;			// 晶振设置为32MHzwhile(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状态,约5selse{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_0unsigned int counter = 0;void LED_Init()
{P1SEL &= ~0x01;P1DIR |= 0x01;LED1 = 0;
}void T3_Init()
{CLKCONCMD &= ~0x7f;			// 晶振设置为32MHzwhile(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状态改变一次

http://www.lryc.cn/news/68962.html

相关文章:

  • GE H201TI 全系统自检和自诊断
  • 这个屏幕录制太好用了!
  • 初识redis【redis的安装使用与卸载】
  • 接口测试总结及其用例设计方法整理,希望可以帮到你
  • 基于FPGA的多功能数字钟的设计
  • 第四十二天学习记录:C语言进阶:笔试题整理Ⅲ
  • GLSL 代码规范
  • 红黑树封装map和set
  • python序列
  • LeetCode35. 搜索插入位置(二分法入门)
  • macOS Ventura 13.4 RC3(22F66)发布
  • CSI和DSI介绍
  • vue3+antDesignVue前端纯导出
  • 卷积神经网络的剪枝及其在嵌入式视觉系统中的应用
  • Spring IOC - Bean的初始化
  • Golang 安装
  • ( 位运算 ) 338. 比特位计数 ——【Leetcode每日一题】
  • Unity之新版输入系统InputSystem入门
  • python 之 logging的使用
  • gunicorn常用参数命令
  • TimerResolution.exe
  • Qt魔法书:打造自定义鼠标键盘脚本
  • 〖Python网络爬虫实战㉖〗- Selenium库和ChromeDriver驱动的安装
  • U8产成品入库API接口 --参照生产订单/产品检验/不良品
  • gdb打印的堆栈有些函数是??()是什么
  • 【Jmeter第三章】Jmeter给请求添加请求头
  • WebApi必须知道的RestFul,Swagger,OAuth2.0
  • 【网络编程】demo版UDP网络服务器实现
  • C++的stack和queue
  • C++ RAII机制