0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

8259a初始化的步驟及代碼介紹

姚小熊27 ? 來(lái)源:網(wǎng)絡(luò)整理 ? 2018-05-23 14:24 ? 次閱讀

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

首先,外部中斷請(qǐng)求(IR0到IR7)傳輸?shù)絀MR,IMR根據(jù)此中斷請(qǐng)求是否被屏蔽,以決定是將其丟棄,還是放入IRR中等待進(jìn)一步處理。當(dāng)8259A等待到一個(gè)中斷時(shí)機(jī)時(shí),優(yōu)先級(jí)仲裁單元會(huì)從所有放入IRR中的中斷請(qǐng)求中挑出一個(gè)優(yōu)先級(jí)最高的中斷,傳遞給CPU處理。值得注意的是中斷優(yōu)先級(jí)是隨著中斷請(qǐng)求號(hào)降低而提高的。在CPU的INTR引腳接收到8259A發(fā)送過(guò)來(lái)的信號(hào)后,CPU會(huì)暫停執(zhí)行下一條指令,并向8259A發(fā)送一個(gè)INTA信號(hào)。在 8259A接收到該信號(hào)后,就會(huì)將ISR中代表該中斷的位置1,并將IRR中相應(yīng)的位清零。以表示該中斷正在被CPU處理。接著CPU會(huì)向8259A再發(fā)送一個(gè)INTA信號(hào),向其請(qǐng)求中斷向量號(hào)。這時(shí),8259A會(huì)根據(jù)先前設(shè)置好的起始向量號(hào)再加上中斷請(qǐng)求號(hào)計(jì)算出中斷向量號(hào),并將其放入數(shù)據(jù)總線中。

這時(shí)候,如果8259A的EOI通知被設(shè)定為自動(dòng)模式,那么8259A就會(huì)自動(dòng)將ISR中剛才置1的位清零。在CPU獲得該中斷向量號(hào)后,就會(huì)轉(zhuǎn)去調(diào)用該中斷服務(wù)程序。在處理完該中斷后如果8259A的EOI通知被設(shè)定為人工模式,則還要向8259A發(fā)送一個(gè)EOI。通常來(lái)講,這一工作往往是在中斷服務(wù)程序中完成。在8259A接收到該EOI通知后,就會(huì)將ISR中剛才置1的位清零。

以上就是8259A處理一個(gè)中斷的整個(gè)過(guò)程的簡(jiǎn)述。由于中斷請(qǐng)求存在著優(yōu)先級(jí),因此,如果在一個(gè)中斷處理期間,8259A又收到了新的中斷請(qǐng)求,則首先跟當(dāng)前處理的優(yōu)先級(jí)進(jìn)行比較,如果新到的中斷請(qǐng)求的優(yōu)先級(jí)高于當(dāng)前處理的中斷請(qǐng)求,則馬上處理新到的中斷請(qǐng)求,否則則將新到的中斷請(qǐng)求放入IRR。

對(duì)于8259A的操作,是通過(guò)端口進(jìn)行的。其中, Master的端口地址為0x20, 0x21, Slave的端口地址位0xA0,0xA1。8259A具有兩種命令,一種是ICW,其作用是用來(lái)初始化8259A芯片。另一個(gè)是OCW,其作用是用來(lái)向 8259A發(fā)送命令。雖然在系統(tǒng)啟動(dòng)后BIOS會(huì)自動(dòng)初始化8259A,但這并不是我們所需要的。因?yàn)樵谶M(jìn)入保護(hù)模式后,我們要設(shè)置IDT,因此我們必須根據(jù)所設(shè)置的IDT去初始化8259A.

對(duì)8259A的操作有兩類命令,其中一類是ICW,另一類是OCW。ICW用來(lái)對(duì)8259A進(jìn)行初始化,而OCW則用來(lái)在初始化后對(duì)8259A發(fā)布命令。有意思的是,8259A的兩個(gè)端口對(duì)于這兩類命令的發(fā)布是有固定安排的。對(duì)于0x20和0xA0端口,你可以向它們寫(xiě)入ICW1,OCW2,OCW3,讀取IRR和ISR。對(duì)于0x21和0xA1端口,你可以向它們寫(xiě)入ICW2,ICW3,ICW4, 并能夠讀寫(xiě)IMR寄存器。

下面我們分別來(lái)討論這幾個(gè)命令

ICW1:該命令作為初始化序列的第一條命令,一旦向端口送入該命令,8259A就認(rèn)為初始化序列開(kāi)始。

8259a初始化的步驟及代碼介紹

在設(shè)置時(shí),對(duì)于80x86的CPU,其應(yīng)設(shè)置為(00010001),也就是0x11。

ICW2:該命令用來(lái)指定所初始化的8259A中斷請(qǐng)求的起始向量。其中ICW2的低3位必須為0,其這么做的原因在于當(dāng)該8259A接收到一個(gè)中斷請(qǐng)求時(shí),低3位會(huì)自動(dòng)填充為所接受到的向量號(hào)。因此這也就決定了我們?cè)O(shè)置的起始中斷向量,必須為8的倍數(shù)。

ICW3:Master PIC和Slave PIC對(duì)于ICW3命令具有不同的格式

對(duì)于Master PIC,Slave PIC被接到了Master PIC的哪個(gè)IRQ上,則ICW3中相應(yīng)的位就置1。在8259A中,由于SlavePIC是級(jí)連在Master PIC的IRQ2上的,因此ICW3的值應(yīng)該為(00000100),也就是0x04。而對(duì)于SlavePIC其高5位必須設(shè)置為零,低3位為該P(yáng)IC被級(jí)連到哪個(gè)Master PIC的IRQ號(hào),在8259A中,其SlavePIC的值為(00000010),即0x02。

ICW4:

8259a初始化的步驟及代碼介紹

在80x86模式下,我們采用默認(rèn)的Full Nested Mode,將ICW4設(shè)置為(000000001),即0x01。

而我們之所以我們要采用NormalEOI,其原因在于我們要允許中斷請(qǐng)求的按優(yōu)先級(jí)搶占。如果我們將EOI通知設(shè)定為自動(dòng)模式,那么在CPU發(fā)出第二個(gè) INTA信號(hào)后,8259A中相應(yīng)的ISR就會(huì)自動(dòng)清零,而此時(shí)該中斷服務(wù)程序還沒(méi)有被調(diào)用。如果在該中斷服務(wù)程序被調(diào)用的過(guò)程中,8259A收到了優(yōu)先級(jí)比當(dāng)前正在處理的中斷優(yōu)先級(jí)低的中斷請(qǐng)求,由于正在處理的中斷在ISR中相應(yīng)的位已經(jīng)清零,因此這個(gè)新的中斷請(qǐng)求就完全可以搶占正在處理的優(yōu)先級(jí)比它高的中斷服務(wù)程序。

二、初始化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);

}

三、如何通過(guò)OCW對(duì)8259A進(jìn)行操作

OCW1:該命令用來(lái)屏蔽所設(shè)定的中斷請(qǐng)求。其操作方式是,向你要屏蔽的中斷請(qǐng)求所在的8259A發(fā)送一個(gè)操作控制字。需要屏蔽哪個(gè)中斷請(qǐng)求就將該字上相應(yīng)的位置1即可。

實(shí)例代碼如下:

#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 &= ?。? 《《 IRQ);

outportb(PORT_INT_MASK_M, mask);

}

else

{

mask = inportb(PORT_INT_MASK_S);

mask &= ?。? 《《 (IRQ-8));

outportb(PORT_INT_MASK_S, mask);

}

}

OCW2:

8259a初始化的步驟及代碼介紹

如果OCW2中的bit6被設(shè)置為0,那么該命令將對(duì)整個(gè)8259A有效。否則,將針對(duì)bit2:0這3位所代表的IRQ進(jìn)行操作。由于我們前面已經(jīng)將8259A設(shè)置為手動(dòng)EOI模式,所以在這里我們要將bit7:5設(shè)置為(001)

OCW3:

8259a初始化的步驟及代碼介紹

四、8259A初始化編程

對(duì)8259的初始化一定要按規(guī)定的順序進(jìn)行,假定8259占用的I/O地址為FF00和FF02H(奇地址):

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

MOV AL,13H ;寫(xiě)ICW1,邊沿觸發(fā),單片,

OUT DX,AL

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

MOV AL,48H ;寫(xiě)ICW2,設(shè)置中斷類型碼

OUT DX,AL ;中斷向量為48H-4FH(IR0-IR7)單片8259,不對(duì)ICW3設(shè)置

MOV AL,03H ;寫(xiě)ICW4,8086/88模式,自動(dòng)中;斷結(jié)束 (EOI),非緩沖,一般嵌套

OUT DX,AL

MOV AL,0E0H ;寫(xiě)OCW1,屏蔽IR5、IR6、 IR7中斷源

OUT DX,AL ;(假定這3個(gè)中斷輸入未用),其它開(kāi)中斷

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    902

    瀏覽量

    42411
  • 初始化
    +關(guān)注

    關(guān)注

    0

    文章

    50

    瀏覽量

    12036
  • 8259A
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    8326
收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    8259A芯片是一種什么類型的芯片?從硬件看中斷之8259A

    在中斷控制過(guò)程中,中斷源的識(shí)別和優(yōu)先權(quán)的確定可以用硬件排隊(duì)電路等實(shí)現(xiàn), **Intel 8259A可編程中斷控制器就是為完成這些任務(wù)而設(shè)計(jì)的一種器件** 。
    的頭像 發(fā)表于 08-04 17:17 ?6931次閱讀
    <b class='flag-5'>8259A</b>芯片是一種什么類型的芯片?從硬件看中斷之<b class='flag-5'>8259A</b>

    求答

    A0=0)和FFDDH(A0=1),試編寫(xiě)8259A初始化程序段。初試程序段為:MOVDX,0FFDCHMOVAL,13HOUTDX,
    發(fā)表于 08-26 14:25

    8259A在51單片機(jī)中的應(yīng)用

    對(duì)8259A在MCS一51中的應(yīng)用進(jìn)行了分析,給出了電路和相應(yīng)的程序,并對(duì)應(yīng)用中容易遇到的問(wèn)題給出了解決方案。
    發(fā)表于 11-07 15:20 ?57次下載

    CR95HF 的初始化步驟

    STM32F103上的CR95HF 的初始化步驟
    發(fā)表于 12-14 16:01 ?0次下載

    使用QCS生成DPAA初始化代碼

    本文檔指導(dǎo)用戶如何使用從qc DPAA生成的代碼,用戶應(yīng)用程序的上下文中利用USDPAA司機(jī)。該文檔解釋了反射器應(yīng)用程序,并演示了幫助用戶快速插入QCS的步驟,這些插件在應(yīng)用程序中生成DPAA初始化
    發(fā)表于 09-07 17:21 ?0次下載
    使用QCS生成DPAA<b class='flag-5'>初始化</b><b class='flag-5'>代碼</b>

    8259a的5種工作方式詳細(xì)介紹

    8259A是專門(mén)為了對(duì)8085A和8086/8088進(jìn)行中斷控制而設(shè)計(jì)的芯片.本文主要介紹8259A主要功能及8259a的5種工作方式。
    的頭像 發(fā)表于 05-23 14:12 ?2.3w次閱讀
    <b class='flag-5'>8259a</b>的5種工作方式詳細(xì)<b class='flag-5'>介紹</b>

    8253初始化程序分享_8253應(yīng)用案例

    本文首先介紹了8253概念及8253各通道的工作方式,其次詳細(xì)介紹了8253初始化要求及編程,最后用一個(gè)例子介紹了8253的初始化程序。
    發(fā)表于 05-23 15:52 ?2.3w次閱讀
    8253<b class='flag-5'>初始化</b>程序分享_8253應(yīng)用案例

    8259引腳和工作原理介紹

    本文首先介紹8259A主要功能及內(nèi)部結(jié)構(gòu),其次介紹8259A引腳圖及工作原理和工作方式,最后介紹8
    發(fā)表于 05-28 08:34 ?2.1w次閱讀
    <b class='flag-5'>8259</b>引腳和工作原理<b class='flag-5'>介紹</b>

    lcd NT35512的手冊(cè)及初始化代碼免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是lcd NT35512的手冊(cè)及初始化代碼免費(fèi)下載
    發(fā)表于 06-29 08:00 ?96次下載
    lcd NT35512的手冊(cè)及<b class='flag-5'>初始化</b><b class='flag-5'>代碼</b>免費(fèi)下載

    STM32 GPIO的基本結(jié)構(gòu)工作模式和初始化步驟的詳細(xì)資料概述

    本文檔的主要內(nèi)容詳細(xì)介紹的是STM32 GPIO的基本結(jié)構(gòu)工作模式和初始化步驟的詳細(xì)資料概述。
    發(fā)表于 10-12 08:00 ?22次下載
    STM32 GPIO的基本結(jié)構(gòu)工作模式和<b class='flag-5'>初始化</b><b class='flag-5'>步驟</b>的詳細(xì)資料概述

    IIC總線初始化基本驅(qū)動(dòng)參考程序應(yīng)用代碼免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是IIC總線初始化基本驅(qū)動(dòng)參考程序應(yīng)用代碼免費(fèi)下載。程序功能:為IIC總線的基本驅(qū)動(dòng)程序(此程序沒(méi)有寫(xiě)主函數(shù),只是一些IIC必備的子函數(shù))
    發(fā)表于 01-16 08:00 ?5次下載
    IIC總線<b class='flag-5'>初始化</b>基本驅(qū)動(dòng)參考程序應(yīng)用<b class='flag-5'>代碼</b>免費(fèi)下載

    51單片機(jī)定時(shí)器的初始化步驟詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是51單片機(jī)定時(shí)器的初始化步驟詳細(xì)說(shuō)明。
    發(fā)表于 07-03 17:42 ?6次下載
    51單片機(jī)定時(shí)器的<b class='flag-5'>初始化</b><b class='flag-5'>步驟</b>詳細(xì)說(shuō)明

    8259A中斷控制芯片的引腳圖和主要功能的資料概述

      8259A是一種中斷控制芯片,在單片機(jī)系統(tǒng)中一般用來(lái)擴(kuò)展單片機(jī)的中斷,pc機(jī)中也有這個(gè)芯片,
    的頭像 發(fā)表于 09-08 11:43 ?1.5w次閱讀
    <b class='flag-5'>8259A</b>中斷控制芯片的引腳圖和主要功能的資料概述

    STM32執(zhí)行代碼初始化卡住,或者上電卡住,或者復(fù)位卡住,導(dǎo)致代碼不執(zhí)行

    STM32的板子上電或者復(fù)位,接有顯示屏或者LED指示燈的都會(huì)卡住解決:1、檢查自己的代碼是否有中斷,有中斷的話,其初始化放在其他硬件初始化之后 即:中斷的初始化放在進(jìn)入while
    發(fā)表于 12-09 09:21 ?22次下載
    STM32執(zhí)行<b class='flag-5'>代碼</b><b class='flag-5'>初始化</b>卡住,或者上電卡住,或者復(fù)位卡住,導(dǎo)致<b class='flag-5'>代碼</b>不執(zhí)行

    使用STM32CubeMX生成初始化代碼

    我使用STM32CubeMX生成初始化代碼,使用LL庫(kù),這里只介紹跟i2c相關(guān)的部分,其他必要的初始化需要自己完成。芯片使用stm32f042。本文的
    的頭像 發(fā)表于 03-22 15:26 ?3562次閱讀

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品