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

【单片机基础】定时器/计数器的工作原理

单片机中的定时器/计数器(Timer/Counter)是用于时间测量和事件计数的重要模块。它们可以用来生成精确的延时、测量外部信号的频率或周期、捕获外部事件的时间戳等。理解定时器/计数器的工作原理对于单片机编程和系统设计非常重要。以下是定时器/计数器的基本工作原理和常见功能的详细介绍:

1. 定时器/计数器的基本概念

1.1 定时器(Timer)
  • 功能:用于生成精确的时间延迟。
  • 工作原理:定时器通过内部时钟源(通常是单片机的系统时钟)进行递增计数,达到设定值后产生中断或触发特定事件。
1.2 计数器(Counter)
  • 功能:用于对外部事件进行计数。
  • 工作原理:计数器通过外部输入信号进行递增计数,达到设定值后产生中断或触发特定事件。

2. 定时器/计数器的结构

2.1 计数寄存器(Counter Register)
  • 功能:存储当前的计数值。
  • 位宽:常见的位宽有8位、16位和32位。
2.2 预分频器(Prescaler)
  • 功能:对输入时钟进行分频,降低计数频率。
  • 作用:增加定时器/计数器的范围和分辨率。
2.3 模寄存器(Mode Register)
  • 功能:设置定时器/计数器的工作模式。
  • 常见模式
    • 定时器模式:内部时钟源计数。
    • 计数器模式:外部时钟源计数。
    • 自动重装载模式:计数器达到设定值后自动重新加载初始值。
    • 捕捉模式:捕获外部事件的时间戳。
    • 比较模式:比较计数值和预设值,匹配时产生中断。
2.4 控制寄存器(Control Register)
  • 功能:控制定时器/计数器的启停、中断使能等。
  • 位设置
    • 启动位:控制定时器/计数器的启停。
    • 中断使能位:控制是否产生中断。
    • 工作模式位:设置定时器/计数器的工作模式。

3. 定时器/计数器的工作原理

3.1 定时器模式
  • 工作过程
    1. 初始化:设置定时器的工作模式、初始值和中断使能。
    2. 启动:通过控制寄存器启动定时器。
    3. 计数:定时器根据内部时钟源递增计数。
    4. 比较:当计数值达到设定值时,产生中断或触发特定事件。
    5. 重载:如果是自动重装载模式,计数器自动重新加载初始值,继续计数。
3.2 计数器模式
  • 工作过程
    1. 初始化:设置计数器的工作模式、初始值和中断使能。
    2. 启动:通过控制寄存器启动计数器。
    3. 计数:计数器根据外部输入信号递增计数。
    4. 比较:当计数值达到设定值时,产生中断或触发特定事件。
    5. 重载:如果是自动重装载模式,计数器自动重新加载初始值,继续计数。

4. 定时器/计数器的配置

4.1 设置工作模式
  • 示例代码(C语言,假设使用8051单片机)
    // 设置定时器0为模式1(16位定时器)
    TMOD = 0x01;  // 设置定时器0的工作模式
    TH0 = 0xFC;   // 设置高8位初始值
    TL0 = 0x18;   // 设置低8位初始值
    TR0 = 1;      // 启动定时器0
    ET0 = 1;      // 使能定时器0中断
    EA = 1;       // 使能全局中断
4.2 设置预分频器
  • 示例代码(C语言,假设使用STM32单片机)
    // 设置定时器2的预分频器
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 9999;   // 自动重装载值
    TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 预分频器值
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    TIM_Cmd(TIM2, ENABLE); // 启动定时器2
4.3 中断处理
  • 示例代码(C语言,假设使用8051单片机)
    void Timer0_ISR() interrupt 1 {// 清除定时器0中断标志TF0 = 0;// 执行中断服务程序// ...
    }void main() {// 初始化定时器0TMOD = 0x01;  // 设置定时器0为模式1TH0 = 0xFC;   // 设置高8位初始值TL0 = 0x18;   // 设置低8位初始值TR0 = 1;      // 启动定时器0ET0 = 1;      // 使能定时器0中断EA = 1;       // 使能全局中断while (1) {// 主程序循环}
    }

5. 实际应用示例

5.1 定时器生成延时
  • 示例代码(C语言,假设使用8051单片机)
    #include <8051.h>void Timer0_ISR() interrupt 1 {static unsigned int count = 0;TF0 = 0;  // 清除定时器0中断标志count++;if (count >= 1000) {  // 延时1秒count = 0;// 执行延时后的操作}
    }void main() {TMOD = 0x01;  // 设置定时器0为模式1TH0 = 0xFC;   // 设置高8位初始值TL0 = 0x18;   // 设置低8位初始值TR0 = 1;      // 启动定时器0ET0 = 1;      // 使能定时器0中断EA = 1;       // 使能全局中断while (1) {// 主程序循环}
    }
5.2 计数器测量外部信号频率
  • 示例代码(C语言,假设使用STM32单片机)
    #include "stm32f10x.h"void TIM2_Config(void) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;// 使能TIM2和GPIOA的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置PA0为输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  // 上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置TIM2TIM_TimeBaseStructure.TIM_Period = 65535;  // 自动重装载值TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 预分频器值TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);// 配置TIM2的输入捕获通道TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;TIM_ICInitStructure.TIM_ICFilter = 0x00;TIM_ICInit(TIM2, &TIM_ICInitStructure);// 使能TIM2的中断TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);// 配置NVICNVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 启动TIM2TIM_Cmd(TIM2, ENABLE);
    }void TIM2_IRQHandler(void) {if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {// 清除中断标志TIM_ClearITPendingBit(TIM2, TIM_IT_Update);// 执行中断服务程序// ...}
    }int main(void) {TIM2_Config();while (1) {// 主程序循环}
    }

总结

定时器/计数器是单片机中非常重要的模块,通过合理配置和使用,可以实现多种时间测量和事件计数功能。

相关文章:

【单片机基础】定时器/计数器的工作原理

单片机中的定时器/计数器&#xff08;Timer/Counter&#xff09;是用于时间测量和事件计数的重要模块。它们可以用来生成精确的延时、测量外部信号的频率或周期、捕获外部事件的时间戳等。理解定时器/计数器的工作原理对于单片机编程和系统设计非常重要。以下是定时器/计数器的…...

ModuleNotFoundError: No module named ‘distutils.msvccompiler‘ 报错的解决

报错 在conda 环境安装 numpy 时&#xff0c;出现报错 ModuleNotFoundError: No module named distutils.msvccompiler 解决 Python 版本过高导致的&#xff0c;降低版本到 Python 3.8 conda install python3.8即可解决。...

HCIA笔记2--ARP+ICMP+VRP基础

1. ARP ARP: 地址解析协议(address resolve protocol)。 网络数据包在通信的时候一般是使用 I P IP IP地址进行通信。 但是在封装数据链路层的时候是需要目标 m a c mac mac地址的。 而 A R P ARP ARP协议实现的功能就是根据 I P IP IP地址来获得 m a c mac mac地址。 1.1 a…...

SpringBoot与MongoDB深度整合及应用案例

SpringBoot与MongoDB深度整合及应用案例 在当今快速发展的软件开发领域&#xff0c;NoSQL数据库因其灵活性和可扩展性而变得越来越流行。MongoDB&#xff0c;作为一款领先的NoSQL数据库&#xff0c;以其文档导向的存储模型和强大的查询能力脱颖而出。本文将为您提供一个全方位…...

Redis模拟延时队列 实现日程提醒

使用Redis模拟延时队列 实际上通过MQ实现延时队列更加方便&#xff0c;只是在实际业务中种种原因导致最终选择使用redis作为该业务实现的中间件&#xff0c;顺便记录一下。 该业务是用于日程短信提醒&#xff0c;用户添加日程后&#xff0c;就会被放入redis队列中等待被执行发…...

vue项目中富文本编辑器的实现

文章目录 vue前端实现富文本编辑器的功能需要用到第三方库1. 安装包2.全局引入注册3.组件内使用4.图片缩放功能实现①安装包②注册并添加配置项③报错解决 vue前端实现富文本编辑器的功能需要用到第三方库 vue2使用vue-quill-editor&#xff0c;vue3使用vueup/vue-quill&#…...

nginx 配置lua执行shell脚本

1.需要nginx安装lua_nginx_module模块,这一步安装时&#xff0c;遇到一个坑&#xff0c;nginx执行configure时&#xff0c;一直提示./configure: error: unsupported LuaJIT version&#xff1b; ngx_http_lua_module requires LuaJIT 2.x。 网上一堆方法都试了&#xff0c;都…...

Keil+VSCode优化开发体验

目录 一、引言 二、详细步骤 1、编译器准备 2、安装相应插件 2.1 安装C/C插件 2.2 安装Keil相关插件 3、添加keil环境变量 4、加载keil工程文件 5、VSCode中成功添加工程文件后可能出现的问题 5.1 编码不一致问题 6、在VSCode中进行编译工程以及烧录程序 7、效果展示…...

vue2中引入cesium全步骤

1.npm 下载cesium建议指定版本下载&#xff0c;最新版本有兼容性问题 npm install cesium1.95.0 2.在node_models中找到cesium将此文件下的Cesium文件复制出来放在项目的静态资源public中或者static中&#xff0c;获取去github上去下载zip包放在本地也可以 3.在index.html中引…...

工程师 - 智能家居方案介绍

1. 智能家居硬件方案概述 智能家居硬件方案是实现家庭自动化的重要组件&#xff0c;通过集成各种设备来提升生活的便利性、安全性和效率。这些方案通常结合了物联网技术&#xff0c;为用户提供智能化、自动化的生活体验。硬件方案的选择直接影响到智能家居系统的性能、兼容性、…...

中小企业人事管理:SpringBoot框架高级应用

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;中小企业人事管理系统当然也不能排除在外。中小企业人事管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和…...

嵌入式Linux驱动开发日记

目录 让我们从环境配置开始 目标平台 从Ubuntu开始 从交叉编译器继续 arm-linux-gnueabihf-gcc vscode 没学过ARM汇编 正文开始——速度体验一把 写一个链接脚本 写一个简单的Makefile脚本 使用正点原子的imxdownload下载到自己的SD卡上 更进一步的笔记和说明 从IM…...

迪杰特斯拉算法(Dijkstra‘s)

迪杰斯特拉算法&#xff08;Dijkstras algorithm&#xff09;是由荷兰计算机科学家艾兹格迪科斯彻&#xff08;Edsger W. Dijkstra&#xff09;在1956年提出的&#xff0c;用于在加权图中找到单个源点到所有其他顶点的最短路径的算法。这个算法广泛应用于网络路由、地图导航等领…...

reids基础

数据结构类型 String setnx //设置key不存在&#xff0c;则添加成功 setex name 10 jack // key 10s失效&#xff0c;自动删除 hash hset hget list 按添加数据排序 lpush //左侧插入 rpush //右侧插入 set 不重复 sadd //添加…...

私有化部署视频平台EasyCVR宇视设备视频平台如何构建视频联网平台及升级视频转码业务?

在当今数字化、网络化的时代背景下&#xff0c;视频监控技术已广泛应用于各行各业&#xff0c;成为保障安全、提升效率的重要工具。然而&#xff0c;面对复杂多变的监控需求和跨区域、网络化的管理挑战&#xff0c;传统的视频监控解决方案往往显得力不从心。 EasyCVR视频融合云…...

SparkContext讲解

SparkContext讲解 什么是 SparkContext&#xff1f; SparkContext 是 Spark 应用程序的入口点&#xff0c;是 Spark 的核心组件之一。每个 Spark 应用程序启动时&#xff0c;都会创建一个 SparkContext 对象&#xff0c;它负责与集群管理器&#xff08;如 YARN、Mesos 或 Spa…...

MODBUS TCP转CANOpen网关

Modbus TCP转CANopen网关 型号&#xff1a;SG-TCP-COE-210 产品用途 本网关可以实现将CANOpen接口设备连接到MODBUS TCP网络中&#xff1b;并且用户不需要了解具体的CANOpen和Modbus TCP 协议即可实现将CANOpen设备挂载到MODBUS TCP接口的 PLC上&#xff0c;并和CANOpen设备…...

渗透测试---shell(4)脚本与用户交互以及if条件判断

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人一律不承担一切后果 目录 一、shell脚本与用户进行交互 使用 read 指…...

02_Spring_IoC实现

接下来先简单说一下关于IoC的一些要点,后面我们再详细一步一步讨论。 一、IoC控制反转 IoC控制反转它是一种思想,不是具体的实现控制反转的目的是为了降低程序的耦合度,提高程序的可扩展性,从而满足OCP原则和DIP原则控制反转,那到底反转是什么东西? 我们不再使用某个对象…...

使用Python3实现Gitee码云自动化发布

仓库信息 https://gitee.com/liumou_site/ip 实现代码 import osimport requests from loguru import loggerdef gitee(ver, message, prerelease: bool False):"""在 Gitee 上创建发布版本:param ver: 版本号:param message: 发布信息:param prerelease: 是…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...