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.mzph.cn/news/105230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 获取入参函数名

前言 C# 如何通过形参获得实参的名字&#xff1f; C# 10 新特性 —— CallerArgumentExpression 我最近在研究Godot&#xff0c;想简化Godot的操作。所有有了这个需求 public static void Test(string str){console.wirteLine(nameof(str)); } public static void Main(string…

【API篇】二、源算子API

文章目录 0、demo数据1、源算子Source2、从集合中读取数据3、从文件中读取4、从Socket读取5、从Kafka读取6、从数据生成器读取数据7、Flink支持的数据类型8、Flink的类型提示&#xff08;Type Hints&#xff09; 0、demo数据 准备一个实体类WaterSensor&#xff1a; Data All…

【入门】.Net Core 6 WebApi 项目搭建

一、创建项目 1.1.创建新项目&#xff1a;打开开发工具>创建新项目>搜索API>选择C#语言的ASP.NET Core Web API 1.2.配置新项目&#xff1a;**自定义项目信息以及存储路径 1.3.其他信息&#xff1a;这里框架必须选择.NET 6.0,其他配置默认勾选即可&#xff0c;也可以根…

逐字稿 | 对比学习论文综述【论文精读】

对比学习在计算机视觉领域的发展历程&#xff0c;4个阶段&#xff1a; 百花齐放&#xff1a;方法、模型、目标函数、代理任务都还没有统一。CV双雄&#xff1a;MOCOv1、SimCLRv1、MOCOv2、SimCLRv2、CPC和CMC的延伸工作、SwaV&#xff0c;这个阶段发展非常迅速&#xff0c;以上…

云上攻防-云原生篇Docker安全系统内核版本漏洞CDK自动利用容器逃逸

文章目录 云原生-Docker安全-容器逃逸&内核漏洞云原生-Docker安全-容器逃逸&版本漏洞-CVE-2019-5736 runC容器逃逸-CVE-2020-15257 containerd逃逸 云原生-Docker安全-容器逃逸&CDK自动化 云原生-Docker安全-容器逃逸&内核漏洞 细节部分在权限提升章节会详解&…

SQLite4Unity3d安卓 在手机上创建sqlite失败解决

总结 要在Unity上运行一次出现库&#xff0c;再打包进APK内 问题 使用示例代码的创建库 var dbPath string.Format("Assets/StreamingAssets/{0}", DatabaseName); #else// check if file exists in Application.persistentDataPathvar filepath string.Format…

安装nginx,配置https

nginx安装 下载nginx&#xff1a;下载地址 上传到/opt目录 解压nginx&#xff0c;并进入解压后到目录 cd /opt tar -zxvf nginx-1.25.2.tar.gz cd nginx-1.25.2编译(with-http_ssl_module为https模块) ./configure --with-http_ssl_module安装 make install默认的安装目录为…

idea插件开发javax.net.ssl.SSLException: No PSK available. Unable to resume.

idea插件开发,编译出错 javax.net.ssl.SSLException: No PSK available. Unable to resume.at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:129)at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)at java.base/sun.security.ssl.…

通讯网关软件024——利用CommGate X2Access实现Modbus TCP数据转储Access

本文介绍利用CommGate X2ACCESS实现从Modbus TCP设备读取数据并转储至ACCESS数据库。CommGate X2ACCESS是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现从Modbus TCP设备读取数据并转储…

自己的类支持基于范围的for循环 (深入探索)

自己的类支持基于范围的for循环 (深入探索) 编译器实际运行伪代码为: auto && __range range_expression; auto __begin begin_expr; auto __end end_expr; for (; __begin ! __end; __begin) {range_declaration *__begin;loop_statement }观察伪代码&#xff0…

Ubuntu 上传项目到 GitHub

一、前言 GitHub 作为时下最大的开源代码管理项目&#xff0c;广泛被工程和科研人员使用&#xff0c;本文主要介绍如何如何将自己的项目程序上传到 GitHub 上。 要上传本地项目到 GitHub 上&#xff0c;主要分为两步&#xff0c;第一步是 二、创建 SSH keys 首先登录 GitHu…

js的入口函数和作用

JavaScript的入口函数通常是整个应用程序或网页的起点。在浏览器环境中&#xff0c;最常见的入口函数是main函数&#xff0c;或者在更现代的JavaScript框架&#xff08;如React或Vue&#xff09;中&#xff0c;可能会有其他特定的入口函数。 以下是一个非常基础的JavaScript入…

Jenkins+Gitlab+Docker(Dockerfile)部署

Docker部署运行 ​ 上一篇内容中使用Jenkins(运行服务器)Gitlab(代码存储库)Webhook(网络钩子)的方式部署运行我们的项目。需要我们在服务器上做好很多相关的环境配置及依赖。 ​ 那么假如有这样一个场景&#xff1a;需要把不同技术栈的项目部署到同一台服务器上运行。比如PH…

如何开始使用 Kubernetes RBAC

基于角色的访问控制 (RBAC) 是一种用于定义用户帐户可以在 Kubernetes 集群中执行的操作的机制。启用 RBAC 可以降低与凭证盗窃和帐户接管相关的风险。向每个用户授予他们所需的最低权限集可以防止帐户拥有过多的特权。 大多数流行的 Kubernetes 发行版都从单个用户帐户开始,…

【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口

文章目录 【MySQL SpringBoot 小点子】全面实现流程 数据库导出Excel表格文件的接口1. 什么是VO&#xff08;View Object&#xff09;对象2. BeanCopyUtils进行两个对象的数据转移3. mapper层实现4. service层实现5. vo对象创建6. 保存路径配置7. controller层核心代码实现8.…

JavaFX: 使用本地openjfx包

JavaFX: 使用本地openjfx包 1、注释配置2、下载openjfx包3、导入openjfx的jar包 1、注释配置 build.gradle配置注释&#xff1a; 2、下载openjfx包 下载javaFx地址&#xff1a;https://gluonhq.com/products/javafx/ 3、导入openjfx的jar包

设计模式~状态模式(state)-23

目录 (1)优点&#xff1a; (2)缺点&#xff1a; (3)使用场景&#xff1a; (4)注意事项&#xff1a; (5)应用实例&#xff1a; 代码 在状态模式&#xff08;State Pattern&#xff09;中&#xff0c;类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状…

elasticsearch安装

安装elasticsearch 1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net1.2.加载镜像 elasticsearch的镜像的tar包&#xff1a;点击下载 将其上传到虚拟机中…

电源集成INN3270C-H215-TL、INN3278C-H114-TL、INN3278C-H215-TL简化了反激式电源转换器的设计和制造。

一、概述 InnoSwitch™3-CP系列IC极大地简化了反激式电源转换器的设计和制造&#xff0c;特别是那些需要高效率和/或紧凑尺寸的产品。InnoSwitch3-CP系列将初级和次级控制器以及安全额定反馈集成到单个IC中。 InnoSwitch3-CP系列器件集成了多种保护功能&#xff0c;包括线路过…

Web前端-Vue2+Vue3基础入门到实战项目-Day4(组件的三大组成部分, 组件通信, 案例-组件版小黑记事本, 进阶语法)

Web前端-Vue2Vue3基础入门到实战项目-Day4 组件的三大组成部分(结构/样式/逻辑)scoped样式冲突data是一个函数 组件通信组件通信语法父传子子传父props详解什么是propsprops检验props与data的区别 非父子(扩展)事件总线 (event bus)provide - inject 案例 - 小黑记事本(组件版)…