S3C2440外部中斷系統(tǒng)詳解
S3C2440A中的中斷控制器接受來自60個(gè)中斷源的請求。提供這些中斷源的是內(nèi)部外設(shè),如DMA控制器、UART、IIC等等。在這些中斷源中,UARTn、AC97和EINTn中斷對于中斷控制器而言是“或”關(guān)系。任意一個(gè)中斷發(fā)生都會(huì)觸發(fā)總中斷
當(dāng)從內(nèi)部外設(shè)和外部中斷請求引腳收到多個(gè)中斷請求時(shí),中斷控制器在仲裁步驟后請求ARM920T內(nèi)核的FIQ或IRQ。
仲裁步驟由硬件優(yōu)先級邏輯決定并且寫入結(jié)果到幫助用戶通告是各種中斷源中的哪個(gè)中斷發(fā)生了的中斷掛起寄存器中。
中斷源有兩種,一種是直接中斷源,比如觸摸屏中斷,還有一種是帶子中斷的中斷,類似于串口帶有子終端入RXTX中斷,通過SUBMASK也就是中斷允許之后掛起到系統(tǒng),系統(tǒng)根據(jù)用戶設(shè)置確定是否響應(yīng)該中斷,然后依靠優(yōu)先級分批響應(yīng),中斷優(yōu)先級依靠硬件決定
至于中斷的處理過程,在解析啟動(dòng)代碼的時(shí)候有講到,請自行查閱
下面以按鍵的外部中斷為例講解中斷的使用方法
1.首先,要使用外部中斷需要在rGPXCON里面將引腳模式設(shè)置為中斷功能,對應(yīng)是0x10
2.需要在對應(yīng)的寄存器中設(shè)置中斷觸發(fā)模式(EXINTx),例如GPF7中斷,關(guān)聯(lián)的中斷引腳是EINT7,而EINT7是屬于EXTINT0的,如下
所以對EXTINT0賦值選擇相應(yīng)中斷觸發(fā)模式
3.此時(shí),中斷還不能被觸發(fā),因?yàn)檫€沒有設(shè)置上圖的MASK,mode,接下來在INTMOD中選擇中斷屬于那個(gè)分組,如下
一般選擇為IRQ中斷,關(guān)于FIQ中斷相關(guān)資料后期說明
4.接下來使能相關(guān)的中斷服務(wù),寄存器為INTMSK
5.現(xiàn)在就可以進(jìn)行中斷了,但是為了保險(xiǎn)起見,再打開中斷之前最好將中斷標(biāo)志位都清除掉,中斷標(biāo)志位有兩個(gè),兩個(gè)系統(tǒng)級一個(gè)子中斷級,系統(tǒng)級里面分別是SRCPND和INTPND
子中斷的意思就是現(xiàn)在開的中斷代表EINT4-7那到底是哪一個(gè)還能確定,依靠INTPEND
注意,只有多個(gè)中斷公用一個(gè)通道的時(shí)候才有這個(gè),比如EINT0-3是獨(dú)立中斷,直接在系統(tǒng)中斷寄存器里面清除就好了
最后,開啟中斷
同樣,這個(gè)也是多個(gè)中斷公用通道的時(shí)候使用
另外,針對外部中斷可以設(shè)置濾波過程,請查閱手冊
現(xiàn)在我們來看,差不多的對應(yīng)關(guān)系是
EINTMASK , ---------------------------SUBMASK子中斷開關(guān)
INTMASK-----------------------------MASK總中斷開關(guān)
INTMODE-------------------------------MODE模式開關(guān)
SPRPND-----------------------------源掛起標(biāo)志
INTPND----------------------------中斷請求標(biāo)志
EINTPEND----------------------子中斷掛起
當(dāng)一個(gè)通道對應(yīng)多個(gè)中斷的時(shí)候要依靠子中斷掛起來判定到底是哪一個(gè)中斷發(fā)生了
以下是按鍵中斷代碼
Exit.c
#include"exti.h"http://按鍵中斷處理函數(shù)void__irqIRQ_KEY1(void){rSRCPND"=(1<<1);//清除中斷標(biāo)志位rINTPND|=(1<<1);keyValue=KEY_UP;}void__irqIRQ_KEY2(void){rSRCPND|=(1<<4);//清除中斷標(biāo)志位rINTPND|=(1<<4);if(rEINTPEND&(1<<4))//EINT4包含4-7四個(gè)中斷源{rEINTPEND|=(1<<4);//清除ENIT4的中斷標(biāo)志位keyValue=KEY_DOWN;}}void__irqIRQ_KEY3(void){rSRCPND|=(1<<2);//清除中斷標(biāo)志位rINTPND|=(1<<2);keyValue=KEY_LEFT;}void__irqIRQ_KEY4(void){rSRCPND|=1<<0;//清除中斷標(biāo)志位rINTPND|=1<<0;keyValue=KEY_RIGHT;}voidExtiInit(void){rGPFCON&=~((3<<0)|(3<<2)|(3<<4)|(3<<8));//0124清零rGPFCON|=((2<<0)|(2<<2)|(2<<4)|(2<<8));//選擇中斷復(fù)用rEXTINT0&=~((7<<0)|(7<<4)|(7<<8)|(7<<16));//清除中斷模式rEXTINT0|=((2<<0)|(2<<4)|(2<<8)|(2<<16));//選擇下降沿觸發(fā)rSRCPND|=((1<<0)|(1<<1)|(1<<2)|(1<<4));//清除中斷標(biāo)志rINTPND|=((1<<0)|(1<<1)|(1<<2)|(1<<4));//清除中斷掛起rINTMOD&=~((1<<0)|(1<<1)|(1<<2)|(1<<4));//設(shè)置中斷為IRQ中斷rINTMSK&=~((1<<0)|(1<<1)|(1<<2)|(1<<4));//去除中斷屏蔽,打開中斷rEINTPEND|=(1<<4);//EINT4中斷服務(wù)有效//對于EINT4這種帶子中斷的中斷的額外操作,清除子中斷rEINTMASK&=~(1<<4);//EINT4中斷服務(wù)有效//對于EINT4這種帶子中斷的中斷的額外操作,打開子中斷//建立中斷函數(shù)連接pISR_EINT1=(unsigned)IRQ_KEY1;//建立中斷服務(wù)函數(shù)鏈接pISR_EINT4_7=(unsigned)IRQ_KEY2;pISR_EINT2=(unsigned)IRQ_KEY3;pISR_EINT0=(unsigned)IRQ_KEY4;}
Exit.h
#ifndef__EXTI_H_#define__EXTI_H_#include"2440addr.h"#include"def.h"#include"key.h"voidExtiInit(void);//使用GPIOF0124#endif