7.定时器

news2024/10/6 2:20:11

定时器资源

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 pending
        
        IRCON &= ~(0x02); // Clear timer1 interrupt flag
        
        if (++Counter < 9) continue;  // ~5 second
        
        else Counter = 0;
        
        P1_0 = ~ P1_0;
    };
}

static void initTimer1(void)
{
  T1CTL = 0x0D; // Tick frequency/128, 
                // Free-running, repeatedly count from 0x0000 to 0xFFFF

  T1STAT= 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)
{
    // ~5s
    if (++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.coloradmin.cn/o/1093361.html

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

相关文章

NewStarCTF2023week2-Unserialize?

代码审计&#xff1a; 定义了一个eval类&#xff0c;该类下有一个私有变量cmd和公有成员函数destruct()&#xff0c;该函数在对象的所有引用都被删除或类被销毁时会自动调用&#xff1b; 调用该函数则会执行一个正则表达式进行正则匹配&#xff0c;过滤掉了一些常用命令和bas…

机器人技术研究现状

随着科技的不断进步&#xff0c;机器人技术在制造业中的应用越来越广泛。本文将综述机器人技术的研究现状&#xff0c;主要包括机器人控制技术、机器人感知技术、机器人智能化技术、柔性机器人技术、协作机器人技术以及云机器人技术六个方面。 一、机器人控制技术 机器人控制技…

2023年中国云计算软件市场规模、市场结构及市场份额情况分析[图]

云计算是分布式计算的一种&#xff0c;指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序&#xff0c;然后&#xff0c;通过多部服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户。云计算软件类型分为三类&#xff0c;即基础设施即服务、平台即服…

调试工具:应用程序验证器Application Verifier(配合WinDbg)

1.应用程序验证器&#xff08;Application Verifier&#xff09;简介 说明&#xff1a;Application Verifier是来自微软官方的一款应用程序验证工具&#xff0c;主要用于帮助用户检测和调试内存损坏、危险的安全漏洞、Run-time检测等&#xff1b;是一款辅助开发工具&#xff0…

NIO教程

一&#xff0c;概述 原本的java是基于同步阻塞式的i/o通信&#xff08;bio) 性能低下&#xff0c;所以出现了nio这种非阻塞式的 二&#xff0c;Java 的I/O演进之路 2.1 i/o模型基本说明 i/o模型&#xff1a;就是用什么样的通道或者说通信模式和架构进行数据的传输和接收&am…

GPT实战系列-ChatGLM2部署Ubuntu+Cuda11+显存24G实战方案

GPT实战系列-ChatGLM2部署UbuntuCuda11显存24G实战方案 自从chatGPT掀起的AI大模型热潮以来&#xff0c;国内大模型研究和开源活动&#xff0c;进展也如火如荼。模型越来越大&#xff0c;如何在小显存部署和使用大模型&#xff1f; 本实战专栏将评估一系列的开源模型&#xf…

MSVC编译dcmtk库

官网 https://www.dcmtk.org/en/dcmtk/ 下载源码和支持包 支持包在support文件夹下,选择适合你的MSVC版本 到官网下载cmake,官网cmake.org 解压源码 支持库 打开cmake-gui,填写源码目录(dcmtk解压的源码目录)和编译目录(自定义的目录) 点下面的configure,弹出选…

Maika 与越南童模们受邀请参加中国上海时装周 hanakimi 品牌开幕

金风送爽&#xff0c;秋高气和。2024中国上海时装周以“活力互链”为主题&#xff0c;于10月8日正式启幕。 魅力四射的越南童模身着著名时尚品牌MLB、Hana Kami、Jacadi的精美设计&#xff0c;迈着有力、专业但又不失优雅的步伐走上时尚舞台上海大型现场。无论是拍摄造型照还是…

机器学习的原理是什么?

训过小狗没? 没训过的话总见过吧? 你要能理解怎么训狗&#xff0c;就能非常轻易的理解机器学习的原理. 比如你想教小狗学习动作“坐下”一开始小狗根本不知道你在说什么。但是如果你每次都说坐下”然后帮助它坐下&#xff0c;并给它一块小零食作为奖励&#xff0c;经过多次…

2020-2021 ACM-ICPC, Asia Nanjing Regional Contest (XXI Open Cup, Grand Prix

Problem - K - Codeforces 首先第一个位置放1&#xff0c;第二个位置放2&#xff0c;...第n个位置放n 任意两个相邻的数都是互质的&#xff0c;我们只要交换相邻的两个数就可以产生两个数满足gcd&#xff08;pi&#xff0c;i&#xff09;1 其中第一个位置为1比较特殊&#x…

Ae 效果:CC Blobbylize

扭曲/CC Blobbylize Distort/CC Blobbylize CC Blobbylize&#xff08;CC 团化&#xff09;与 CC Glass 效果非常相似&#xff0c;可将源图像扭曲变形成一些不可名状的团块&#xff0c;从而创建液态金属等效果。 CC Blobbylize 效果使用源图像以及 Blob layer 图层的纹理&#…

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包

xshell使用方法(超详细)

一、安装 下载最新版安装即可&#xff0c;不需要做任何配置。 安装完成后输入账号名和邮箱&#xff0c;确认后邮箱会收到一条确认邮件&#xff0c;将里面的链接点开即可免费使用&#xff08;仅安装后会出现&#xff0c;认证后以后再打开不需要重复操作&#xff0c;如果重新安…

【面试经典150 | 哈希表】最长连续序列

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;哈希表 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内…

Hadoop3教程(七):MapReduce概述

文章目录 &#xff08;68&#xff09; MR的概述&优缺点&#xff08;69&#xff09;MR的核心思想MapReduce进程 &#xff08;70&#xff09;官方WC源码&序列化类型&#xff08;71&#xff09;MR的编程规范MapperReducerDriver &#xff08;72&#xff09;WordCount案例需…

C# 图解教程 第5版 —— 第3章 C# 编程概述

文章目录 3.1 一个简单的 C# 程序&#xff08;*&#xff09;3.2 标识符3.3 关键字3.4 Main&#xff1a;程序的起始点&#xff08;*&#xff09;3.5 空白3.6 语句&#xff08;*&#xff09;3.7 从程序中输出文本3.7.1 Write&#xff08;*&#xff09;3.7.2 WriteLine&#xff08…

【数据结构】排序--选择排序(堆排序)

目录 一 堆排序 二 直接选择排序 一 堆排序 堆排序(Heapsort)是指利用堆积树&#xff08;堆&#xff09;这种数据结构所设计的一种排序算法&#xff0c;它是选择排序的一种。它是 通过堆来进行选择数据。 需要注意的是排升序要建大堆&#xff0c;排降序建小堆。 直接选择排…

Vue2+SpringBoot实现数据导出到csv文件并下载

前言 该功能用于导出数据到csv文件&#xff0c;并且前端进行下载操作。涉及到java后端以及前端。后端获取数据并处理&#xff0c;前端获取返回流并进行下载操作。csv与excel文件不大相同。如果对导出的数据操作没有很高要求的话&#xff0c;csv文件就够了。具体差异自行百度。我…

nodejs+vue教学辅助管理系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

nodejs+vue考研信息查询系统-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…