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

7.定时器

定时器资源

CC2530有四个定时器TIM1~TIM4和休眠定时器

TIM1

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

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

TIM3和TIM4

定时器3 和4 是两个8 位的定时器。每个定时器有两个独立的比较通道,每个通道上使用一个I/O 引脚。

  • 两个捕获/比较通道
  • 设置、清除或切换输出比较
  • 时钟分频器,可以被 1,2,4,8,16,32,64,128 整除
  • 在每次捕获/比较和最终计数事件发生时产生中断请求
  • DMA 触发功能

TIM2和休眠定时器

定时器2 主要用于为802.15.4 CSMA-CA 算法提供定时,以及为802.15.4 MAC 层提供一般的计时功能。当定时器2 和休眠定时器一起使用时, 即使系统进入低功耗模式也会提供定时功能。定时器运行在CLKCONSTA.CLKSPD 指明的速度上。如果定时器2 和睡眠定时器一起使用,时钟速度必须设置为32 MHz,且必须使用一个外部32 kHz XOSC 获得精确结果。

  • 16 位定时器正计数提供的符号/帧周期,例如:16μs/320μs
  • 可变周期可精确到 31.25ns
  • 2×16 位定时器比较功能
  • 24 位溢出计数
  • 2×24 位溢出计数比较功能
  • 帧首定界符捕捉功能
  • 定时器启动/停止同步于外部 32kHz 时钟以及由睡眼定时器提供定时
  • 比较和溢出产生中断
  • 具有 DMA 触发功能
  • 通过引入延迟可调整定时器值

定时器触发方式

基础知识

定时器基础理论

(1)系统时钟频率
时钟发生器会以恒定的时间间隔产生脉冲,这个间歇性的脉冲可以形象理解为芯片的心跳,时钟频率则是用来描述这个心跳的速率。大家通常用1s内时钟发生器产生的脉冲数量来描述时钟频率,例如“时钟频率10 MHz”表示1s内的心跳次数为10 000 000次。CC2530有两种时钟频率可供开发者使用:32MHz和16MHz。

(2)分频系数
分频是指将时钟频率降低为原来的1/N,也称为N分频。比如当时钟频率是16MHz的时候,那么2分频是8MHz。分频系数则是用1/N来表示,比如2分频的分频系数为:1/2。

(3)系统时钟周期
周期和频率的关系可以用公式表示: T = 1 / f,其中T为时钟周期,f为时钟频率。时钟周期和时钟频率成倒数关系。举个例子说明一下,时钟频率为16MHz时表示在1s内时钟发生器可以产生16 000 000个脉冲,而时钟周期则可以表示产生一个脉冲所需要的时间,即1 / 160 000 00s。

(4)计数器
计数器是定时器的核心,用于记录时钟发生器产生的脉冲数量。由于脉冲的时钟周期是恒定的,因此计算定时时间的公式是:t=nT,其中t为定时时间,n为计数次数,T为时钟周期

(5)溢出
由于计数器的范围是有限的,当计数次数超过最大值时就会产生溢出。例如当计数器的大小是16位时,那么计数范围是0~65535,因此计数次数超过65535后计数器就会产生溢出。在产生溢出后,计算器的值会从最大值变为0。

定时原理

利用公式对频率和周期的关系作进一步的解释。我们利用f表示时钟频率,T来表示时钟周期,那么可以用此关系式来表示它们的关系:

  • T = 1 / f (1)

我们计时t秒后,假设此时计数器从0开始计数了N次(假设此时计数器没有溢出)。前面已经讲解过,时钟周期T表示心跳1次所需要时间,因此t与N的关系如下:

  • t = N × T (2)

接着,我们可以推导出:

  • N = t / T (3)

CC2530的默认系统时钟频率是16MHz(16000000Hz),其定时器1使用128分频,因此定时器的时钟频率是 16000000 / 128 Hz。

  • 根据公式(1)T = 1 / f 可以算出定时器1时钟周期为T = 128/16000000 秒。
  • 在定时5秒的情况下(即t=5秒),根据公式(2)N = t / T,计数器的计数值N = 5 / (128/16000000) = 625000。

处理溢出

当定时器溢出时会发生中断,此时寄存器IRCON的Bit1位会由原先的0被设置为1,因此我们只需要检测这个标志位即可判断是否发生了溢出,定时器1是一个16位定时器,每溢出一次计数65536次,所以定时5秒后将会溢出: 625000 / 65536 = 9.54,取整数,即9次。反过来,如果溢出了9次,我们可以大约第认为时间过了5秒。

查询触发(以TIM1为例)

实现代码

#include<iocc2530.h>void initTimer1(void);void main()
{P1SEL &= ~0x01;//P1_0设置为通用I/O口P1DIR |= 0X01;//配置P1_0位输出initTimer1();while(1){if (!(IRCON & 0x02)) continue; // Timer1 interrupt not pendingIRCON &= ~(0x02); // Clear timer1 interrupt flagif (++Counter < 9) continue;  // ~5 secondelse Counter = 0;P1_0 = ~ P1_0;};
}static void initTimer1(void)
{T1CTL = 0x0D; // Tick frequency/128, // Free-running, repeatedly count from 0x0000 to 0xFFFFT1STAT= 0x21; // T1 counter-overflow interrupt flag, writing a 1 has no effect.// T1 channel 0 interrupt flag, writing a 1 has no effect.
}

相关寄存器

T1CTL定时器 1 控制寄存器

image-20231014201132513

T1STAT 定时器 1 状态寄存器

image-20231014201147911

中断标志寄存器

image-20231014201440093

中断触发(以TIM3为例)

实现代码

#include<iocc2530.h>
#include <stdio.h>
#include"74LS164_8LED.h"int counter_g = 0;
int i = 0;
void Delay()
{int y,x;for(y=1000;y>0;y--)for(x=30;x>0;x--);
}void initTimer3(void)
{T3CTL = 0xE8;//128分频 溢出中断屏蔽开T3IE = 1;	   // 定时器3中断使能EA = 1;	       // 中断总允许T3CTL |= 0x10; // 开启中断
}void main(){initTimer3();P1SEL &= ~0x01;//P1_0设置为通用I/O口P1DIR |= 0X01;//配置P1_0位输出while(1);
}/**  Timer3 interrupt service function */
#pragma vector = T3_VECTOR
__interrupt void Timer3_ISR(void)
{// ~5sif (++counter_g == 2441) {counter_g = 0;i++;if(i > 10) i = 0;P1_0 = ~ P1_0;}
}

相关寄存器

T3CTL定时器3控制寄存器

image-20231014202000375

定时器3中断使能

image-20231014202039918

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

相关文章:

  • 计算机网络 | 网络层
  • 21GA-ELM,遗传算法优化ELM预测,并和优化前后以及真实数值进行对比,确定结果,基于MATLAB平台,程序已经调通,可以直接运行,需要直接拍下。
  • 287_C++_TaskQueue管理任务队列和定时器(头文件.h)
  • Hadoop+Zookeeper+HA错题总结(一)
  • React高级特性之context
  • 【OS】操作系统课程笔记 第五章 并发性——互斥、同步和通信
  • RabbitMQ概述原理
  • 8.Covector Transformation Rules
  • RustDay04------Exercise[21-30]
  • OpenAI科学家谈GPT-4的潜力与挑战
  • Java电子病历编辑器项目源码 采用B/S(Browser/Server)架构
  • 使用 AWS DataSync 进行跨区域 AWS EFS 数据传输
  • 设计模式~解释器模式(Interpreter)-19
  • 对象混入的实现方式
  • Mac 远程 Ubuntu
  • 黑豹程序员-h5前端录音、播放
  • Leetcode622.设计循环队列
  • 二十二、【形状工具组】
  • 设计模式~迭代器模式(Iterator)-20
  • 亳州市的自然风光与旅游资源:欣赏安徽省中部的壮丽景色
  • windows安装nvm以及解决yarn问题
  • 【TA 挖坑04】薄膜干涉 镭射材质 matcap
  • OpenCV13-图像噪声:椒盐噪声和高斯噪声
  • 天堂2服务器基本设置
  • 如何解决网站被攻击的问题
  • python爬虫入门详细教程-采集云南招聘网数据保存为csv文件
  • 1.13.C++项目:仿muduo库实现并发服务器之TcpServer模块的设计
  • Spring(17) AopContext.currentProxy() 类内方法调用切入
  • 自己的类支持基于范围的for循环 (深入探索)
  • Multi Scale Supervised 3D U-Net for Kidney and Tumor Segmentation