專題:嵌入式S3C2440中斷系統(tǒng)_第1頁(yè)
專題:嵌入式S3C2440中斷系統(tǒng)_第2頁(yè)
專題:嵌入式S3C2440中斷系統(tǒng)_第3頁(yè)
專題:嵌入式S3C2440中斷系統(tǒng)_第4頁(yè)
專題:嵌入式S3C2440中斷系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

專題四:S3C2440中斷系統(tǒng)主要內(nèi)容:一、概述及基本概念二、S3C2440中斷系統(tǒng)三、應(yīng)用部分

接口電路:中斷應(yīng)用實(shí)例C程序:中斷編程步驟Linux:中斷服務(wù)函數(shù)及其驅(qū)動(dòng)程序

一、概述及其基本概念一、概述及概念

1、必要性及應(yīng)用

當(dāng)計(jì)算機(jī)用于實(shí)時(shí)控制時(shí),中斷是一個(gè)十分重要的功能?,F(xiàn)場(chǎng)的各個(gè)參數(shù)、信息,需要的話可在任何時(shí)候發(fā)出中斷申請(qǐng),要求CPU處理;CPU就可以馬上響應(yīng)(若中斷是開放的話)加以處理。這樣的及時(shí)處理在查詢的工作方式是做不到的。

中斷功能便于實(shí)現(xiàn)1.分時(shí)操作2.實(shí)時(shí)處理3.故障處理4.主機(jī)與外設(shè)之間的速度匹配計(jì)算機(jī)在運(yùn)行過(guò)程中,往往會(huì)出現(xiàn)事先預(yù)料不到的情況,或出現(xiàn)一些故障:如電源突跳,存儲(chǔ)出錯(cuò),運(yùn)算溢出等等。計(jì)算機(jī)就可以利用中斷系統(tǒng)自行處理,而不必停機(jī)或報(bào)告工作人員。2、中斷

指在計(jì)算機(jī)執(zhí)行期間,系統(tǒng)內(nèi)發(fā)生任何非尋常的或非預(yù)期緊急需處理事件,使得CPU暫時(shí)中斷當(dāng)前正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的時(shí)間處理程序。待處理完畢后又返回原來(lái)被中斷處繼續(xù)執(zhí)行或調(diào)度新的進(jìn)程執(zhí)行的過(guò)程。3、中斷響應(yīng)中斷響應(yīng)是當(dāng)中央處理機(jī)發(fā)現(xiàn)已有中斷請(qǐng)求時(shí),中止,保存現(xiàn)行程序執(zhí)行,并自動(dòng)引出中斷處理程序的過(guò)程。中斷響應(yīng)是解決中斷的發(fā)現(xiàn)和接收問(wèn)題的過(guò)程,是由中斷裝置完成的。中斷響應(yīng)是硬件對(duì)中斷請(qǐng)求作出響應(yīng)的過(guò)程,包括識(shí)別中斷源,保留現(xiàn)場(chǎng),引出中斷處理程序等過(guò)程。①CPU在當(dāng)前指令執(zhí)行結(jié)束時(shí),響應(yīng)中斷,進(jìn)入中斷的響應(yīng)周期;②發(fā)出二個(gè)中斷回答信號(hào)INTA完成一個(gè)中斷響應(yīng)周期;③進(jìn)行斷點(diǎn)及標(biāo)志保存如:將段地址(CS),偏移地址(IP)標(biāo)志FR以及壓入堆棧。④讀取中斷類型號(hào),找到中斷源;⑤裝入中斷服務(wù)程序的入口地址(CS,IP)4、中斷源:引起中斷的原因或者說(shuō)發(fā)出中斷請(qǐng)求的來(lái)源叫做中斷源。5、優(yōu)先級(jí):為使系統(tǒng)能及時(shí)響應(yīng)并處理發(fā)生的所有中斷,系統(tǒng)根據(jù)引起中斷事件的重要性和緊迫程度,硬件將中斷源分為若干個(gè)級(jí)別,稱作中斷優(yōu)先級(jí)。

中斷優(yōu)先級(jí)越高,則響應(yīng)優(yōu)先權(quán)就越高。當(dāng)CPU正在執(zhí)行中斷服務(wù)程序時(shí),又有中斷優(yōu)先級(jí)更高的中斷申請(qǐng)產(chǎn)生,這時(shí)CPU就會(huì)暫停當(dāng)前的中斷服務(wù)轉(zhuǎn)而處理高級(jí)中斷申請(qǐng),待高級(jí)中斷處理程序完畢再返回原中斷程序斷點(diǎn)處繼續(xù)執(zhí)行,這一過(guò)程稱為中斷嵌套。

二、S3C2440中斷系統(tǒng)一、S3C2440中斷體系結(jié)構(gòu)ARM體系CPU的7種工作模式1、用戶模式(usr):ARM處理器正常的程序執(zhí)行狀態(tài)2、快速中斷模式(fiq):用于高速數(shù)據(jù)傳輸或通道處理3、中斷模式(irq):用于通用的中斷處理4、管理模式(svc):操作系統(tǒng)使用的保護(hù)模式5、數(shù)據(jù)訪問(wèn)終止模式(abt):當(dāng)數(shù)據(jù)或指令預(yù)取終止時(shí)進(jìn)入該模式,可用于虛擬存儲(chǔ)及存儲(chǔ)保護(hù)6、系統(tǒng)模式(sys):運(yùn)行具有特權(quán)的操作系統(tǒng)任務(wù)7、未定義指令中止模式(und):當(dāng)未定義的指令執(zhí)行時(shí)進(jìn)入該模式,可用于支持硬件協(xié)處理器的軟件仿真

除用戶模式外,其他6種工作模式都屬于特權(quán)模式,大多數(shù)程序運(yùn)行于用戶模式,進(jìn)入特權(quán)模式是為了處理中斷、異常,或者訪問(wèn)被保護(hù)的系統(tǒng)資源中斷是CPU處理外部突發(fā)事件的一個(gè)重要技術(shù)。根據(jù)中斷源的不同,可以把中斷分為硬件中斷和軟件中斷兩大類。

硬件中斷是由處理器自身的硬件系統(tǒng)或著外部硬件部件觸發(fā)引起的中斷類型,硬件中斷又可以分為外部中斷和內(nèi)部中斷兩類:

外部中斷一般是指由外設(shè)發(fā)出的中斷請(qǐng)求,如:按鍵中斷、串口中斷、定時(shí)器中斷等。外部中斷是可以屏蔽的中斷,也就是說(shuō),利用中斷控制器可以屏蔽這些外部設(shè)備的中斷請(qǐng)求,S3C2440共有24個(gè)外部中斷EINT0-EINT24。

內(nèi)部中斷是指因硬件出錯(cuò)(如突然掉電、奇偶校驗(yàn)錯(cuò)等)或運(yùn)算出錯(cuò)(除數(shù)為零、運(yùn)算溢出、單步中斷等)所引起的中斷,內(nèi)部中斷是不可屏蔽的中斷,S3C2440共有35個(gè)內(nèi)部中斷。

軟件中斷與硬件中斷不一樣,它不是由硬件觸發(fā)的,而是由軟件調(diào)用系統(tǒng)提供的一個(gè)指令(SWI)來(lái)觸發(fā)的中斷行為,是程序本身有意識(shí)的引發(fā)的中斷行為,由于在用戶模式下,程序?qū)μ幚砥髻Y源的訪問(wèn)會(huì)受到一些限制,因此,需要采用軟中斷的方式將處理器工作模式切到異常模式下訪問(wèn)受限資源,因此軟中斷一般都被用于實(shí)現(xiàn)特殊系統(tǒng)調(diào)用功能提供給軟件系統(tǒng)使用。三、中斷源判定

S3C2440中斷源如下頁(yè)表格所示,支持多達(dá)60個(gè)中斷源。次級(jí)中斷源與(主)中斷源共享一條中斷線。多個(gè)中斷源共享一條中斷線的需要在中斷服務(wù)子程序中判斷是哪一個(gè)中斷源發(fā)出的中斷。S3C2440對(duì)60種中斷源的管理是按層級(jí)分的。如下圖所示(三級(jí)模式):3、中斷次級(jí)源四、中斷運(yùn)行控制仲裁步驟由硬件優(yōu)先級(jí)邏輯決定并且寫入結(jié)果到幫助用戶通告是各種中斷源中的哪個(gè)中斷發(fā)生了的中斷掛起寄存器中。中斷處理框圖如圖所示。

如果ARM920TCPU中的PSR的F位被置位為1,CPU不會(huì)接收來(lái)自中斷控制器的快中斷請(qǐng)求(FIQ)。同樣的如果PSR的I位被置位為1,CPU不會(huì)接收來(lái)自中斷控制器的中斷請(qǐng)求(IRQ)。因此,中斷控制器可以通過(guò)清除PSR的F位和I位為0并且設(shè)置INTMSK的相應(yīng)位為0來(lái)接收中斷。ARM920T有兩種中斷模式的類型:FIQ或IRQ,所有中斷源在中斷請(qǐng)求時(shí)決定使用哪種類型。五、中斷優(yōu)先級(jí)設(shè)定每個(gè)仲裁器可以處理基于1位仲裁器模式控制(ARB_MODE)和選擇控制信號(hào)(ARB_SEL)的2位的6個(gè)中斷請(qǐng)求,如下:–如果ARB_SEL位為00b,優(yōu)先級(jí)順序?yàn)镽EQ0、REQ1、REQ2、REQ3、REQ4和REQ5。–如果ARB_SEL位為01b,優(yōu)先級(jí)順序?yàn)镽EQ0、REQ2、REQ3、REQ4、REQ1和REQ5。–如果ARB_SEL位為10b,優(yōu)先級(jí)順序?yàn)镽EQ0、REQ3、REQ4、REQ1、REQ2和REQ5。–如果ARB_SEL位為11b,優(yōu)先級(jí)順序?yàn)镽EQ0、REQ4、REQ1、REQ2、REQ3和REQ5。請(qǐng)注意仲裁器的REQ0的優(yōu)先級(jí)總是最高并且REQ5的優(yōu)先級(jí)總是最低。此外,通過(guò)改變ARB_SEL位,可以輪換REQ1到REQ4的順序。此處,如果ARB_MODE位被設(shè)置為0,ARB_SEL位不能自動(dòng)改變,這使得仲裁器操作在固定優(yōu)先級(jí)模式中。(注意即使在此模式中,也不能通過(guò)手動(dòng)改變ARB_SEL位來(lái)重新配制優(yōu)先級(jí))。另一方面,如果ARB_MODE為1,ARB_SEL位會(huì)被輪換方式而改變,例如如果REQ1被服務(wù)ARB_SEL位被自動(dòng)改為01b以便REQ1進(jìn)入到最低的優(yōu)先級(jí)。ARB_SEL改變的詳細(xì)結(jié)果如下:–如果REQ0或REQ5被服務(wù),ARB_SEL位不會(huì)改變–如果REQ1被服務(wù),ARB_SEL位被改為01b。–如果REQ2被服務(wù),ARB_SEL位被改為10b。–如果REQ3被服務(wù),ARB_SEL位被改為11b。–如果REQ4被服務(wù),ARB_SEL位被改為00b。中斷優(yōu)先級(jí)產(chǎn)生模塊如下圖所示中斷優(yōu)先級(jí)發(fā)生模塊圖六、中斷控制器特殊寄存器此處中斷控制器中有5個(gè)控制寄存器:源掛起寄存器、中斷模式寄存器、屏蔽寄存器、優(yōu)先級(jí)寄存器和中斷掛起寄存器。所有來(lái)自中斷源的中斷請(qǐng)求首先被記錄到源掛起寄存器中?;谥袛嗄J郊拇嫫?,它們被分配到2個(gè)組中,包括快中斷請(qǐng)求(FIQ)和普通中斷請(qǐng)求(IRQ)。IRQ的多仲裁過(guò)程是基于優(yōu)先級(jí)寄存器。源掛起(SRCPND)寄存器SRCPND寄存器由32位組成,其每一位都涉及一個(gè)中斷源。如果中斷源產(chǎn)生了中斷則相應(yīng)的位被設(shè)置為1并且等待中斷服務(wù)。因此此寄存器指示出是哪個(gè)中斷源正在等待請(qǐng)求服務(wù)。注意SRCPND寄存器的每一位都是由中斷源自動(dòng)置位,其不顧INTMASK寄存器中的屏蔽位。另外SRCPND寄存器不受中斷控制器的優(yōu)先級(jí)邏輯的影響。在指定中斷源的中斷服務(wù)程序中,必須通過(guò)清除SRCPND寄存器的相應(yīng)位來(lái)正確的獲得來(lái)自相同源的中斷請(qǐng)求。如果從ISR中返回并且未清除相應(yīng)位,則中斷控制器的操作就好像其它中斷請(qǐng)求已經(jīng)從同一個(gè)源進(jìn)入了。換句話說(shuō),如果SRCPND寄存器的指定位被設(shè)置為1,其通常被認(rèn)作一個(gè)有效中斷請(qǐng)求正在等待服務(wù)。清除相應(yīng)位的時(shí)間依賴于用戶的需要。如果希望收到來(lái)自相同冤源的其它有效請(qǐng)求,則應(yīng)該首先清除相應(yīng)位,并且接著使能中斷??梢酝ㄟ^(guò)寫入一個(gè)數(shù)據(jù)到此寄存器來(lái)清除SRCPND寄存器的指定位。其只清除那些數(shù)據(jù)中被設(shè)置為1的相應(yīng)位置的SRCPND位。那些數(shù)據(jù)中被設(shè)置為0的相應(yīng)位置的位保持不變。1)RCPND)寄存器SRCPND寄存器由32位組成如表一所示,源掛起(S其每一位都涉及一個(gè)中斷源,如表二所示。如果中斷源產(chǎn)生了中斷則相應(yīng)的位被設(shè)置為1并且等待中斷服務(wù),因此此寄存器指示出是哪個(gè)中斷源正在等待請(qǐng)求服務(wù)。在指定中斷源的中斷服務(wù)程序中,必須通過(guò)清除SRCPND寄存器的相應(yīng)位來(lái)正確地獲得來(lái)自相同源的中斷請(qǐng)求。如果從ISR中返回并且未清除相應(yīng)位,則中斷控制器的操作就好像其他中斷請(qǐng)求已經(jīng)從同一個(gè)源進(jìn)入了。換句話說(shuō),如果SRCPND寄存器的指定位被設(shè)置為1,其通常被認(rèn)作一個(gè)有效中斷請(qǐng)求正在等待服務(wù)。清除指定位的方法是通過(guò)寫入數(shù)據(jù)到此寄存器中來(lái)清除INTPND寄存器的指定位。在指定位寫1只會(huì)清除數(shù)據(jù)中設(shè)置為1的相應(yīng)INTPND寄存器位的位置。數(shù)據(jù)中設(shè)置為0的相應(yīng)位的位置則保持不變。表一

2)中斷模式寄存器(INTMOD)INTMOD寄存器由32位組成,每一位都都涉及一個(gè)中斷源。如果指定某位為0則表示為IRQ模式中處理;如果某個(gè)指定為被設(shè)置為1,則在FIQ(快中斷)模式中處理相應(yīng)中斷。因此,該寄存器只能有一位為1。3)中斷屏蔽寄存器(INTMSK)INTMSK寄存器由32位組成,其每一位都都涉及一個(gè)中斷源。如果某個(gè)指定為被設(shè)置為1,則CPU不會(huì)去服務(wù)來(lái)自相應(yīng)中斷源(請(qǐng)注意即使在這種情況中,SRCPND寄存器的相應(yīng)位也設(shè)置為1)的中斷請(qǐng)求;如果屏蔽位為0,則可以服務(wù)中斷請(qǐng)求。4)中斷優(yōu)先級(jí)寄存器(PRIORITY)表25)中斷掛起寄存器(INTPND)中斷掛起寄存器中32位的每一位都表明了是否相應(yīng)未屏蔽并且正在等待中斷服務(wù)的中斷請(qǐng)求具有最高的優(yōu)先級(jí)。當(dāng)INTPND寄存器在優(yōu)先級(jí)邏輯后被定位了,只有1位可以設(shè)置為1并且產(chǎn)生中斷請(qǐng)求IRQ給CPU。IRQ的中斷服務(wù)程序中可以讀取此寄存器來(lái)決定服務(wù)32個(gè)中斷源的哪個(gè)源。就如SRCPND寄存器,必須在中斷服務(wù)程序中清除了SRCPND寄存器后清除此寄存器??梢酝ㄟ^(guò)寫入數(shù)據(jù)到此寄存器中來(lái)清除INTPND寄存器的指定位。只會(huì)清除數(shù)據(jù)中設(shè)置為1的相應(yīng)INTPND寄存器位的位置。數(shù)據(jù)中設(shè)置為0的相應(yīng)位的位置則保持不變。

6)中斷偏移寄存器(INTOFFSET)中斷偏移寄存器中的值表明了是哪個(gè)IRQ模式的中斷請(qǐng)求在INTPND寄存器中。此位可以通過(guò)清楚SRCPND和INTPND自動(dòng)清除。

7)次級(jí)源掛起寄存器(SUBSRCPND,見表4-21)可以通過(guò)寫入數(shù)據(jù)到此寄存器來(lái)清除SUBSRCPND寄存器的指定位。只有數(shù)據(jù)中那些被設(shè)置為1的相應(yīng)SUBSRCPND寄存器位的位置才能被清除。數(shù)據(jù)中那些被設(shè)置為0的相應(yīng)位的位置則保持不變。

8)中斷次級(jí)屏蔽寄存器(INTSUBMSK,見表4-22)此寄存器有11位,其每一位都與一個(gè)中斷源相聯(lián)系。如果某個(gè)指定位被設(shè)置為1,則相應(yīng)中斷源的中斷請(qǐng)求不會(huì)被CPU所服務(wù)(請(qǐng)注意即使在這種情況中,SRCPND寄存器的相應(yīng)位也設(shè)置為1);如果屏蔽位為0,則可以服務(wù)中斷請(qǐng)求。一、中斷向量地址表示例Reset_Handler ;復(fù)位處理0x0Undef_Handler ;未定義指令處理0x4SWI_Handler ;SWI指令處理0x8PreAbort_Handler ;預(yù)取指令中止處理0xCDataAbort_Handler ;數(shù)據(jù)異常處理0x10 ;保留0x14IRQ_Handler ;IRQ中斷處理0x18FIQ_Handler ;FIQ中斷處理0x1C二、IRQ中斷處理過(guò)程

計(jì)算偏移量,其實(shí)原理很簡(jiǎn)單,首先INTOFFSET保存著當(dāng)前是哪個(gè)IRQ中斷,例如0代表著HandleEINT0,1代表HandleEINT1等。然后得到中斷處理函數(shù)的向量表,這個(gè)表的首地址就是HandleEINT0,HandleEINT0+INTOFFSET,即基地址加偏移量就得到表中某項(xiàng)了,當(dāng)然,因?yàn)檫@里是中斷處理向量每一項(xiàng)占用4個(gè)字節(jié),所以用“l(fā)sl#2”處理一下,左移2位相當(dāng)于乘以4,偏移量乘以4,這應(yīng)該很好理解的。

五、

外部中斷要想正確地執(zhí)行2440的外部中斷,一般需要完成兩個(gè)部分內(nèi)容:中斷初始化和中斷處理函數(shù)。

外部中斷被分為被SUBSRCPND/SUBMASK寄存器控制的中斷,不被SUBSRCPND/SUBMASK寄存器控制的中斷;

外部中斷必須經(jīng)過(guò)SRCPND(SOURCEPENDING)寄存器的控制;

外部中斷最終經(jīng)過(guò)INTMASK(中斷屏蔽)與INTMODE(中斷模式)寄存器的控制;

外部中斷經(jīng)過(guò)PRIORITY(優(yōu)先級(jí)寄存器)的仲裁決定優(yōu)先級(jí);

通過(guò)INTPND寄存器來(lái)確認(rèn)中斷的發(fā)生以及清除中斷,同一時(shí)間內(nèi)只有一位被置1。1、外部中斷主要寄存器1)外部中斷控制寄存器EXTINTnEXTINTn設(shè)置外部中斷請(qǐng)求信號(hào)是電平觸發(fā)還是邊沿觸發(fā),2)外部中斷屏蔽寄存器EINTMASK設(shè)置開放或屏蔽對(duì)應(yīng)的外部中斷,與INTMASK類似。3)外部中斷掛起寄存器EINTPEND外部中斷掛起寄存器,與INTPEND類似。例:下面給出的是一個(gè)外部中斷初始化的示例,示例中有6個(gè)按鍵接到了外部中斷。/*按鍵中斷的中斷處理函數(shù),中斷中只清了中斷的相關(guān)寄存器,未做中斷的相關(guān)處理*/voidkey_isp() /*中斷服務(wù)函數(shù)示例*/{/*dosomething*/rEINTPEND|=rEINTPEND;rSRCPND|=(1<<INT_EINT8_23); /*清源掛起相應(yīng)位*/rINTPND|=rINTPND; /*清中斷掛起寄存器相應(yīng)位*/}

rEXTINT2|=(2<<12); /*下降沿觸發(fā)*/

rEINTPEND|=(1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19);

/*清外部中斷掛起*/

rEINTMASK&=~((1<<19)|(1<<15)|(1<<14)|(1<<13)|(1<<11)|(1<<8));/*外部中斷屏蔽*/

rSRCPND|=(1<<5); /*清源掛起對(duì)應(yīng)位,EINT8_23*/

rINTPND|=(1<<5); /*清中斷掛起*/

rINTMSK&=~(1<<5); /*開放EINT8_23中斷*/

isr_handle_array[INT_EINT8_23]=key_isp; /*填寫中斷矢量*/}三、應(yīng)用部分1、下圖為S3C2440的接口電路s3c2440開發(fā)板上有6個(gè)按鍵,將其中的前4個(gè)按鍵設(shè)為外部中斷方式,當(dāng)按下K1時(shí),LED1亮;當(dāng)按下K2時(shí),LED2亮;當(dāng)按下K3時(shí),LED3亮;當(dāng)按下K4時(shí),LED4亮。硬件電路分析:

256M的2440板子上有4個(gè)LED,其接口電路如圖1所示,當(dāng)GPIO口輸出為低電平時(shí),相對(duì)應(yīng)的LED燈亮;輸出高電平時(shí),LED燈滅。按鍵接口電路如圖2所示,當(dāng)按鍵沒有按下時(shí),GPGx引腳為高電平;當(dāng)按鍵按下時(shí),引腳電平變?yōu)榈碗娖健?、中斷控制程序編寫步驟主程序1、先清除中斷源掛起寄存器(SRCPNDSRCPND)和中斷掛起寄存器(INTPND),可用rSRCPND=rSRCPND和rINTPND=rINTPND=來(lái)完成;

2、設(shè)中斷模式,這里使用通用中斷,rINTMOD=0x00000000因上電或復(fù)位時(shí)rINTMOD是清0的,這步也可以不做。

3、I/O口初始化,有些中斷源要通過(guò)I/O口向CPU申請(qǐng)中斷,如外部中斷0(EXTINT0通過(guò))F口的GPF0、外部中斷11(EXTINT11)通過(guò)G口的GPG3向CPU申請(qǐng)中斷,此時(shí)兩個(gè)口的控制寄存器GPFCON和GPGCON的要設(shè)置成:GPFCON[1:0]=1,0;GPGCON[7:6]=1,0。

4、設(shè)中斷服務(wù)函數(shù)地址,S3C2410在2410addr.h中定義了40個(gè)宏,設(shè)置了系統(tǒng)支持的中斷服務(wù)函數(shù)的指針,設(shè)中斷服務(wù)函數(shù)地址就是把我們編寫的中斷服務(wù)函數(shù)的地址(就是中斷服務(wù)函數(shù)的名字)賦予相應(yīng)的函數(shù)指針。每個(gè)中斷源的中斷服務(wù)函數(shù)指針名是固定的:pISR+中斷源。5、設(shè)中斷觸發(fā)方式,觸發(fā)方式有5種,有上升沿、下降沿、雙沿、低電平、高電平觸發(fā)方式,外部中斷觸發(fā)方式在外部中斷控制寄存器(EXTINTn)中設(shè)定。如EINT0觸發(fā)方式在EXTINT0[2:0]中設(shè)定,[2:0]=000低電平、001高電平、01X下降沿、10X上升沿、11X雙沿觸發(fā)。6、取消總中斷屏蔽和子中斷屏蔽,等待中斷。例如通過(guò)rEINTMASKrEINTMASK&=~(1<<11);rINTMASK&=~(BIT_EINT0|BIT_EINT8_23);來(lái)實(shí)現(xiàn)。中斷服務(wù)程序1.在中斷服務(wù)程序中,先屏蔽中斷,防止其他中斷產(chǎn)生干擾我們中斷服務(wù)程序的執(zhí)行;2.執(zhí)行中斷服務(wù)程序;3.清中斷源掛起寄存器(SRCPND)和中斷掛起寄存器(INTPND);4.取消總中斷屏蔽和子中斷屏蔽,等待新中斷產(chǎn)生;5.中斷返回下面是具體的程序應(yīng)用、服務(wù)函數(shù)及實(shí)例代碼#include"2440addr.h"

//頭文件,包含宏定義及清除掛起寄存器的ClearPending()函數(shù)staticvoid__irqKey_ISR();//中斷函數(shù)聲明

voiddelay(intx)//延時(shí)函數(shù)

{

while(x)

{

intk,j;

for(k=0xff;k>0;k--)

for(j=0xff;j>0;j--);

x--;

}

}

voidledMain(void)

{

rGPBCON=0x1dd7fc;

//GPB5,GPB6,GPB8,GPB10設(shè)置為輸出,連接了4個(gè)LED

rGPBDAT|=0x560;//4個(gè)LED全滅

rGPFCON&=~((3<<0)|(3<<4)|(3<<6)|(3<<8));

rGPFCON|=((2<<0)|(2<<4)|(2<<6)|(2<<8));//GPF0,GPF2,GPF3,GPF4工作在第二功能狀態(tài),即中斷

//rEXTINT0=0x0;

rEINTPEND=(1<<4);//清外部中斷掛起寄存器,清的是外部中斷4

ClearPending(BIT_EINT0|BIT_EINT2|BIT_EINT3|BIT_EINT4_7);//清外部中斷0,2,3,4

pISR_EINT0=pISR_EINT2=pISR_EINT3=pISR_EINT4_7=(int)Key_ISR;//設(shè)中斷服務(wù)函數(shù)地址

EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT3|BIT_EINT4_7);//使能中斷,即使INTMSK相應(yīng)位為0

rEINTMASK=~(1<<4);//使能外部中斷4

while(1);//等待中斷發(fā)生

}staticvoid__irqKey_ISR()//中斷服務(wù)函數(shù),__irq用來(lái)聲明通用中斷函數(shù)

{

charkey;//用來(lái)標(biāo)識(shí)是哪一個(gè)按鍵按下

unsignedintr;

rINTMSK=0xffffffff;//這是屏蔽所有中斷

if(rINTPND==BIT_EINT0){

//因?yàn)?個(gè)中斷用的是同一個(gè)中斷服務(wù)函數(shù),所以判斷是哪一個(gè)中斷發(fā)生

ClearPending(BIT_EINT0);

//并清除掛起寄存器,獲得鍵值

key=1;

}

elseif(rINTPND==BIT_EINT2){

ClearPending(BIT_EINT2);

key=2;

}

elseif(rINTPND==BIT_EINT3){

ClearPending(BIT_EINT3);

key=3;

}

elseif(rINTPND==BIT_EINT4_7){

rEINTPEND=(1<<4);

ClearPending(BIT_EINT4_7);

key=4;

}

switch(key){

//根據(jù)鍵值控制4個(gè)LED亮滅變化

case1:

rGPBDAT^=(1<<5);

break;

case2:

rGPBDAT^=(1<<6);

break;

case3:

rGPBDAT^=(1<<8);

break;

case4:

rGPBDAT^=(1<<10);

break;

}

EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT3|BIT_EINT4_7);//再打開中斷

}

下面在說(shuō)一下用到的ClearPending()該函數(shù)在頭文件2440addr.h中:__inlinevoidClearPending(intbit)//輸入?yún)?shù)是相應(yīng)位為1的值

{

registeri;//定義一個(gè)寄存器變量

rSRCPND=bit;//向相應(yīng)位置寫1清除源掛起寄存器

rINTPND=bit;//向相應(yīng)位置寫1清除源掛起寄存器

i=rINTPND;//沒有該語(yǔ)句也能正常運(yùn)行,可能是保證寄存器能清除的

}中斷服務(wù)函數(shù)IMPORTIRQ_Dispatch ;中斷分發(fā)函數(shù)

;IRQ中斷異常處理函數(shù)HANDLE_IRQHandle

;寄存器內(nèi)容和程序返回地址的保護(hù) ;由于指令流水線在進(jìn)入IRQ中斷前,PC指針比當(dāng)前執(zhí)行指令多出4個(gè)字節(jié) ;因此,需要對(duì)LR寄存器的指針減4,以保證程序執(zhí)行完后能正確返回

SUB

LR,LR,#4

STMFD

SP!,{R0-R12,LR}

LDR

LR,=L_IRQ_Return;在調(diào)用C語(yǔ)言的中斷分發(fā)函數(shù)前先保存返回地址

LDR

PC,=IRQ_Dispatch;調(diào)用C語(yǔ)言的中斷分發(fā)服務(wù)函數(shù)

L_IRQ_Return;中斷返回,恢復(fù)寄存器內(nèi)容并返回

LDMFD

SP!,{R0-R12,PC}^//中斷處理服務(wù)函數(shù)原型typedefvoid(*F_INTERRUPT_ISR)();//中斷處理服務(wù)函數(shù)表F_INTERRUPT_ISRafInterruptISR[32]={0};

//IRQ中斷分發(fā)服務(wù)函數(shù)//在產(chǎn)生IRQ中斷時(shí)調(diào)用此函數(shù),并由此函數(shù)將中斷分發(fā)給各個(gè)中斷服務(wù)函數(shù)voidIRQ_Dispatch(){ if((INTOFFSET>=0)&&(INTOFFSET<=31)&&(afInterruptISR[INTOFFSET]!=NULL)) { afInterruptISR[INTOFFSET]();//處理中斷

rSRCPND|=(1<<INTOFFSET);//清除中斷標(biāo)志 rINTPND|=(1<<INTOFFSET); }}

//裝載中斷服務(wù)函數(shù)voidIRQ_Install(intnInterruptNo,F_INTERRUPT_ISRfInterruptISR){ if(nInterruptNo>=0&&nInterruptNo<=31) { afInterruptISR[nInterruptNo]=fInterruptISR; IRQ_SetMask(nInterruptNo,INT_MSK_ENABLE); //開啟中斷 }}//卸載中斷服務(wù)函數(shù)voidIRQ_UnInstall(intnInterruptNo){ if(nInterruptNo>=0&&nInterruptNo<=31) { afInterruptISR[nInterruptNo]=NULL; IRQ_SetMask(nInterruptNo,INT_MSK_DISABLE); //關(guān)閉中斷 }}

//設(shè)置中斷掩碼voidIRQ_SetMask(intnInterruptNo,intnEnable){//根據(jù)參數(shù)對(duì)相關(guān)的中斷掩碼寄存器的相對(duì)應(yīng)位進(jìn)行設(shè)置,//注意:在開啟一級(jí)中斷時(shí),要先對(duì)SRCPND中對(duì)應(yīng)位進(jìn)行清零,然后再對(duì)INTMASK操作。}3、Linux中斷服務(wù)函數(shù)及其驅(qū)動(dòng)程序1)Linux中斷處理程序架構(gòu):

Linux將中斷分為:頂半部(tophalf)和底半部(bottomhalf)

頂半部:

完成盡可能少的比較緊急的功能,它往往只是簡(jiǎn)單的讀取寄存器中的中斷狀態(tài)并清除中斷標(biāo)志后就進(jìn)行“登記中斷”(也就是將底半部處理程序掛在到設(shè)備的底半部執(zhí)行隊(duì)列中)的工作

特點(diǎn):響應(yīng)速度快

底半部:

中斷處理的大部分工作都在底半部,它幾乎做了中斷處理程序的所有事情。

特點(diǎn):處理相對(duì)來(lái)說(shuō)不是非常

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論