在系统中,常常需要对事件进行定时或者计数,定时的方法有很多,常用的方法分为三种:软件定时、不可编程的硬件定时和可编程的硬件定时。
软件定时:比如循环一段延时子程序,但是这种方式不同的机器所产生的延时不一样,而且程序会占用CPU时间。
不可编程的硬件定时:延长时间的长短固定,不够灵活。
可编程的硬件定时:以上优点都包括,且应用灵活。用到芯片,比如常用的8253计数器。
因此这篇文章着重介绍8253的芯片功能,以及它的内部构造。
组成结构:
8253由3个独立的16位计数器通道组成的,它们单独工作,每次通过程序编码选择要工作的通道。计数器有6种工作方式,也是通过编程设定。此外,还可以按照二进制或者BCD十进制的方式计数。
由此可以看出,在编程设定的代码中(也就是所谓的“控制字”),需要包含:
1、 通道的选择
由于有三个通道,因此需要两位。00 01 10 分别代表计数器0、1、2
2、 工作方式的选择
一共有6种工作方式,因此需要3位。000 001 X10 X11 100 101 分别代表方式0 ~方式5。
3、 进制的选择
有两种进制,因此一位就够。0代表二进制,1代表十进制。
然而,一个字有8位,这才占了其中的6位,剩下的两位做什么呢?这件事先放一放,我们先来看看芯片的内部构造和引脚。(图片来源:百度百科)
右边就是刚才提到的3个计数器通道,CLK是输入的时钟信号,计数器会根据输入的时钟信号根据不同的方式输出信号,即从OUT输出。GATE为门控信号,高电平有效,低电平时禁止通道工作。
左边可以注意到,有数据总线缓冲器、读写控制电路和控制字寄存器。这些都与CPU对这个芯片的读写控制有关。
数据总线缓冲器我们可以注意到,只有8位。这是一个双向缓冲器。这个的作用就是写入或读取数值,在CPU与8253之间传递。
那么如何知道要写入还是读取,要对计数器还是寄存器操作呢?读写控制电路的作用就在这里。CS#(这里 # 代表取反,下同)是低电平有效的,表示选中这个8253芯片。RD#和WR#也是低电平有效,表示读或者写操作,通常分别与控制总线的IORC和IOWC相连。A0和A1引脚用来确定是对控制字寄存器还是哪个计数器进行操作。共有00 01 10 11四种组合,11表示对寄存器的写操作。
控制字寄存器就是初始化的时候由CPU写入控制字的内容,决定哪个通道用什么方式工作,只能写不能读。
在介绍完8253的引脚之后,我们回到刚才的问题:控制字剩下的2位做什么用呢?
我们已经知道,8253的数据引脚只有8个,也就是说,一次只能传送8位数据。而重点是,我们的计数器,是16位的(这在一开头就已经提到了)!所以这两位的功能,就是选择传送方式的。
01代表传送低8位,10代表传送高8位,11代表传送16位,先低后高。00则比较特殊,是将计数器中的当前数据锁存到计数输出寄存器中。
这里我又引入了一个新的名词:计数输出寄存器。这与计数器通道的内部构造和引脚有关,等下我会写。我们先继续我们的“控制字”。
至此,控制字的格式就已经确定,顺序如下图所示(图片来源:百度):
讲到这里,我就要重新再提到8253的目的了。其实定时的方法有很多种,8253使用的只是其中的一种。用几个字概括其本质的话,就是倒计时。所谓的定时,对于8253而言,就是设定好一个数,然后按照时钟信号对其进行减法操作,直到那个数为零。
结合刚才提到的我们可以知道,在初始化8253的时候,我们需要写入两个关键的数:一个是控制字,表示其工作方式等等;一个是计数初值,也可以理解为定时的值。由此,对于8253的初始化编程就很容易理解了。PC默认分配给8253的端口地址为40H~ 43H。三个计数器的端口地址分别为40H~42H,控制字寄存器的端口址为43H。
只要要求一提出,就很容易可以写出代码。唯一需要注意的是计数初值与进制的关系,注意储存的形式要一致。关于计数器通道内部的图没有在网上找到合适的,在百度上找了这样的图意思一下吧。
想象成这是其中一个通道。。。。。。
在通道里,其实还有3个寄存器,包括控制寄存器、初始值寄存器和计数输出寄存器。需要注意的是,控制寄存器只有6位,也就是控制字的高2位确定使用哪个计数器后,低6位进入此计数器的控制寄存器。
此外,通道中还有一个16位的减1计数器,初值由初始值寄存器送来。此计数器在CLK引脚输入的时钟脉冲每出现一次时,都会进行减1计数,直到计数器减到0,OUT引脚就会输出相应的信号。CPU要读取计数值时,可以直接从计数器读取。但是为了避免错误也避免对计数器工作的干扰,我们通常从计数输出寄存器读取,这时就需要先把数值锁存在寄存器中。
对了,输入时钟周期不可以小于380ns。虽然不知道这是什么原理。_(:зゝ∠)_
以上,对于8253的基本介绍就做完了。接下来是一个大头:8253的工作方式。写在下一篇文章里。
【转载请注明作者✧(≖ ◡ ≖✿)】
2015/12/21