8253可编程计数(计时)器

为啥要有这个芯片呢,这个芯片能够做些什么呢,我们先举几个例子来说明白8523的作用,如下几张图:

  1. 如右下角的214天这个时间的产生

  1. 计算机上的日期和时间

  1. 文件中显示的修改时间

  1. 举一个生活中的例子:定时开启或关闭的电器,如定时煲饭,定时开启热水器

看了上面的几张图和;例子,至少我们可以知道8253芯片与时间有关系,比如:系统基准定时、动态存储器的刷新定时、扬声器音调及磁盘驱动的定时等,为了支持这些功能,硬件上有了8253,软件上有了定时/计数系统。

一:8253内部结构

1.了解一款芯片,先从结构入手:

  1. 计数器:8253主要功能的完成者,其他的部件为它打辅助。
  • 8253有3个计数器通道,计数器0,计数器1.计数器2,每个计数器都由16位锁存寄存器和一个16位减1寄存器组成。
  • 每个计数器有3根信号线,分别是两根输入信号,即时钟信号CLK,门控制信号GATE信号,一根输出信号OUT。
  • 送入每个计数器的初值经锁存器传送给减1寄存器,当每个计数器从时钟输入端接收时钟脉冲或事件计数脉冲时,计数器就执行减1操作,直至减到0,然后由输出端OUT产生一个输出信号或电平。
  1. 数据总线缓冲器:它是8253与CPU之间的数据接口,CPU通过数据总线缓冲器将初始值给计数器,把控制字写入8253控制寄存器中。
  1. 读/写逻辑:这个好理解,来接收CPU的控制信号,包括读、写信号和地址信号,实现对8253各计数器和控制器的读写操作。
  1. 控制寄存器:每个计数器都有一个相应的控制寄存器,用于接收CPU送来的控制字,(控制字:首先这个玩意有一个字这么长,其次这个字中包含了许多的信息:比如计数器的工作方式、计数形成及输出方式等。

以下表格中内容仅观理解使用,纯纯的水货【哈哈哈,干活太多容易噎到,就着水喝,知识更容易消化】

我们这里用一个实例将抽象的概念变得具体一些:我们用定时煲饭的例子来说明8253各部件都做了些什么:

演员:人--->CPU ,电饭煲 --->8255芯片

我们用电饭煲煲饭,首先需要明确的是:煲饭还是煲汤,然后给电饭煲进行设置,比如:明天早上想喝一碗入口留香的xxx粥,但是又不想起的太早去做,所以我们想到了定时功能,入睡前(此时是22:00)将食材放入电饭煲中;

站在我们人的角度看:煲粥用时1小时,明天早上6.00起,所以要让电饭煲5点起来工作;

站在电饭煲的角度看:电饭煲需要在7个小时后启动,进行煲粥的工作,(注意:这里不是煲饭)

那电饭煲是不是要记住两件事,一件是7小时后,一件是煲粥,所以数据总线缓冲器记录了时间,7小时换算成秒,每过1秒就减1,直到减到0,ok,通过输出端OUT发送一条启动电饭煲的命令,控制寄存器:记录着煲粥工作这个任务,等电饭煲启动后,告诉电饭煲执行煲粥操作,而不是煲饭。

我们继续说,煲粥,粥也有好几种粥哇(作者专门去了厨房看了一眼电饭煲),比如:腰果松仁粥,这种粥和其他粥比起来要求就是一定要煮的软一些,所以在告诉电饭煲启动的命令中就包含了一些信息,通过这些信息电饭煲就就知道了该怎么工作了(这些信息很重要,比如:用煮腰果的温度煮绿豆,那不都煮成泥了吗,反之,用煮绿豆的温度,煮腰果,那能煮软?)

我们在来说一下上面,红色的部分:这里提到,每过1秒就减1,那么这个1秒怎么知道的呢?这就涉及到了时钟输入端(CLK),如下图,CLK波形,假设红色区域一个周期代表1秒,so,8253就是通过(CLK时钟信号)这么数来确定时间的。

其次,8253中有3个计数器,它们除了名字不一样,其他都一样,我们上面说过8253干活的是计数器,其他得到部件是打辅助的,那么具体让哪个计数器干活呢,所以CPU发送的控制字中除了包含定多长时间还有计数器的选择(也就是说告诉电饭煲要怎么煮粥,大火还是小火)

2.8253的方式控制字

上面我们对8253芯片大概做什么,大概怎么去做,简单介绍了一些,其中提到了控制字这个玩意,这个控制字我们可以理解成一个四字词语,短短四个字,字字有含义,需要很多字来说的话用四个字就能完美的表达真意。所以我们在这里的控制字,也是有很多含义,每个数字都代表了一段信息,如:控制器的选择、读写格式、工作方式选择、数值选择;

在说控制字之前,先来说一说8253的引脚及其功能,CPU发送的控制字通过数据总线缓冲器来接收,

  • 数据总线缓冲器占用了D0-D7引脚,也就是说CPU发送的控制字通过D0-D7引脚进入8253
  • 煲汤还是煲粥,也需要被告知,所CPU通过A0、A1引脚来选择计数器或控制寄存器
  • #CS:片选信号
  • #RD(输入):与A0、A1和#CS信号配合读取指定计数器的当前值,通常与系统总线的#IOR信号连接
  • #WR(输出):与A0、A1和#CS信号配合给指定的计数器写入控制字或设定初始值,通常与系统总线的#IOW信号连接。
  • CKL0-2(输入):每个计数器的时间脉冲输入端,CLK时钟信号用于控制计数器的减1操作。CLK最高频率可达5MHZ。
  • CATE0-2(输入):门控信号输入端,即计数器的控制输入信号,用来控制计数器工作或者复位
  • OUT0-2:(输出):计数器输出信号,当相应的计数器值减到0时,该段输出标志信号,在不同的工作方式下,OUT的输出波形不同。

引脚说完了,进入该节点的正题吧,如下图所示:

3.8253的6种工作方式

  • 这六种的工作方式的区别在于:它们启动计数器进行计数的触发方式不同,计数过程中,门控信号GATE对计数操作的影响不同,计数结束后OUT输出线上的输出波形不同。
  • 工作过程中需要两个写脉冲,第一个脉冲写入控制字,第二个脉冲写入计数初值,其中最大计数初值为0,因为它工作过程是自减过程。
  • 每个计数器的控制命令字均送入控制寄存器
  • 各计数器的计数初值送到该计数器的计数寄存器及初值寄存器。


  • 方式0
  • 软件启动不自动重复计数
  • 计数结束输出高电平
  • 其输出信号可用于外部可屏蔽中断请求信号

  • 方式1
  • 硬件启动不自动重复计数
  • 计数开始输出低电平,结束后在变高

  • 方式2
  • 软硬件启动,自动重复计数
  • 计数到最后一个脉冲时输出低电平

  • 方式3
  • 软硬件启动,自动重复计数
  • 输出对称波形

  • 方式4
  • 软件启动不自动重复计数
  • 计数结束输出一个CLK宽度的低电平

  • 方式5
  • 硬件启动不自动重复计数
  • 波形与方式4相同

4.频率与周期的关系

上面涉及到了波形,那么肯定会涉及到周期,提到周期,就和频率有关了,频率的单位是Hz、KHz、MHz、GHz,频率的倒数就是周期,所以:

1Hz = 1s

1KHz = 1ms(毫秒)

1MHz =1um(微秒)

1GHz=1ns(纳秒)

利用8253的计数器通道2产生频率为10000Hz的方波,设计数时钟脉冲的频率是10000Hz。则其初始化的过程为:
MOV AL 10110110B
//先传递控制字,使用计数器2,所以是10
//其次是先写低位再写高位,所以是11
//提到方波,所以是方式3 011
//最后采用二进制,所以是0
OUT COTR,AL //将控制字写入控制寄存器
MOV AX,1
//因为要求是产生10000Hz的方波,而时钟脉冲正好是10000Hz,所以这里的计数初始值为1
OUT CTN2,AL //先写计数初值低字节
MOV AL,AH
OUT CTR2,AL //再写计数初值高字节
这个高低字节没看懂的话,再看第二个例题

若选择通道0,工作在方式1,计数初值为2350H,按十进制计数,并设计8253端口地址为40H~43H,则其初始化过程为:
MOV AL,33H;控制字:计数器0,先低位后高位,方式1,十进制
OUT 43H,AL;写入控制字到8253的控制寄存器中
MOV AL,50H;
OUT 40H,AL;计数初值低字节
MOV AL,23H;
OUT 40H,AL;计数初值高字节

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章