0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

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

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

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

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

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

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

對8259A的操作有兩類命令,其中一類是ICW,另一類是OCW。ICW用來對8259A進行初始化,而OCW則用來在初始化后對8259A發(fā)布命令。有意思的是,8259A的兩個端口對于這兩類命令的發(fā)布是有固定安排的。對于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的倍數(shù)。

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,其原因在于我們要允許中斷請求的按優(yōu)先級搶占。如果我們將EOI通知設定為自動模式,那么在CPU發(fā)出第二個 INTA信號后,8259A中相應的ISR就會自動清零,而此時該中斷服務程序還沒有被調(diào)用。如果在該中斷服務程序被調(diào)用的過程中,8259A收到了優(yōu)先級比當前正在處理的中斷優(yōu)先級低的中斷請求,由于正在處理的中斷在ISR中相應的位已經(jīng)清零,因此這個新的中斷請求就完全可以搶占正在處理的優(yōu)先級比它高的中斷服務程序。

二、初始化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發(fā)送一個操作控制字。需要屏蔽哪個中斷請求就將該字上相應的位置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 &= ?。? 《《 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被設置為0,那么該命令將對整個8259A有效。否則,將針對bit2:0這3位所代表的IRQ進行操作。由于我們前面已經(jīng)將8259A設置為手動EOI模式,所以在這里我們要將bit7:5設置為(001)

OCW3:

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

四、8259A初始化編程

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

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

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

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個中斷輸入未用),其它開中斷

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

    關注

    5

    文章

    900

    瀏覽量

    41578
  • 初始化
    +關注

    關注

    0

    文章

    50

    瀏覽量

    11910
  • 8259A
    +關注

    關注

    0

    文章

    6

    瀏覽量

    8283
收藏 人收藏

    評論

    相關推薦

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

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

    求答

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

    8259A在51單片機中的應用

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

    CR95HF 的初始化步驟

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

    使用QCS生成DPAA初始化代碼

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

    8259a的5種工作方式詳細介紹

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

    8253初始化程序分享_8253應用案例

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

    8259引腳和工作原理介紹

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

    lcd NT35512的手冊及初始化代碼免費下載

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

    STM32 GPIO的基本結構工作模式和初始化步驟的詳細資料概述

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

    IIC總線初始化基本驅(qū)動參考程序應用代碼免費下載

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

    51單片機定時器的初始化步驟詳細說明

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

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

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

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

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

    使用STM32CubeMX生成初始化代碼

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