7. 【可编程中断控制器8259A】(上):内部功能结构+各引脚解释、中断过程、工作方式

可编程中断控制器8259A的用处

  • 可为CPU管理和处理8个中断源电路的中断,并对它们进行优先级管理
  • 可与其它8个8259A芯片组成主从式中断系统,实现64级中断源控制。
  • 优先级方式在执行程序时可动态改变,有多种中断管理方式。
  • 每一中断源中断都可以屏蔽或允许,可通过编程选择。
  • 能自动送出中断类型号,使CPU方便的找到中断服务程序的入口地址



8259A内部功能结构+各引脚解释

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



8259的中断过程

① 由 【中断请求寄存器IRR 】锁存外部的中断申请。
            若IR0~IR7引脚上有中断申请,则将IRR相应位置1

② 决定是否通过INT引脚向CPU发出中断请求。
中断屏蔽寄存器IMR决定IRR中的中断申请是否进入优先级判别电路PR

在这里插入图片描述

③优先级判决
优先级判别电路PR根据新进入的中断申请和ISR的内容,决定是否发向CPU发出中断申请信号。

  • 如果新进入的中断申请ISR中记录的中断请求的优先级,则通过8259的INT引脚向CPU发出中断请求信号;
  • 如果新进入的中断申请ISR中记录的中断请求的优先级低或同级,则不向CPU发中断请求信号。

④CPU决定是否响应中断请求

CPU接收到INTR上的中断申请信号后:

  • 如果IF标志为1,则处理完当前的指令后,向8259的#INTA引脚发两个连续的负脉冲【就是可以响应】。
  • 如果IF标志为0,则CPU不发中断响应信号,即中断申请被IF屏蔽
    在这里插入图片描述

⑤ 8259A在接收到#INTA信号后,使ISR相应位置1,IRR相应位置0

⑥ 8259在#INTA引脚的第二负脉冲期间,向数据总线输送8位的中断向量号。

⑦中断结束时,要在中断服务程序中发中断结束命令,使ISR的相应位置0。
若8259工作在中断自动结束方式,则在#INTA引脚的第二个负脉冲结束时,使ISR的相应位置0。



8259的工作方式

在这里插入图片描述

1. 设置优先权方式

(1)普通全嵌套方式:默认【IR0优先级最高、 IR7最低】

全嵌套的规则 :
高级中断可以进入低级中断低级中断不可以进入高级中断

在这里插入图片描述
全嵌套方式的工作条件【单片8259】:

  1. 在主程序中有STI指令开中断,使IF=1。
  2. 在中断服务程序中再次开中断,才能进行中断嵌套。
  3. 在中断程序结束时,必须执行中断结束指令,使ISR中相应位置0,然后才能执行IRET中断返回指令。

(2)特殊全嵌套方式【能够响应同等优先级的中断请求。用在多片级联的场合。】

在多片级联时仍能实现中断嵌套

工作条件:

  1. 主片:设为特殊全嵌套方式。
  2. 从片:设为除了特殊全嵌套以外的任一种优先级方式

(3)优先级自动循环方式

从IR0~IR7进入的中断轮流具有最高优先级。
初始时,IR0最高,IR7最低。
此后优先级自动循环,即:当前被响应的中断优先级最低,其后面的一个优先级最高,如下图

在这里插入图片描述

(4)优先级特殊循环方式

和(3)不同:初始时,最低优先级是编程设置的。



2. 屏蔽中断源方式

(1)普通屏蔽方式

将IMR中的某一位/几位置1,则相应IRR中的中断请求被屏蔽,不能通过8259送到CPU。
注意:IMR中的某位置1后,并不影响IRR中的相应位。
可通过编程设置操作命令字,实现IMR中的某一位/几位,置1/置0。

(2)特殊屏蔽方式【可以实现低级中断嵌套高级中断】

具体做法——>在当前正在处理的中断服务程序中设:

  1. 将8259设为特殊屏蔽方式
  2. 用命令字将IMR中相应位置1,由于已设置为特殊屏蔽方式,这种方式会自动使ISR中相应位置0。
  3. 要在中断服务程序结束时撤消特殊屏蔽方式。

一般用于需要动态改变优先级顺序的时候。


3. 结束中断处理方式

结束中断的原因:
当一个中断请求被响应时,8259会自动将ISR中相应位置1,为此后的中断裁决打下基础。当中断处理结束时,要用一个中断结束命令使ISR中的相应位清0,否则,中断裁决电路会屏蔽比其低级或同级中断请求,即比其低级的中断请求永远不能被响应。因此中断结束时,必须进行一些处理,使ISR中相应位清0。

(1)自动结束方式

在第二个负脉冲时,8259自动将ISR中的相应为置0
工作在此方式下:
①中断服务程序中不需要中断结束命令EOI。
②仅用在系统中只有单片8259,没有多个中断嵌套,且下一次中断请求一定在本次中断服务结束后发生。

(2)非自动结束方式

①一般中断结束方式

用于优先级全嵌套方式中。(优先级固定)
当CPU发出中断结束命令时,8259使ISR中优先级最高的那一非零位清0。

②特殊中断结束方式

用于优先级非全嵌套方式中(优先级不固定)。因此用ISR不能确定哪个中断是最后处理的中断。
要求CPU发出一个特殊的中断结束命令来结束中断,在这个特殊的中断结束命令中,要指出所要结束的中断的优先级。
指出所要清除的ISR中的哪一位



4. 中断触发方式

(1)电平触发:高电平有效。

(2)边沿触发:上升沿有效。



5. 数据线连接方式

(1)缓冲方式【需经过数据总线驱动器(8286)系统总线相连】

当使用缓冲方式与系统总线相连时:
            #SP/ #EN 是输出端,和8286的允许端相连,用于启动8286。

(2)非缓冲方式【 8259直接与系统总线相连。】

在这里插入图片描述

  • 15
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,这是一个涉及到硬件和软件编程的问题,我尽力给你进行解答。 首先,8259A是一个可编程中断控制器,它可以管理多个设备的中断请求,并将它们分配给CPU。我们可以使用8259A来监控开关的状态,当开关发生变化时,它会向CPU发送一个中断请求。 然后,我们需要使用开关元器件来模拟开关的状态。这可以通过连接一个开关到8259A中断输入引脚来实现。当开关打开或关闭时,它会向8259A发送一个中断请求。 接下来,我们需要编写软件来处理中断请求,并将开关状态的计数器值保存到内存中。为此,我们需要编写一个中断处理程序,在其中读取中断状态并更新计数器值,并将计数器值写入内存中。下面是一个简单的示例程序,它使用8259A的IRQ0输入来监控开关状态,并将计数器值保存到内存地址0x1000处: ```assembly org 0x7c00 ; 引导扇区的起始地址 bits 16 ; 16位模式 start: mov ax, cs mov ds, ax ; 将ds设置为代码段的段选择器,以便访问代码段中的数据 mov es, ax ; 将es设置为代码段的段选择器,以便访问代码段中的数据 cli ; 禁用中断 ; 初始化8259A中断控制器 mov al, 0x11 ; ICW1:初始化命令字1 out 0x20, al ; 发送ICW1到主片 mov al, 0x20 ; ICW2:中断向量偏移量为0x20 out 0x21, al ; 发送ICW2到主片 mov al, 0x04 ; ICW3:将IRQ0连接到从片的IRQ2输入 out 0x21, al ; 发送ICW3到主片 mov al, 0x01 ; ICW4:启用8086兼容模式 out 0x21, al ; 发送ICW4到主片 mov al, 0xff ; OCW1:屏蔽所有中断请求 out 0x21, al ; 发送OCW1到主片 mov al, 0xff ; OCW1:屏蔽所有中断请求 out 0xa1, al ; 发送OCW1到从片 ; 设置中断处理程序 mov ax, 0x0000 mov es, ax ; 将es设置为0,以便访问物理地址 mov word [es:0x0000], isr ; 设置中断向量表ISR为中断处理程序地址 mov ax, cs mov word [es:0x0002], ax ; 将中断处理程序的段选择器保存到中断向量表中 ; 启用中断 sti ; 启用中断 ; 初始化计数器值 mov word [cs:counter], 0x0000 loop: hlt ; 等待中断请求 isr: push ax ; 保存寄存器 push bx push cx push dx ; 读取中断状态 in al, 0x60 ; 从8259A的数据端口读取状态 and al, 0x01 ; 仅保留IRQ0的状态 mov bl, [cs:counter] ; 读取当前计数器值 ; 更新计数器值 cmp al, 0 ; 如果IRQ0状态为0,表示开关关闭 jne switch_opened ; 否则,表示开关打开 inc bl ; 计数器加1 jmp update_counter switch_opened: ; do nothing update_counter: mov [cs:counter], bl ; 将更新后的计数器值写入内存 ; 结束中断处理程序 pop dx ; 恢复寄存器 pop cx pop bx pop ax iret ; 返回中断请求 ; 计数器变量 counter: dw 0x0000 ; 引导扇区结束 times 510-($-$$) db 0 dw 0xaa55 ``` 在这个示例程序中,我们首先初始化8259A中断控制器,然后设置一个中断处理程序,以便处理IRQ0输入引脚上的中断请求。当开关状态发生变化时,中断处理程序会将计数器值递增,并将其写入内存中。 请注意,示例程序仅用作演示目的,不保证在所有系统上都能正常工作。实际实现中,你需要根据具体硬件和软件环境进行调整和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你说的白是什么白_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值