0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

8259a初始化的步骤及代码介绍

姚小熊27 来源:网络整理 2018-05-23 14:24 次阅读

一、8259a工作初始化的步骤

首先,外部中断请求(IR0到IR7)传输到IMR,IMR根据此中断请求是否被屏蔽,以决定是将其丢弃,还是放入IRR中等待进一步处理。当8259A等待到一个中断时机时,优先级仲裁单元会从所有放入IRR中的中断请求中挑出一个优先级最高的中断,传递给CPU处理。值得注意的是中断优先级是随着中断请求号降低而提高的。在CPU的INTR引脚接收到8259A发送过来的信号后,CPU会暂停执行下一条指令,并向8259A发送一个INTA信号。在 8259A接收到该信号后,就会将ISR中代表该中断的位置1,并将IRR中相应的位清零。以表示该中断正在被CPU处理。接着CPU会向8259A再发送一个INTA信号,向其请求中断向量号。这时,8259A会根据先前设置好的起始向量号再加上中断请求号计算出中断向量号,并将其放入数据总线中。

这时候,如果8259A的EOI通知被设定为自动模式,那么8259A就会自动将ISR中刚才置1的位清零。在CPU获得该中断向量号后,就会转去调用该中断服务程序。在处理完该中断后如果8259A的EOI通知被设定为人工模式,则还要向8259A发送一个EOI。通常来讲,这一工作往往是在中断服务程序中完成。在8259A接收到该EOI通知后,就会将ISR中刚才置1的位清零。

以上就是8259A处理一个中断的整个过程的简述。由于中断请求存在着优先级,因此,如果在一个中断处理期间,8259A又收到了新的中断请求,则首先跟当前处理的优先级进行比较,如果新到的中断请求的优先级高于当前处理的中断请求,则马上处理新到的中断请求,否则则将新到的中断请求放入IRR。

对于8259A的操作,是通过端口进行的。其中, Master的端口地址为0x20, 0x21, Slave的端口地址位0xA0,0xA1。8259A具有两种命令,一种是ICW,其作用是用来初始化8259A芯片。另一个是OCW,其作用是用来向 8259A发送命令。虽然在系统启动后BIOS会自动初始化8259A,但这并不是我们所需要的。因为在进入保护模式后,我们要设置IDT,因此我们必须根据所设置的IDT去初始化8259A.

对8259A的操作有两类命令,其中一类是ICW,另一类是OCW。ICW用来对8259A进行初始化,而OCW则用来在初始化后对8259A发布命令。有意思的是,8259A的两个端口对于这两类命令的发布是有固定安排的。对于0x20和0xA0端口,你可以向它们写入ICW1,OCW2,OCW3,读取IRR和ISR。对于0x21和0xA1端口,你可以向它们写入ICW2,ICW3,ICW4, 并能够读写IMR寄存器

下面我们分别来讨论这几个命令

ICW1:该命令作为初始化序列的第一条命令,一旦向端口送入该命令,8259A就认为初始化序列开始。

8259a初始化的步骤及代码介绍

在设置时,对于80x86的CPU,其应设置为(00010001),也就是0x11。

ICW2:该命令用来指定所初始化的8259A中断请求的起始向量。其中ICW2的低3位必须为0,其这么做的原因在于当该8259A接收到一个中断请求时,低3位会自动填充为所接受到的向量号。因此这也就决定了我们设置的起始中断向量,必须为8的倍数。

ICW3:Master PIC和Slave PIC对于ICW3命令具有不同的格式

对于Master PIC,Slave PIC被接到了Master PIC的哪个IRQ上,则ICW3中相应的位就置1。在8259A中,由于SlavePIC是级连在Master PIC的IRQ2上的,因此ICW3的值应该为(00000100),也就是0x04。而对于SlavePIC其高5位必须设置为零,低3位为该PIC被级连到哪个Master PIC的IRQ号,在8259A中,其SlavePIC的值为(00000010),即0x02。

ICW4:

8259a初始化的步骤及代码介绍

在80x86模式下,我们采用默认的Full Nested Mode,将ICW4设置为(000000001),即0x01。

而我们之所以我们要采用NormalEOI,其原因在于我们要允许中断请求的按优先级抢占。如果我们将EOI通知设定为自动模式,那么在CPU发出第二个 INTA信号后,8259A中相应的ISR就会自动清零,而此时该中断服务程序还没有被调用。如果在该中断服务程序被调用的过程中,8259A收到了优先级比当前正在处理的中断优先级低的中断请求,由于正在处理的中断在ISR中相应的位已经清零,因此这个新的中断请求就完全可以抢占正在处理的优先级比它高的中断服务程序。

二、初始化8259A的代码

void init_8259A(byte master_vector,byte slave_vector)

{

outportb (PORT_8259A_M, 0x11);

outportb (PORT_8259A_S, 0x11);

outportb (PORT_8259A_M+1, master_vector);

outportb (PORT_8259A_S+1, slave_vector);

outportb (PORT_8259A_M+1, 1《《2);

outportb (PORT_8259A_S+1, 2);

outportb (PORT_8259A_M+1, 1);

outportb (PORT_8259A_S+1, 1);

}

三、如何通过OCW对8259A进行操作

OCW1:该命令用来屏蔽所设定的中断请求。其操作方式是,向你要屏蔽的中断请求所在的8259A发送一个操作控制字。需要屏蔽哪个中断请求就将该字上相应的位置1即可。

实例代码如下:

#define PORT_INT_MASK_M 0x21

#definePORT_INT_MASK_S 0xA1

void mask_IRQ(byte IRQ)

{

byte mask;

if(IRQ 》 15)

return;

if(IRQ 《 8)

{

mask = inportb(PORT_INT_MASK_M);

mask |= 1 《《 IRQ;

outportb(PORT_INT_MASK_M, mask);

}

else

{

mask = inportb(PORT_INT_MASK_S);

mask |= 1 《《 (IRQ-8);

outportb(PORT_INT_MASK_S, mask);

}

}

void unmask_IRQ(byte IRQ)

{

byte mask;

if(IRQ 》 15)

return;

if(IRQ 《 8)

{

mask = inportb(PORT_INT_MASK_M);

mask &= !(1 《《 IRQ);

outportb(PORT_INT_MASK_M, mask);

}

else

{

mask = inportb(PORT_INT_MASK_S);

mask &= !(1 《《 (IRQ-8));

outportb(PORT_INT_MASK_S, mask);

}

}

OCW2:

8259a初始化的步骤及代码介绍

如果OCW2中的bit6被设置为0,那么该命令将对整个8259A有效。否则,将针对bit2:0这3位所代表的IRQ进行操作。由于我们前面已经将8259A设置为手动EOI模式,所以在这里我们要将bit7:5设置为(001)

OCW3:

8259a初始化的步骤及代码介绍

四、8259A初始化编程

对8259的初始化一定要按规定的顺序进行,假定8259占用的I/O地址为FF00和FF02H(奇地址):

MOV DX,0FF00H ;8259的地址A0=0

MOV AL,13H ;写ICW1,边沿触发,单片,

OUT DX,AL

MOV DX,0FF02H ;8259地址A0=1

MOV AL,48H ;写ICW2,设置中断类型码

OUT DX,AL ;中断向量为48H-4FH(IR0-IR7)单片8259,不对ICW3设置

MOV AL,03H ;写ICW4,8086/88模式,自动中;断结束 (EOI),非缓冲,一般嵌套

OUT DX,AL

MOV AL,0E0H ;写OCW1,屏蔽IR5、IR6、 IR7中断源

OUT DX,AL ;(假定这3个中断输入未用),其它开中断

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41020
  • 初始化
    +关注

    关注

    0

    文章

    48

    浏览量

    11624
  • 8259A
    +关注

    关注

    0

    文章

    6

    浏览量

    8247
收藏 人收藏

    评论

    相关推荐

    8259A芯片是一种什么类型的芯片?从硬件看中断之8259A

    在中断控制过程中,中断源的识别和优先权的确定可以用硬件排队电路等实现, **Intel 8259A可编程中断控制器就是为完成这些任务而设计的一种器件** 。
    的头像 发表于 08-04 17:17 3666次阅读
    <b class='flag-5'>8259A</b>芯片是一种什么类型的芯片?从硬件看中断之<b class='flag-5'>8259A</b>

    求答

    A0=0)和FFDDH(A0=1),试编写8259A初始化程序段。初试程序段为:MOVDX,0FFDCHMOVAL,13HOUTDX,
    发表于 08-26 14:25

    求助!!!protues的8259仿真问题

    ,DATAMOV DS,AX;8259A初始化MOV DX,IOY1+00HMOV AL,13H;初始化8259A的ICW1OUT DX,ALMOV DX,IOY1+02HMOVAL,
    发表于 05-30 21:48

    中断系统扩展设计

    初始化程序。自行选用所需要的电子元器件,比如:锁存器、缓冲器、基本逻辑门电路、译码器等器件(常用74系列器件);查问资料,自行确定新增8259A的端口地址。是不是要三片8259级联,那两个从片怎么连在一个IR6上?应该怎么做?
    发表于 01-13 16:35

    初始化封装

    和仿真开始运行)初始化封装子系统。有关详细信息,请参阅 执行初始化命令。您可以针对以下情况添加封装初始化代码:指定封装参数的初始值。例如,要
    发表于 08-27 07:17

    LCD1602显示程序步骤及如何初始化具体需要

    LCD1602显示介绍及程序LCD1602介绍写命令 代码写数据 代码LCD1602显示程序步骤及如何
    发表于 11-18 09:07

    请问GPIO初始化步骤是怎样的?

    请问GPIO初始化步骤是怎样的?
    发表于 11-25 07:09

    USART初始化步骤是怎样的?

    同步通信与异步通信的区别是什么?USART初始化步骤是怎样的?
    发表于 12-13 06:51

    STM32 TIMER初始化步骤是怎样的?

    STM32 TIMER初始化步骤是怎样的?
    发表于 12-16 07:23

    STM32执行代码初始化卡住怎么解决

    STM32的板子上电或者复位,接有显示屏或者LED指示灯的都会卡住解决:1、检查自己的代码是否有中断,有中断的话,其初始化放在其他硬件初始化之后即:中断的初始化放在进入while()循
    发表于 02-14 06:16

    8259A在51单片机中的应用

    8259A在MCS一51中的应用进行了分析,给出了电路和相应的程序,并对应用中容易遇到的问题给出了解决方案。
    发表于 11-07 15:20 57次下载

    CR95HF 的初始化步骤

    STM32F103上的CR95HF 的初始化步骤
    发表于 12-14 16:01 0次下载

    8259a的5种工作方式详细介绍

    8259A是专门为了对8085A和8086/8088进行中断控制而设计的芯片.本文主要介绍8259A主要功能及8259a的5种工作方式。
    的头像 发表于 05-23 14:12 2.1w次阅读
    <b class='flag-5'>8259a</b>的5种工作方式详细<b class='flag-5'>介绍</b>

    8259引脚和工作原理介绍

    本文首先介绍8259A主要功能及内部结构,其次介绍8259A引脚图及工作原理和工作方式,最后介绍8
    发表于 05-28 08:34 1.7w次阅读
    <b class='flag-5'>8259</b>引脚和工作原理<b class='flag-5'>介绍</b>

    使用STM32CubeMX生成初始化代码

    我使用STM32CubeMX生成初始化代码,使用LL库,这里只介绍跟i2c相关的部分,其他必要的初始化需要自己完成。芯片使用stm32f042。本文的
    的头像 发表于 03-22 15:26 1953次阅读