新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > S3C2440外部中斷之按鍵中斷

S3C2440外部中斷之按鍵中斷

作者: 時間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
要做2440的中斷實驗。首先要了解ARM的中斷體系結(jié)構(gòu)。ARM體系CPU有七種工作模式。分別是:

用戶模式(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í)行被中斷的程序。

我們來看一個中斷處理框圖

可以看出帶子中斷的要比不帶子中斷的處理過程多兩個寄存器。這里面涉及到的寄存器就要看s3c2440的芯片手冊了。
我們再來看一張圖,來了解各個寄存器的關(guān)系。
現(xiàn)在來看一下2440外部中斷的引腳
I/O引腳F腳與外部中斷引腳EINT復(fù)用引腳。
現(xiàn)在結(jié)合代碼來說明中斷處理過程。

#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文件中。如圖:



關(guān)鍵詞: S3C2440外部中斷按鍵中

評論


技術(shù)專區(qū)

關(guān)閉