关于8259A的介绍
可编程中断控制器,用于可屏蔽中断管理。
单片8259A可管理8个外边中断源,通过级联,最多可以管理64个外部中断源。
- 中断请求寄存器IRR
保存8条外界中断请求信号IR0~IR7的请求状态,Di位为1表示IRi引脚有中断请求;为0表示无请求,中断处理后,及时撤销。 - 中断服务寄存器ISR
保存正在被8259A服务着的中断状态,ISi为1表示IRi中断正在服务中;为0表示没有被服务,收到EOI命令相应位被清除 - 中断屏蔽寄存器IMR
保存对中断请求信号IR的屏蔽状态,Di位为1表示IRi中断被屏蔽(禁止);为0表示允许
工作方式
(1)中断优先级
可以通过软件命令的方式设定各中断源的中断优先级
- 固定优先级,默认IR0优先级最高,IR7优先级最低
可通过程序改变。如:
IR3→IR4 →IR5 →IR6 →IR7 →IR0 →IR1 →IR2 - 循环优先级
当某中断源被响应后,其优先级自动降为最低,原来比它低一级的中断则为最高级,依次排列。
(2)中断嵌套
高优先级打断低优先级
(3)中断结束处理
当中断服务程序结束时,将中断服务寄存器ISR中相应( ISi )清零。
(4)中断源屏蔽方式
通过编程使得中断屏蔽寄存器IMR相应位置0或置l,从而允许或禁止该位所对应的中断
(5)中断触发方式
需要维持到中断信号结束
边沿触发
电平触发
(6)8295A级联
一个系统中,8259A可以级联,有一个主8259A,若干个(最多8个)从8259A级联时,主8259A的三条级连线CAS0~CAS2作为输出线,连至每个从8259A的CAS0~CAS2
每个从8259A的中断请求信号INT,连至主8259A的一个中断请求输入端IR
主8259A的INT线连至CPU的中断请求输入端
SP*/EN在非缓冲方式下,规定该8259A是主片(SP=1)还是从片(SP*=0)
设置一片作为主片,把主片的IR端街道从片的INT段,实现最多64个中断源的中断控制
(6)数据线连接方式
- 缓冲方式
在多片8259A级连的大系统中,8259A通过外部总线驱动器和数据总线相连,这就是缓冲方式。
8259A把SP*/EN*引脚作为输出端,输出允许信号,用以锁存或开启缓冲器 - 非缓冲方式
当系统中只有一片或几片8259A芯片时,可以将数据总线直接与系统数据总线相连
SP*/EN*引脚为输入端
若8259A级联,由其确定是主片或从片
8295A的初始化
(1)通过软件向其写入控制命令的方法控制其工作状态。
- 写入初始化命令字ICW
向8259A送2~4个字节的初始化命令字ICW,写入各ICW寄存器,使其处于准备就绪状态。 - 写入操作命令字OCW
向8259A送3个字节的操作命令字OCW,以规定8259A的操作方式(中断控制方式、屏蔽某些中断源、读出8259A工作状态信息)。
一个字节有八个字
(2)过程
- 确定中断类型号
应用程序可使用的中断类型号为60H~66H和68H~6FH - 保存原中断向量
在将自己的中断程序入口地址置入中断向量表之前,应先保存该地址中原来的内容。 - 将自己的中断向量放入向量表;
- 设置中断屏蔽字(可选)。
- 若编写的是硬件中断程序,应将所使用的硬件中断对应的8259A的中断屏蔽位开放;
- CPU开中断;
- 恢复原中断向量。
(3)8259A的两种命令字
初始化命令字: ICW1~ICW4
操作命令字: OCW1~OCW3
8259A的启动:必须先通过编程写入初始化命令字,使它处于工作起始状态;
初始化过程:按照固定的顺序进行。ICW1、ICW2必须写,ICW3、ICW4视具体情况而定。
(4)预留命令字
-
ICM1 A0=0
-
ICM2 A0=1
-
ICM3 A0=1
-
ICM4 A0=1
(5)操作命令字 -
OCW1 A0=1 实现中断屏蔽
-
OCW2 A0=0 中断结束和优先级循环控制
-
OCW3
特殊屏蔽设置,中断查询,读IRR,ISR
初始化的举例
只有主片的代码参考:
(1)要求:IBM PC/XT 8259A ,单片,边缘触发,全嵌套方式,设定0级中断类型码为08H。
端口地址 :20H,21H。
(2)硬件连接:CAS2~CAS0不用,SP/EN接+5V。
(3)初始化命令字:
ICW1=0001 0011B ; 边缘触发,单片,需ICW4
ICW2=0000 1000B ;设置类型码的高5位
ICW4=0000 0001B ;全嵌套,非缓冲,非自动EOI,16位机
MOV AL, 13H ;ICW1:边沿触发.单片.要ICW4
OUT 20H,AL
MOV AL , 08H ;ICW2:IRQ0中断类型为08H
OUT 21H,AL
MOV AL, 01H ;ICW4全嵌套.8086系统
OUT 21H,AL ;普通EOI方式
主从片一起的代码参考
;主片8259A的初始化
MOV AL,11H ;写入ICW1,设定边沿触发,级联方式
OUT 20H,AL
JMP INTR1 ;延时,等待8259A操作结束,下同
INTR1:MOV AL,08H ;写入ICW2,设定IRQ0的中断类型号为08H
OUT 21H,AL
JMP INTR2
INTR2:MOV AL,04H ;写入ICW3,设定主片IRQ2级联方式
OUT 21H,AL
JMP INTR3
INTR3:MOV AL,11H ;写入ICW4,设定特殊全嵌套方式,一般EOI方式
OUT 21H,AL
┇
;从片8259A的初始化
MOV AL,11H ;写入ICW1,设定边沿触发,级联方式
OUT 0A0H,AL
JMP INTR5
INTR5:MOV AL,70H ;写入ICW2,设定从片IR0,即IRQ8的中断类型号为70H
OUT 0A1H,AL
JMP INTR6
INTR6:MOV AL,02H ;写入ICW3,设定从片级联到主片的IRQ2
OUT 0A1H,AL
JMP INTR7
INTR7:MOV AL,01H ;写入ICW4,设定普通全嵌套方式,一般EOI方式
OUT 0A1H,AL