计数器/定时器8253的基本介绍和功能——(一)

在系统中,常常需要对事件进行定时或者计数,定时的方法有很多,常用的方法分为三种:软件定时、不可编程的硬件定时和可编程的硬件定时。

 

  • 软件定时:比如循环一段延时子程序,但是这种方式不同的机器所产生的延时不一样,而且程序会占用CPU时间。

  • 不可编程的硬件定时:延长时间的长短固定,不够灵活。

  • 可编程的硬件定时:以上优点都包括,且应用灵活。用到芯片,比如常用的8253计数器。


 

因此这篇文章着重介绍8253的芯片功能,以及它的内部构造。

 

组成结构:

82533个独立的16位计数器通道组成的,它们单独工作,每次通过程序编码选择要工作的通道。计数器有6种工作方式,也是通过编程设定。此外,还可以按照二进制或者BCD十进制的方式计数。

 

由此可以看出,在编程设定的代码中(也就是所谓的“控制字”),需要包含:

1、 通道的选择 

由于有三个通道,因此需要两位。00 01 10 分别代表计数器012

2、 工作方式的选择

一共有6种工作方式,因此需要3位。000 001 X10 X11 100 101 分别代表方式0 ~方式5

3、 进制的选择

有两种进制,因此一位就够。0代表二进制,1代表十进制。

 

然而,一个字有8位,这才占了其中的6位,剩下的两位做什么呢?这件事先放一放,我们先来看看芯片的内部构造和引脚。(图片来源:百度百科)

计数器/定时器8253的基本介绍和功能——(一)_第1张图片

右边就是刚才提到的3个计数器通道,CLK是输入的时钟信号,计数器会根据输入的时钟信号根据不同的方式输出信号,即从OUT输出。GATE为门控信号,高电平有效,低电平时禁止通道工作。

左边可以注意到,有数据总线缓冲器读写控制电路控制字寄存器。这些都与CPU对这个芯片的读写控制有关。

数据总线缓冲器我们可以注意到,只有8位。这是一个双向缓冲器。这个的作用就是写入或读取数值,在CPU8253之间传递。


那么如何知道要写入还是读取,要对计数器还是寄存器操作呢?读写控制电路的作用就在这里。CS#(这里 代表取反,下同)是低电平有效的,表示选中这个8253芯片。RD#WR#也是低电平有效,表示读或者写操作,通常分别与控制总线的IORCIOWC相连。A0A1引脚用来确定是对控制字寄存器还是哪个计数器进行操作。共有00 01 10 11四种组合,11表示对寄存器的写操作。

控制字寄存器就是初始化的时候由CPU写入控制字的内容,决定哪个通道用什么方式工作,只能写不能读

 

在介绍完8253的引脚之后,我们回到刚才的问题:控制字剩下的2位做什么用呢?

我们已经知道,8253的数据引脚只有8个,也就是说,一次只能传送8位数据。而重点是,我们的计数器,是16位的(这在一开头就已经提到了)!所以这两位的功能,就是选择传送方式的。

01代表传送低8位,10代表传送高8位,11代表传送16位,先低后高。00则比较特殊,是将计数器中的当前数据锁存到计数输出寄存器中。

这里我又引入了一个新的名词:计数输出寄存器。这与计数器通道的内部构造和引脚有关,等下我会写。我们先继续我们的“控制字”。

至此,控制字的格式就已经确定,顺序如下图所示(图片来源:百度): 

计数器/定时器8253的基本介绍和功能——(一)_第2张图片


讲到这里,我就要重新再提到8253的目的了。其实定时的方法有很多种,8253使用的只是其中的一种。用几个字概括其本质的话,就是倒计时。所谓的定时,对于8253而言,就是设定好一个数,然后按照时钟信号对其进行减法操作,直到那个数为零。

结合刚才提到的我们可以知道,在初始化8253的时候,我们需要写入两个关键的数:一个是控制字,表示其工作方式等等;一个是计数初值,也可以理解为定时的值。由此,对于8253的初始化编程就很容易理解了。PC默认分配给8253的端口地址为40H~ 43H。三个计数器的端口地址分别为40H~42H,控制字寄存器的端口址为43H

只要要求一提出,就很容易可以写出代码。唯一需要注意的是计数初值与进制的关系,注意储存的形式要一致。关于计数器通道内部的图没有在网上找到合适的,在百度上找了这样的图意思一下吧。

计数器/定时器8253的基本介绍和功能——(一)_第3张图片

想象成这是其中一个通道。。。。。。

在通道里,其实还有3个寄存器,包括控制寄存器初始值寄存器计数输出寄存器。需要注意的是,控制寄存器只有6位,也就是控制字的高2位确定使用哪个计数器后,低6位进入此计数器的控制寄存器。

此外,通道中还有一个16位的1计数器,初值由初始值寄存器送来。此计数器在CLK引脚输入的时钟脉冲每出现一次时,都会进行减1计数,直到计数器减到0OUT引脚就会输出相应的信号。CPU要读取计数值时,可以直接从计数器读取。但是为了避免错误也避免对计数器工作的干扰,我们通常从计数输出寄存器读取,这时就需要先把数值锁存在寄存器中。

对了,输入时钟周期不可以小于380ns。虽然不知道这是什么原理。_(:зゝ∠)_

 

以上,对于8253的基本介绍就做完了。接下来是一个大头:8253的工作方式。写在下一篇文章里。

 

 

【转载请注明作者✧(≖ ◡ ≖✿)】

2015/12/21

你可能感兴趣的:(计数器/定时器8253的基本介绍和功能——(一))