可编程定时计数器8253/8254 - 8253入门

时钟-给设备打拍子

概述

在计算机系统中,为了使所有设备之间的通信井然有序,各通信设备间必须有统一的节奏,不能各干各的,这个节奏就被称为定时或时钟

时钟并不是计算机处理速度的衡量,而是一种使设备间相互配合而避免发生冲突的节拍。时钟只是一种时间的度量,只是一种节奏,其时间长度并不统一,各种设备都有自己的时钟,也就是有自己的工作节拍

  • 比如处理器的时钟和外部设备的时钟肯定不是一个数量级
  • 让处理器这种高速设备以外部设备低速时钟工作,处理器肯定会觉得很闲
  • 而让低速的外部设备以处理器的时钟节拍工作,外部设备也许急得不知所措

时钟信号并不是专指处理器的时钟,也并不特指IRQ0上的时钟,表达的意思仅仅是设备自己的工作节拍、频率

时钟的分类

内部时钟

内部时钟是指处理器中内部元件,如运算器、控制器的工作时序,主要用于控制、同步内部工作过程的步调

内部时钟是由晶体振荡器产生的,简称晶振,它位于主板上,其频率经过分频之后就是主板的外频,处理器和南北桥之间的通信就基于外频

Intel处理器将此外频乘以某个倍数(也称为倍频)之后便称为主频

处理器取指令、执行指令中所消耗的时钟周期,都是基于主频的。内部时钟是由处理器固件结构决定的

外部器内部元件的工作速度是最快的,所有内部时钟的时间单位粒度比较精细,通常都是纳秒(ns)级

外部时钟

外部时钟是指处理器与外部设备或外部设备之间通信采用的一种时序,比如IO接口和处理器之间在A/D转换时的工作时序、两个串口设备之间进行数据传输时也要事先同步时钟等

外部设备的速度对于处理器来说就很慢了,所以其时钟的时间单位粒度较大,一般是毫秒(ms)级或秒(s)级

如何保证运行在不同时钟节拍下的设备能够同步通信?

应以处理器的内部时钟为依据来设计外部设备的时钟,既要符合处理器内部运行时序的规定,又要满足外部设备工作时序的要求

定时计数器就是用来解决时序配合问题的

已知处理器的内部时钟信号有晶振产生,故计时精准稳定。但晶振产生的信号频率过高,因此必须将其送到定时计数器分频,这才能产生所需要的各种定时信号

外部定时

软件实现

int cycle_cnt = 90000;
while (cycle_cnt --> 0)

让处理器执行9万次空循环,通过这种延迟方式达到一定的定时作用

但这种空兜处理器的代价是白白消耗时钟周期,处理器的资源是很宝贵的

硬件实现

这一类硬件称为定时器

计时器的功能就是定时发信号。当到达了所计数的时间,计数器可以自动发一个输出信号,可以用该信号向处理器发出中断,这样处理器可以执行相应的中断处理程序。或者用该信号直接启动某些外部设备

硬件定时器是独立的,可以同处理器并行工作,所以用硬件定时器定时的好处是节省处理器时间

可编程定时计数器

常用可编程定时计数器有 Intel 8253/8254/82C54。8253用的是倒计时的方式

如何修改计数值?

正计时

每一次时钟脉冲发生时,将当前计数值加1,直到与设定的目标终止值相等时,提示时间已到,典型的例子就是闹钟

倒计时

先设定好计数器的值,每一次时钟脉冲发生时将计数值减1,直到为0时提示时间已到,典型的例子就是电风扇的定时

8253入门

在这里插入图片描述

8253结构

在8253内部有3个独立的计数器,图7-45的右侧的3个计数器,分别是计数器0计数器2,它们的端口分别是0x400x42

计数器又称为通道,每个计数器都完全相同,都是16位大小

它们是独立的,也就是这三个计数器的工作是不依赖的,可以同时工作,各干各的。原因是各个计数器都有自己的一套寄存器资源,工作时自己用自己的,互不干涉

寄存器资源包括一个16位的计数初值寄存器、一个计数器执行部件和一个输出锁存器。其中,计数器执行部件是计数器中真正进行计数工作的元器件,其本质是个减法计数器

计数器的三个引角: CLK、GATE、OUT

CLK

CLK 表示时钟输入信号,即计数器自己工作的节拍,也就是计数器自己的时钟频率

每当此引脚收到一个时钟信号,减法计数器就将计数值减1

连接到此引脚的脉冲频率最高位10MHz, 8253为2MHz

GATE

GATE表示门控输入信号,在某些工作方式下用于控制计数器是否可以开始计数,在不同工作方式下GATE的作用不同,到时候同工作方式一同介绍

OUT

OUT表示计数器输出信号。当定时工作结束,也就是计数值为0时,根据计数器的工作方式,会在OUT引脚上输出相应的信号

此信号用来通知处理器或某个设备:定时完成

这样处理器或外部设备便可以执行相应的行为动作

计数流程

计数开始之前的计数初值保存在计数初值寄存器中,计数器执行部件(减去计数器)将此初值载入后,计数器的CLK引脚每收到一个脉冲信号,计数器执行部件(减法计数器)便将计数值减1,同时将当前计数值保存在输出锁存器

当计数值减到0时,表示定时工作结束,此时将通过OUT引脚发出信号,此信号可以用来向处理器发出中断请求,也可以直接启动某个设备工作

计数器内部各个结构的功能

计数初值寄存器、计数器执行部件和输出锁存器都是16位宽度的寄存器,所有高8位和低8位都可以单独访问

计数初值寄存器

计数初值寄存器用来保存计数器的初始值,它是16位宽度,对8253初始化时写入的计数初始值就保存在计数计数初值寄存器

它的作用是为计数器执行部件准备初始计数值,之后的计数过程与它无关。当计数器选择了某种重复计数的工作方式后,比如工作方式2和工作方式3,还需要将此计数初值重新装载到计数器执行部件中

计数器执行部件是计数器中真正“计数”的部件,计数的工作是由计数器执行部件完成的,所以它才是真正实际的计数器

减法计数器

8283是个倒计时计数器,原因是计数器执行部件是个16位的减法计数器,它从初值寄存器中拿到起始值,载入到自己的寄存器后便开始递减计数(注意:计数过程中不断变化的值称为当前计数值,它保存在执行部件自己的寄存器中,初值寄存器中的值不受影响)

输出锁存器

输出锁存器也称为当前计数值锁存器,用于把当前减去计数器中的计数值保存下来,其目的就是为了让外界可以随时获取当前计数器

计数器中的计数值是不断变化的,处理器无法直接从计数器中获取当前计数值

原因是这样的

  • 计数器的使命就是通过计数的方式实现定时功能,必须要求精准,所有绝不能为了获取计数值而停止计数

为了获取任意时刻的计数值,8253只有将它送到输出寄存器,此锁存器起到暂存寄存器的作用。这样处理器便能从输出锁存器中获取瞬时计数值

8253 计数器

在这里插入图片描述

计数器0的作用是产生时钟信号,这个时钟是指连接到主片IRQ0引脚上的那个时钟,也就是计数器0决定时钟中断信号的发生频率

参考资料

  • 可编程定时计数器8253/8254
  • 8253(8254)计时/计数器简介

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/37320.shtml

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

相关文章

【2024-06-21】网易互娱秋招实习笔试三道编程题解

恭喜发现宝藏!搜索公众号【TechGuide】回复公司名,解锁更多新鲜好文和互联网大厂的笔经面经。 作者@TechGuide【全网同名】 订阅专栏: 【专享版】2024最新大厂笔试真题解析,错过必后悔的宝藏资源! 第一题:阴阳师斗技 题目描述 小盖正在参加阴阳师的斗技。已知斗技的规…

Linux 磁盘挂载与分区

Linux 磁盘挂载与分区 vda1: 其中vd表示虚拟磁盘,a表示第一块磁盘,b表示第二块磁盘,1表示第一块磁盘的第一分区(显然两块磁盘都只有一个分区)图中可以看到,vda1磁盘只有一个分区,且全部挂载到根…

vue3使用vant4的列表vant-list点击进入详情自动滚动到对应位置,踩坑日记(一天半的踩坑经历)

1.路由添加keepAlive <!-- Vue3缓存组件&#xff0c;写法和Vue2不一样--><router-view v-slot"{ Component }"><keep-alive><component :is"Component" v-if"$route.meta.keepAlive"/></keep-alive><component…

如何在MySQL中按字符串中的数字排序

在管理数据库时&#xff0c;我们经常遇到需要按嵌入在字符串中的数字进行排序的情况。这在实际应用中尤为常见&#xff0c;比如文件名、代码版本号等字段中通常包含数字&#xff0c;而这些数字往往是排序的关键。本文将详细介绍如何在MySQL中利用正则表达式提取字符串中的数字并…

LiteDB - 一个单数据文件 .NET NoSQL 文档存储

LiteDB 一个小巧、快速、轻量级的 NoSQL 嵌入式数据库。 Serverless NoSQL 文档存储类似于 MongoDB 的简单 API100% C# 代码,支持 .NET 3.5 / .NET 4.0 / NETStandard 1.3 / NETStandard 2.0,单 DLL (小于 300 kb)支持线程和进程安全支持文档/操作级别的 ACID支持写失败后的数…

Google 发布最新开放大语言模型 Gemma 2,现已登陆 Hugging Face Hub

Google 发布了最新的开放大语言模型 Gemma 2&#xff0c;我们非常高兴与 Google 合作&#xff0c;确保其在 Hugging Face 生态系统中的最佳集成。你可以在 Hub 上找到 4 个开源模型 (2 个基础模型和 2 个微调模型) 。发布的功能和集成包括&#xff1a; Hub 上的模型https://hf.…

Java家教系统小程序APP公众号h5源码

让学习更高效&#xff0c;更便捷 &#x1f31f; 引言&#xff1a;家教新选择&#xff0c;小程序来助力 在快节奏的现代生活中&#xff0c;家长们越来越注重孩子的教育问题。然而&#xff0c;如何为孩子找到一位合适的家教老师&#xff0c;成为了许多家长头疼的问题。现在&…

交叉编译中的 --build、 --host和 --target

在交叉编译中比较常见的一些参数就是build、host和target了,正确的理解这三者的含义对于交叉编译是非常重要的,下面就此进行解释   --build=编译该软件所使用的平台   --host=该软件将运行在哪个平台   --target=该软件所处理的目标平台 我们经常会看到如下代码:   …

谷歌个人号,20人连续封测14天所需设备该怎么解决?

现在&#xff0c;在Google Play上架应用&#xff0c;对于大部分开发者来说&#xff0c;真的是不小的挑战&#xff0c;因为目前谷歌上架政策越来越严格了。特别是从2023年11月13日起&#xff0c;新政策要求个人开发者账号的应用必须经过20个独立用户连续14天的封闭测试&#xff…

【C语言】--分支和循环(1)

&#x1f37f;个人主页: 起名字真南 &#x1f9c7;个人专栏:【数据结构初阶】 【C语言】 目录 前言1 if 语句1.1 if1.2 else1.3 嵌套if1.4 悬空else 前言 C语言是结构化的程序设计语言&#xff0c;这里的结构指的是顺序结构、选择结构、循环结构。 我们可以用if、switch实现分支…

vue2实例实现一个初步的vuex

vue2实例实现一个初步的vuex 实现源码&#xff1a;vue2-review 1.App.vue 2.store目录下的index.js 3.效果 微信公众号&#xff1a;刺头拾年

MATLAB的.m文件与Python的.py文件:比较与互参

simulink MATLAB的.m文件与Python的.py文件&#xff1a;比较与互参相似之处**1. 基本结构****2. 执行逻辑****3. 可读性和维护性** 差异性**1. 语法特性****2. 性能和应用****3. 开发环境** 互相学习的可能性结论 MATLAB的.m文件与Python的.py文件&#xff1a;比较与互参 在编…

扩展阅读:什么是中断

如果用一句话概括操作系统的原理,那就是:整个操作系统就是一个中断驱动的死循环,用最简单的代码解释如下: while(true){doNothing(); } 其他所有事情都是由操作系统提前注册的中断机制和其对应的中断处理函数完成的。我们点击一下鼠标,敲击一下键盘,执行一个程序,…

重生之我要学后端100--计算机网络部分概念(持续更新)

TCP/IP、DNS、负载均衡器等等 前言一、TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;二、DNS&#xff08;域名系统&#xff09;三、负载均衡器其他网络概念 前言 了解网络基础知识对于后端开发者至关重要&#xff0c;因为这些知识有助于理解应用程序是如何在更广阔的…

中英双语介绍美国的州:麻省,马塞诸塞州(Massachusetts)

中文版 马萨诸塞州&#xff08;Massachusetts&#xff09;位于美国东北部的新英格兰地区&#xff0c;是美国历史最悠久、文化最丰富的州之一。以下是对马萨诸塞州各方面的详细介绍&#xff1a; 人口 截至2020年&#xff0c;美国人口普查数据显示&#xff0c;马萨诸塞州的人口…

C++ 之运算符

作用&#xff1a;用于执行代码的运算 主要的运算符类型&#xff1a; 运算符类型作用算术运算符用于处理四则运算赋值运算符用于将表达式的值赋给变量比较运算符用于表达式的比较&#xff0c;并返回一个真值或假植逻辑运算符用于根据表达式的值返回真值或假植 1 算术运算符 …

Spring MVC中的DispatcherServlet、HandlerMapping和ViewResolver的作用

在Spring MVC框架中&#xff0c;DispatcherServlet、HandlerMapping和ViewResolver是核心组件&#xff0c;它们各自承担着不同的角色和任务&#xff1a; 1.DispatcherServlet&#xff1a;它是Spring MVC生命周期中的前端控制器&#xff0c;负责接收HTTP请求并将它们分发给相应的…

5.x86游戏实战-CE定位基地址

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;4.x86游戏实战-人物状态标志位 上一个内容通过CE未知的初始值、未变动的数值、…

机器学习SVR 随机森林 RBF神经网络做回归预测的MATLAB代码

SVR 参考这篇文章 Libsvm使用笔记【matlab】 close all; clc clear %% 下载数据 load(p_train.mat); load(p_test.mat); load(t_train.mat); load(t_test.mat); %% 数据归一化 %输入样本归一化 [pn_train,ps1] mapminmax(p_train); pn_train pn_train; pn_test mapminma…

设置用户访问hdfs

如果hadoop没有启Kerberos或者从Kerberos获取的用户为null&#xff0c;那么获取HADOOP_USER_NAME环境变量&#xff0c;并将它的值作为Hadoop执行用户。如果我们没有设置HADOOP_USER_NAME环境变量&#xff0c;那么程序将调用whoami来获取当前用户&#xff0c;并用groups来获取用…