S3C2440外部中斷之按鍵中斷
用戶模式(usr):ARM處理器正常程序執(zhí)行狀態(tài)。
本文引用地址:http://m.butianyuan.cn/article/201611/316623.htm快速中斷模式(fiq):用于高速數(shù)據(jù)傳輸或通道處理。
中斷模式(irq):用于通用的中斷處理。
管理模式(svc):操作系統(tǒng)使用的保護模式。
數(shù)據(jù)訪問終止模式(abt):當(dāng)數(shù)據(jù)或指令預(yù)取終止時進入該模式,可用于虛擬存儲及存儲保護。
系統(tǒng)模式(sys):運行具有特權(quán)的操作系統(tǒng)任務(wù)。
未定義指令終止模式(und):當(dāng)未定義的指令執(zhí)行時進入該模式,可用于支持硬件協(xié)處理器的軟件仿真。
此外,ARM體系的CPU有兩種工作狀態(tài),分別是:ARM狀態(tài)、Thumb狀態(tài)。
實際上,CPU一上電就工作在ARM狀態(tài),所以我們不必關(guān)心CPU工作狀態(tài)。
每一種工作模式對應(yīng)相應(yīng)的寄存器,這里就不詳細說了。可以自己查閱相關(guān)資料。
CPU處理不預(yù)期事件有以下兩種方法:
1.查詢方式:程序循環(huán)的查詢各個設(shè)備的狀態(tài)并作出相應(yīng)的反應(yīng)。
2.當(dāng)某些事件發(fā)生時,硬件會設(shè)置某個寄存器;CPU在每執(zhí)行完一個指令時,通過硬件查看這個寄存器,如果發(fā)現(xiàn)所關(guān)注的事件發(fā)生了,則中斷當(dāng)前程序流程,跳轉(zhuǎn)到一個固定的地址處理這件事,最后返回繼續(xù)執(zhí)行被中斷的程序。
我們來看一個中斷處理框圖:
#include "2440addr.h"
#define U32 unsigned int
static void __irq Key1_ISR(void) //EINT3
{
int led;
rSRCPND = rSRCPND | (0x1<<3);//EINT1開中斷請求 EINT3位置一
rINTPND = rINTPND | (0x1<<3);//經(jīng)過仲裁器選出優(yōu)先級高的中斷后,這個中斷在INTPND寄存器中相應(yīng)位置一
led = rGPBDAT & (0x1<<6);
if (led ==0)
rGPBDAT = rGPBDAT | (0x1<<6);//原本是亮的,熄滅
else
rGPBDAT = rGPBDAT & ~(0x1<<6);//原本是滅的,點亮
}
static void __irq Key2_ISR(void) //EINT4
{
int led;
rSRCPND = rSRCPND | (0x1<<4);
rINTPND = rINTPND | (0x1<<4);
if(rEINTPEND&(1<<4))
{
rEINTPEND = rEINTPEND | (0x1<<4);
led = rGPBDAT & (0x1<<5);
if (led ==0)
rGPBDAT = rGPBDAT | (0x1<<5);
else
rGPBDAT = rGPBDAT & ~(0x1<<5);
}
}
static void __irq Key3_ISR(void) //EINT2
{
int led;
rSRCPND = rSRCPND | (0x1<<2);
rINTPND = rINTPND | (0x1<<2);
led = rGPBDAT & (0x1<<8);
if (led ==0)
rGPBDAT = rGPBDAT | (0x1<<8);
else
rGPBDAT = rGPBDAT & ~(0x1<<8);
}
void __irq Key4_ISR(void) //EINT0
{
int led;
rSRCPND = rSRCPND | 0x1;
rINTPND = rINTPND | 0x1;
led = rGPBDAT & (0x1<<10);
if (led ==0)
rGPBDAT = rGPBDAT | (0x1<<10);
else
rGPBDAT = rGPBDAT & ~(0x1<<10);
}
void Main(void)
{
int light;
rGPBCON = 0x155550;//0000 0001 0101 0101 0101 0000
rGPBUP = 0x7ff;//上拉無效
rGPFCON = 0xaaaa;//1010 1010 1010 1010 GPF管腳均設(shè)為中斷模式
rSRCPND = 0x1d;//0001 1101 EINT0、2、3、4_7開
rINTMSK = ~0x1d;//屏蔽關(guān)
rINTPND =0x1d;
rEINTPEND = (1<<4);
rEINTMASK = ~(1<<4);
rEXTINT0 = 0x22222;//0010 0010 0010 0010 0010 設(shè)計觸發(fā)方式 均設(shè)為下降沿
light = 0x0;
rGPBDAT = ~light;
pISR_EINT0 = (U32)Key4_ISR;
pISR_EINT3 = (U32)Key1_ISR;
pISR_EINT2 = (U32)Key3_ISR;
pISR_EINT4_7 = (U32)Key2_ISR;
while(1)
;
}
//******************************************************************************/
SRCPND/INPND設(shè)置要保持一致,負責(zé)哪些中斷的開關(guān)。INTMSK是總的中斷屏蔽。EINTPEND/EINTMASK只有外部中斷EINT4-EINT23需要設(shè)置,在EXTINT0寄存器中設(shè)置觸發(fā)方式。
//********************************************************************************/
pISR_EINT0-pISR_EINT4_7 定義的是中斷向量入口地址,在2440addr.h文件中。如圖:
評論