Intel 8259A可编程中断控制器是专门用于系统中断管理的大规模集成电路芯片,在IBM-PC/XT系统中使用了一片8259A,在PC/AT系统中使用了两片8259A。目前,PC系列微型计算机的外围控制芯片都集成有与两片8259A相当的中断控制电路。
在一个计算机系统中,中断控制器是专门用来管理I/O中断的部件,它的功能是接收外部中断源的中断请求,并对中断请求进行处理后再向CPU发出中断请求,然后由CPU响应中断并进行处理。在CPU响应中断的过程中,中断控制器仍然负责管理外部中断源的中断请求,从而实现中断的嵌套与禁止。Intel 8259A是一种可编程的中断控制器,它有如下功能。
· 可管理8个中断源电路的中断,并对其进行优先级管理。
· 具有8级中断优先控制,通过级联可以扩展至64级优先权控制。
· 对中断源有屏蔽或允许申请中断的操作。
· CPU响应中断时能自动提供中断类型码。
一个中断控制器应具有如下的功能:接收外部的中断请求,向CPU发送中断请求;进行优先权级别的判断,把当前优先权最高的中断源的中断类型号送往CPU;CPU响应中断,进入中断服务后,当优先权更高的外部中断请求产生时,中断控制器能够实现中断的嵌套,反之,对于优先权较低的中断请求则予以屏蔽。8259A中断控制器的具体性能如下。
· 具有8级优先权控制,通过级联可以扩展至64级。
· 每一级都可以由编程进行屏蔽或开放。
· 在中断响应周期,8259A可以提供相应的中断类型号。
· 可以通过编程来选择8259A的各种工作方式。
8259A把中断源识别、中断优先权排队、中断屏蔽、提供中断向量等功能集于一身,因而能方便地进行外部中断的管理。通过对8259A进行编程,就可以管理8~64级优先权中断,设定中断类型号以及中断请求方式和优先权模式。
8259A的内部结构及外部引脚如图6-6所示,它的主要组成部分如下。
IRR是一个8位的锁存器,用来锁存外部设备送来的IR7~IR0中断请求信号。当外部中断请求线IRi变为高电平时,IRR中与之对应的第i位被置为1。这个寄存器的内容可以被CPU读出。
图6-6 8259A内部结构
IMR是一个8位的寄存器,用于设置中断请求的屏蔽信息。此寄存器的第i位被置1时,与之对应的外部中断请求线IRi被屏蔽,不能向CPU发出INT信号。可通过软件设置IMR的内容确定每一个中断请求的屏蔽状态。设置IMR也可以起到改变中断请求优先级的效果。
ISR是一个8位的寄存器,用于记录当前正在被服务的所有中断级,包括尚未服务完而中途被更高优先级打断的中断级。若CPU响应了IRi中断请求,则ISR中与之对应的第i位置1。该中断处理结束前要使用指令清除此位。此寄存器可以被CPU读出。
优先权处理器用于识别和管理各中断请求信号的优先级别。当几个中断请求信号同时出现时,优先权处理器根据控制逻辑规定的优先级规则和IMR的内容判断这些请求信号的最高优先级。CPU响应中断请求时,把优先权最高的IRR中的中断送入ISR。8259A正在为某一级中断服务时,若出现新的中断请求,则由优先权处理器判断新出现的中断请求的优先级别是否高于正在处理的那一级。若是,则进入多重中断处理。
在8259A的控制逻辑电路中,有一组初始化命令字寄存器ICW1~ICW4和一组操作命令字寄存器OCW1~OCW3。初始化命令字在系统初始化时置入,工作过程中一般保持不变。操作命令字在工作过程中根据需要设定。控制逻辑电路按照编程设定的工作方式管理8259A的全部工作。它根据IRR、IMR、优先权管理器的状态,通过INT引脚向CPU请求中断。中断响应期间,它使中断优先级最高的ISR相应位置1,同时使对应的IRR位清0,把相应的中断类型码发送到数据总线上。中断服务结束时按照编程规定的方式清除ISR中的对应位,进行结束处理。
这是一个8位的双向三态缓冲器,是8259A与系统数据总线的接口。8259A通过数据总线缓冲器接收CPU发来的控制字,也通过数据总线缓冲器向CPU发送中断类型代码和状态信息。
这个电路接收CPU的读/写命令。读/写信号控制8259A与CPU交换信息的方向,片选信号和地址线A0决定访问8259A的寄存器。CPU对8259A进行写操作时,用OUT指令使有效,把写入8259A的命令字通过数据总线送到相应的寄存器ICW和OCW内;CPU对8259A进行读操作时,用IN指令使有效,把相应的IRR、ISR或IMR寄存器的内容通过数据总线读入CPU。表6-2列出了对8259A寄存器进行读/写操作时,各控制线与被访问寄存器间的关系。
表6-2 8259A寄存器的读/写
|
A0 |
|
|
D4 |
D3 |
读/写操作 |
0 0 0 0 0 0 |
0 0 0 1 0 1 |
1 1 1 1 0 0 |
0 0 0 0 1 1 |
0 0 1 × |
0 1 × × |
数据总线——OCW2 数据总线——OCW3 数据总线——ICW1 数据总线——ICW2、ICW3、ICW0、OCW1 IRR或ISR或中断级别编码——数据总线 IMR——数据总线 |
系统需要扩展而使用多个8259A时,要有一个8259A做主器件而其他的作为从器件。级联缓冲/比较器在级联方式的主从结构中用来控制8259A的级联。与此部件相关的有3根级联线CAS2~CAS0和一根主从设备设定/缓冲器读/写控制线/。
如果系统使用了多片8259A,那么为了减轻系统数据总线的负担,可以把各8259A芯片的数据线汇总后通过一个双向缓冲器(8286或74LS245)与系统数据总线相连,这种方式称为缓冲方式。在缓冲方式下,/引脚用作,输出低电平时,开启双向缓冲器。不处于缓冲方式时,它相当于的输入引脚,用来区别主从器件:/接高电平,该8259A为主器件;/接低电平,则其为从器件。
CAS2~CAS0是8259A主从芯片之间专用的总线。对于主8259A,CAS2~CAS0是输出线,用于在CPU响应中断时输出从片选择代码,表示哪一个从部件的中断请求被响应;对于从8259A,CAS2~CAS0是输入线,用于接收主器件送来的从片选择代码。
8259A可接收两种命令字对它进行工作方式的设定和启动它进行规定的操作。在工作开始之前,首先要接收CPU发出的初始化命令字ICW1~ICW4和操作命令字OCW1~OCW3,以设定8259A的工作模式和发出相应的控制命令。初始化命令字通常是计算机系统启动时由初始化程序设置的,一旦设定,一般在系统工作过程中不再改变。操作命令字则不然,它是由应用程序设定的,用来对中断处理过程进行动态控制,因此操作命令控制字可以多次设置。
8259A是可编程的中断控制器,使用前要根据使用要求和硬件连接方式对其进行编程设定。CPU送给8259A的命令分为初始化命令字(ICW)和操作命令字(OCW)两类。初始化命令字在系统初始化时写入,用来设定8259A的基本工作方式。
操作命令字可以在初始化后的任何时刻写入8259A,用来动态地控制8259A的操作。
(1)ICW1字。
8259A开始写入的一定是ICW1,由引脚A0=0和ICW1内的D4=1确定。ICW1的格式如图6-7所示。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
× |
× |
× |
1 |
LTIM |
ADI |
SNGL |
IC4 |
特征位 |
触发方式位 |
调用地址间隔位 |
单/多片标志位 |
设置位 | |||
1:电平触发 0:边缘触发 |
1:间隔为4 0:间隔为8 |
1:单片使用 0:多片使用 |
1:需要ICW4 0:不需要ICW4 |
图6-7 ICW1字的格式
图6-7中几个主要位的含义如下。
D0:IC4位,用以决定是否设置ICW4。若D0=1,则说明必须设置ICW4;若D0=0,则说明不需设置ICW4。对于8088/80x86系统必须设置ICW4。
D1:SNGL位,表示8259A芯片是单片工作,还是多片级联工作。若D1=1,表示8259A单片工作;若D1=0,表示8259A多片级联工作。
D2:ADI位,只用于Intel 8080/8085系统中。在8088/8086系统中,该位无意义。
D3:LTIM位,规定中断请求信号IRi的有效电平。若D3=1,则表示中断请求信号为高电平有效;若D3=0,则表示中断请求信号为上升沿有效。
D4:恒定为1,为ICW1的特征位。
D5~D7:无意义。
(2)ICW2字——中断类型号。
ICW2是8259A必定写入的字,由引脚A0=1确定,其格式如图6-8所示。该命令字为设置中断类型号的初始化命令字,它是紧跟在ICW1字的后面被写入初始化程序的。CPU响应中断,发出第二个中断应答信号INTA信号后,8259A将中断类型号,即ICW2的内容送到数据总线上。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
由用户决定 |
由中断源引脚的序号决定 |
图6-8 ICW2字的格式
图6-8中几个主要位的含义如下。
D7~D3:由用户决定。用户写入IRi中断源的中断类型号。
D2~D0:由请求的中断源连接在8259A的引脚的序号决定。
(3)ICW3字——级联控制字。
ICW3是8259A的可选写入字,由引脚A0=1确定。该命令字仅用于级联方式,只有在一个系统中包含多片8259A时,ICW3才有意义,且对主片和从片都必须写入ICW3,但两者含义不同。对于主8259A芯片,ICW3的格式如图6-9所示,从片8259A的格式如图6-10所示。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
IR7 |
IR6 |
IR5 |
IR4 |
IR3 |
IR2 |
IR1 |
IR0 |
1:该引脚接从片 0:该引脚未接从片 |
图6-9 主8259AICW3字的格式
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
0 |
0 |
0 |
0 |
0 |
ID0 |
ID1 |
ID2 |
|
000接主片IR0 001接主片IR1 010接主片IR2
111接主片IR7 |
图6-10 从8259AICW3字的格式
(4)ICW4字格式——中断方式字。
ICW4是8259A的可选写入字,由引脚A0=1和D7~D5=000确定。只有当ICW1中的D0=1时才需要设置,其格式如图6-11所示。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
0 |
0 |
0 |
SFNM |
BUF |
M/S |
AEOI |
uPM |
特征位 |
嵌套方式 |
方式选择 |
主从选择 |
结束方式 |
系统选择 | ||
0 |
0 |
0 |
1:特殊全嵌套方式 0:普通全嵌套方式 |
1:缓冲方式 0:非缓冲方式 |
1:本片为主片 0:本片为从片 |
1:自动EOI 0:正常EOI |
1:80x86/8088 0:8080/8085 |
图6-11 ICW4字的格式
图6-11中几个主要位的含义如下。
D0:uPM位,微处理器选择位。
D1:AEOI位,中断结束处理方式。若D1=1,则为自动中断结束方式;若D1=0,非自动中断结束。
8259A作为中断控制器时,当某个中断源得到CPU的中断响应后,中断服务寄存器(ISR)的相应位置1,表示CPU正在为该中断源服务。如果CPU正在为某个中断源服务时产生了比该中断源级别更高的中断申请,CPU暂时中止低级别的中断服务,转到高级别的中断服务,同时使高级别的中断源在中断服务寄存器的对应位置1。所以中断服务寄存器的状态反映当前CPU正在为哪个中断源服务以及还未完成哪个中断源的服务,它为中断优先级分析器的裁决提供依据。当中断处理结束时,必须将中断服务寄存器的对应位清零,表示该中断源的中断服务已经结束,这个使中断服务寄存器的对应位清零的动作称为中断结束处理。
特别要强调的是,中断结束处理并不结束中断服务程序,只是使该中断服务寄存器的对应位清零。
中断结束处理的方式有两类:一类是自动结束方式,另一类是非自动结束方式。非自动结束方式又有两种,即一般中断结束方式和特殊中断结束方式。
①自动结束方式。
中断服务寄存器的相应位清零由硬件自动完成。当某一级中断被CPU响应后,CPU发出的第一个INTA中断应答信号,就使ISR的对应位置1。当第二个INTA负脉冲结束时,自动将ISR的对应位清零。中断自动结束方式只适用于有单片8259A工作的系统,并且各中断不发生嵌套的情况。
②非自动结束方式。
· 一般中断结束方式:该方式通过软件方法发一个中断结束命令,使当前中断服务寄存器中级别最高的置1位清零。这种方式只能应用于全嵌套方式,不能用于循环优先级方式。当CPU使用输出指令向8259A发送一般的EOI时,8259A把ISR中的最高优先级对应位清零。因为在全嵌套方式中,最高的ISR位对应于当前正在处理的中断源。
· 特殊中断结束方式:该方式也是通过软件方法发一个中断结束命令,同时用软件方法给出结束中断的中断源的序号,使该级的中断服务寄存器的对应位清零。该方式可应用在任何情况下。
D2:M/S位,主/从选择位。在缓冲方式下,若D2=1,则表示为主8259A;若D2=0,则表示为从8259A。在非缓冲方式下,该位无效。
D3:BUF位,设定8259A是否工作于缓冲方式。若D3=1,则8259A工作于缓冲方式;若D3=0,则8259A工作于非缓冲方式。
D4:SFNM位,嵌套方式选择。若D4=1,则8259A工作于特殊的全嵌套模式;若D4=0,则工作于普通的全嵌套模式。
· 普通全嵌套方式:这是8259A默认的优先权设置方式,在全嵌套方式下,8259A所管理的8级中断优先权是固定不变的,其中IR0的中断优先级最高,IR7的中断优先级最低。在请求中断的中断源中,CPU响应优先级最高的中断源后,使中断服务寄存器ISR中的对应位置1,而且把它的中断类型号送至系统数据总线。在此中断源的中断服务完成之前,与它同级或优先级低的中断源的中断请求被屏蔽,只有优先级比它高的中断源的中断请求才是允许的,从而出现中断嵌套。
· 特殊全嵌套方式:特殊全嵌套方式与普通全嵌套方式基本相同,所不同的是,当CPU处理某一级中断时,如果有同级中断请求,那么CPU也会做出响应,从而形成了对同一级中断的特殊嵌套。特殊全嵌套方式通常应用在8259A级联的系统中。在这种情况下,对主8259A编程时,通常使它工作在特殊全嵌套方式下。这样,一方面,CPU对于优先级别较高的主片的中断请求是允许的;另一方面,CPU对于来自同一从片的优先级别较高(但对于主片来讲,优先级别是相同的)的中断请求也是允许并能够响应的。
(1)OCW1——中断屏蔽控制字。
OCW1是中断屏蔽操作命令字,由引脚A0=1确定,该命令字是针对有多个中断源存在而设置的。在执行某段程序时,如果不希望某些中断源在某时刻申请中断,可对其采取屏蔽的方法;当允许时,再取消屏蔽操作。因而该命令字可按程序员的意愿,随时采取屏蔽或不屏蔽的方法,其格式如图6-12所示。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
M7 |
M6 |
M5 |
M4 |
M3 |
M2 |
M1 |
M0 |
1:置屏蔽 0:复位屏蔽 |
图6-12 OCW1字的格式
(2)OCW2——中断结束和优先级循环控制字。
OCW2用来设置非自动中断结束和优先级循环方式的操作命令字,由引脚A0=0及D4D3=00确定,其格式如图6-13所示。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
R |
SL |
EOI |
0 |
0 |
L2 |
L1 |
L0 |
优先级 |
针对L1~L2 |
结束命令 |
特征位 |
中断源选择 | |||
1:优先级循环 0:优先级固定 |
1:有效 0:无效 |
1:发送结束命令 0:不发送结束命令 |
|
000 IR0 001 IR1
111 IR7 |
图6-13 OCW2字的格式
①优先级自动循环方式。
在实际应用中,如果要求中断源有相同的优先级,可设置为该方式。系统启动时,8级中断优先级从高到低默认为IR0~IR7。如此时,刚好IR4发出了中断请求,CPU响应之后,若8259A工作在优先级自动循环方式下,则中断优先级由高到低的顺序自动变为IR5>IR6>IR7>IR0>IR1>IR2>IR3>IR4,其他的级别依此类推。设置方法可通过OCW2的D7D6=10来实现。
② 优先级特殊循环方式。
优先级特殊循环方式与优先级自动循环方式相比,只有一点不同,即初始化的优先级是由程序控制的,而不是默认的IR0~IR7。例如,要设置IR5>IR6>IR7>IR0>IR1>IR2>IR3>IR4这样的优先级顺序,可通过使OCW2=11000100来实现。
(3)OCW3——屏蔽和读状态控制字。
OCW3由A0=0及D4D3=01确定。OCW3操作命令字有3种功能:一是设置特殊屏蔽方式或撤销特殊屏蔽方式;二是设置中断查询方式或非查询方式;三是读中断请求寄存器(IRR)或读中断服务寄存器内容,其格式如图6-14所示。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
0 |
ESMM |
SMM |
0 |
1 |
P |
RR |
RIS |
|
|
|
特征位 |
|
|
| |
|
1:允许特殊屏蔽方式 0:不允许特殊屏蔽方式 |
1:设置特殊屏蔽方式 0:撤销特殊屏蔽方式 |
|
1:查询命令 0:非查询命令 |
1:发送读命令 0:不发送读命令 |
1:读ISR 0:读IRR |
图6-14 OCW3字的格式
图6-14中几个主要位的含义如下。
D1D0:读命令。D0表示是读中断服务寄存器还是读中断请求寄存器。D1D0=11表示读中断服务寄存器;D1D0=10表示读中断请求寄存器;D1=0时D0无意义。
D2:决定8259A是否设置为查询工作方式。当D2=1时,设置为查询方式,且使CPU的IF=0,不用8259A的INT端向CPU的INTR发出中断请求。查询方式是通过输入8259A偶地址读查询字,查询字中表明当前有没有中断请求,并且表明当前优先级最高的中段请求是哪一个,查询字的格式如图6-15所示。
D6D5:决定8259A是否设置为特殊屏蔽方式命令。若D6D5=11,则为设置特殊屏蔽模式命令;若D6D5=01,则为撤销特殊屏蔽方式、返回普通屏蔽方式命令;若D6=0,则D5无意义。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
I |
× |
× |
× |
× |
W2 |
W1 |
W0 |
1:有中断请求 0:无中断请求 |
|
|
|
|
000 当前优先级最高中断源为IR0 001 当前优先级最高中断源为IR1
111 当前优先级最高中断源为IR7 |
图6-15 查询字的格式
① 普通屏蔽方式。
8259A的每个中断请求输入都要受到屏蔽寄存器中对应位的控制。若对应位为1,则中断请求无法送至CPU。屏蔽是通过对屏蔽寄存器IMR的编程(操作命令字OCW1)来设置和改变的。
② 特殊屏蔽方式。
有些场合下,希望一个中断服务程序在运行过程中能动态地改变系统中的中断优先级结构,即在中断处理的一部分禁止低级中断,而在中断处理的另一部分又能够允许低级中断,于是引入了对中断的特殊屏蔽方式。
设置了特殊屏蔽方式后,通过OCW1对屏蔽寄存器中的某一位置位时,同时也会使中断服务寄存器(ISR)中的其他位复位,这样一方面屏蔽了正在处理的同级中断,另一方面也真正开放了其他优先级别较低的中断请求。
特殊屏蔽是在中断处理程序中使用的,使用这种方式之后,尽管系统正在处理高级中断,但对外界来讲只有同级中断被屏蔽,也就允许其他任何级别的中断请求。
8259A的应用之一就是微机系统中的中断逻辑结构。现在的微机系统为了扩大中断处理能力,使用两片8259A组成主从形式中断控制器,提供15级中断。虽然在当今的Pentium系列微处理器中已经再也找不到这种8259A芯片,但是这样的电路依然存在,只是集成到了超大规模的芯片组中。微机系统中断控制器的连接原理如图6-16所示。
图6-16 微机系统中断控制器连接示意图
这里,主片的端口地址仍为20H、21H,从片的端口为A0H、A1H。BIOS中初始化主片8259A的程序如下:
MOV AL,11H
OUT 20H,AL
JMP Intr1
Intr1: MOV AL,08H
OUT 21H,AL
JMP Intr2
Intr2: MOV AL,04H
OUT 21H,AL
JMP Intr3
Intr3: MOV AL,11H
OUT 21H,AL
BIOS中,初始化从片8259A的程序如下:
MOV AL,11H
OUT 0A0H,AL
JMP Intr5
Intr5: MOV AL,70H
OUT 0AIH,AL
JMP Intr6
Intr6: MOV AL,02H
OUT 0A1H,AL
JMP Intr7
Intr7: MOV AL,1
OUT OA1H,AL
需要注意,主从片8259A采用的都是普通的EOI方式,对于从片提出的中断,其服务程序返回前应发送两个EOI命令,一个给从片8259A,一个给主片8259A。
MOV AL,20H
OUT OAOH,AL
OUT 20H,AL
另外,当8259A工作在级联方式时,如果都初始化为全嵌套方式,从片的中断请求被CPU响应,主片的中断服务寄存器(ISR)位也将被置位,从而屏蔽掉这个从片。也就是说,此时来自从片8259A的较高优先级的中断请求不能通过主片8259A向CPU申请中断,这在应用时需要注意。