【微机原理及接口技术】中断控制器8259A
文章目录
- 【微机原理及接口技术】中断控制器8259A
- 前言
- 一、介绍
- 二、8259A的内部结构和引脚
- 三、8259A的中断工作过程
- 四、8259A的工作方式
- 五、8259A的编程
- 六、外部中断服务程序
- 总结
前言
本篇文章将就8259芯片展开介绍,8259A的内部结构和引脚,8259A的中断工作过程,8259A的工作方式,8259A的编程以及外部中断服务程序。
一、介绍
Intel 8259A是可编程中断控制器
可用于管理Intel 8080/8085、8086/8088、80286/80386的可屏蔽中断
- 8259A的主要功能
具有8级优先权控制,通过级联可扩展至64级
每一级均可通过编程实现屏蔽或开放
能向CPU提供相应的中断类型号
可通过编程选择不同的工作方式
二、8259A的内部结构和引脚
- 1. 中断控制
中断请求寄存器IRR
保存8条外设中断请求信号IR0~IR7的请求状态
Di=1:IRi引脚有中断请求
Di=0:IRi引脚无中断请求
中断服务寄存器ISR
保存正在被8259A服务着的中断状态
Di=1:IRi中断正在服务中
Di=0:IRi中断没有被服务
中断屏蔽寄存器IMR
保存对中断请求信号IRi的屏蔽状态
Di=1:IRi中断被屏蔽(禁止)
Di=0:IRi中断被开放(允许) - 2. 读写控制
- 3. 中断级连
一个系统中,8259A可以级连,有一个主8259A,若干个(最多8个)从8259A
级连时,主8259A的三条级连线CAS0~CAS2作为输出线,连至每个从8259A的CAS0~CAS2
每个从8259A的中断请求信号INT,连至主8259A的一个中断请求输入端IRi
主8259A的INT线连至CPU的中断请求输入端INTR
CPU的中断响应输出端INTA连至主8259A和从8259A的INTA*端*
SP*/EN在非缓冲方式下,规定该8259A是**主片(SP=1)还是从片(SP*=0)**
三、8259A的中断工作过程
- 中断响应周期
第一个响应周期
——数据线浮空。通知发中断请求的设备,CPU准备响应中断,应该准备好中断类型号。
第二个响应周期
——被响应的外设将一个字节的中断类型号送数据线,CPU读取类型号。
四、8259A的工作方式
-
1. 设置优先权方式
普通全嵌套方式
8259A的中断优先权顺序固定不变,从高到低依次为IR0、IR1、IR2、……IR7
中断请求后,8259A对当前请求中断中优先权最高的中断IRi予以响应,将其向量号送上数据总线,对应ISR的Di位置位,直到中断结束(ISR的Di位复位)
在ISR的Di位置位期间,禁止再发生同级和低级优先权的中断,但允许高级优先权中断的嵌套
特殊全嵌套方式
——允许响应同级中断请求
优先权自动循环方式
——响应后,优先权最低;开始优先权IR0最高,IR7最低
优先权特殊循环方式
——响应后,优先权最低;开始最低优先权由用户指定 -
2. 结束中断处理方式
什么是8259A的中断结束?
8259A利用中断服务寄存器ISR判断:
某位为1,表示正在进行中断服务;
该位为0,就是该中断结束服务。
自动中断结束方式
普通中断结束方式
配合普通全嵌套方式使用
当CPU用输出指令往8259A发出普通中断结束EOI命令时,8259A就会把所有正在服务的中断中优先权最高的ISR位复位
特殊中断结束方式
——需指定结束的引脚 -
3. 屏蔽中断源方式
普通屏蔽方式
将IMR的Di位置1,则对应的中断IRi被屏蔽,该中断请求不能从8259A送到CPU
如果IMR的Di位置0,则允许IRi中断产生
特殊屏蔽方式
——执行较高级中断服务时,开放较低级的中断请求 -
4. 中断触发方式
边沿触发方式
将中断请求输入端出现的上升沿作为中断请求信号的触发方式
电平触发方式
-
5. 数据线连接方式
缓冲方式
8259A的数据线需加缓冲器予以驱动
SP*/EN引脚作为输出端。
作为**输出的EN使用时,作为数据总线缓冲器的使能信号**。
非缓冲方式
五、8259A的编程
初始化编程
8259A开始工作前,必须进行初始化编程
给8259A写入初始化命令字ICW中断操作编程 在8259A工作期间
可以写入操作命令字OCW将选定的操作传送给8259A,使之按新的要求工作
还可以读取8259A的信息,以便了解他的工作状态
- 1. 初始化命令字ICW
初始化命令字ICW最多有4个
8259A在开始工作前必须写入
必须按照ICW1~ICW4顺序写入
ICW1和ICW2是必须写的
ICW3和ICW4由工作方式决定
ICW1
ICW2(设置中断向量号)
ICW3(级连命令字)
ICW4
8259A的初始化流程
例: 试按照如下要求对8259A设置初始化命令字:系统中仅用一片8259A,中断请求信号采用边沿触发方式;中断类型号为08H~0FH;用全嵌套、缓冲、非自动中断结束方式。8259A的端口地址为20H和21H
该片8259A的初始化程序段如下:
MOV AL, 00010011B ;设置ICW1,边沿触发,单片8259A,需ICW4
OUT 20H, AL
MOV AL, 00001000B ;设置ICW2,中断类型号的高5位为00001
OUT 21H, AL
MOV AL, 00001101B ;设置ICW4, 全嵌套,缓冲,非自动中断结束
OUT 21H, AL
- 2. 操作命令字OCW
8259A工作期间,可以随时接受操作命令字OCW
OCW共有3个:OCW1~OCW3
写入时没有顺序要求,需要哪个OCW就写入哪个OCW
OCW1(屏蔽操作命令字)
OCW2(中断方式命令字)
OCW3(状态操作命令字)
小结:8259A的七个寻址
- 3. 读取状态字
CPU可读出IRR、ISR、IMR和查询字
读IRR、ISR和查询字
A0为低电平,在读之前需先设定要读的寄存器。
由OCW3中RR和RIS位设定读取IRR或ISR
由OCW3中P位设定读取查询字
读IMR
A0为高电平时,直接读取
查询字反映了当前有无中断请求,以及中断请求中优先级最高的是哪一个
查询字
小结:8259A的四个读操作
读查询字(中断请求状态字):
先写入OCW3 (P=1)
用偶地址端口读(如:IN AL,20H)
读IRR:
先写入OCW3(RR=1,RIS=0)
用偶地址端口读(如: IN AL,20H)
读ISR:
先写入OCW3(RR=1,RIS=1)
用偶地址端口读(如: IN AL,20H)
读IMR:
随时可用奇地址端口读(如: IN AL,21H)
六、外部中断服务程序
编写主程序,需注意:
修改中断向量
控制CPU的中断允许标志
设置8259A的中断屏蔽寄存器
编写外部可屏蔽中断服务程序,需注意:发送中断结束命令。
8259A的IR0中断请求来自定时器8253,IR0的中断向量号为08H
8259A的偶地址端口为20H,奇地址端口为21H
程序功能:每次中断要显示字符串“A 8259A Interrupt !”,中断10次结束
用内存单元在主程序与外部中断服务程序之间传递参数:中断次数
显示信息也安排在共同的数据段中
;数据段
intmsg db ‘A 8259A Interrupt !’
db 0dh,0ah,0
counter db 0
;保存中断向量
mov ax,3508h
int 21h
push bx ;保存偏移地址
push es ;保存段基址
;设置中断向量
cli
push ds
mov dx,offset new08h
mov ax,seg new08h
mov ds,ax
mov ax,2508h
int 21h
pop ds
;初始化8259A
MOV AL, 00010011B ;设置ICW1,边沿触发,单片8259A,需ICW4
OUT 20H, AL
MOV AL, 00001000B ;设置ICW2,中断类型号的高5位为00001
OUT 21H, AL
MOV AL, 00001101B ;设置ICW4, 全嵌套,缓冲,非自动中断结束
OUT 21H, AL
;设置中断寄存器
in al,21h ;读取IMR
push ax ;不破坏原屏蔽状态
and al,0feh ;允许IR0
out 21h,al
mov counter,0 ;设置中断次数初值
sti ;开中断
;循环等待中断
start1: cmp counter,10
jb start1 ;JB小于,中断10次退出
;中断就在主程序循环当中
;主程序结束
cli
pop ax ;恢复原屏蔽状态
out 21h,al
pop dx ;恢复原08H号中断向量
pop ds
mov ax,2508h
int 21h
sti
mov ah,4ch ;返回操作系统
int 21h
;进入中断服务程序
new08h proc
sti ;开中断
push ax ;保护现场
push bx
push ds
mov ax,seg counter
mov ds,ax ;设置数据段DS
;中断处理
inc counter
mov si,offset intmsg ;显示信息
call dpstri
mov al,20h ;发送中断结束命令EOI
out 20h,al
pop ds ;恢复现场
pop bx
pop ax
iret ;中断返回
new08h endp
;显示字符串
dpstri proc ;显示字符串子程序
push ax
push bx
dps1: mov al, [si]
cmp al,0
jz dps2
mov bx,0 ;显示字符
mov ah,0eh
int 10h ;P381
inc si
jmp dps1
dps2: pop bx
pop ax
ret
dpstri endp
总结
到这里这篇文章的内容就结束了,谢谢大家的观看,如果有好的建议可以留言喔,谢谢大家啦