新聞中心

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

S3C2440外部中斷之按鍵中斷

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

用戶(hù)模式(usr):ARM處理器正常程序執(zhí)行狀態(tài)。

本文引用地址:http://butianyuan.cn/article/201611/316623.htm

快速中斷模式(fiq):用于高速數(shù)據(jù)傳輸或通道處理。

中斷模式(irq):用于通用的中斷處理。

管理模式(svc):操作系統(tǒng)使用的保護(hù)模式。

數(shù)據(jù)訪問(wèn)終止模式(abt):當(dāng)數(shù)據(jù)或指令預(yù)取終止時(shí)進(jìn)入該模式,可用于虛擬存儲(chǔ)及存儲(chǔ)保護(hù)。

系統(tǒng)模式(sys):運(yùn)行具有特權(quán)的操作系統(tǒng)任務(wù)。

未定義指令終止模式(und):當(dāng)未定義的指令執(zhí)行時(shí)進(jìn)入該模式,可用于支持硬件協(xié)處理器的軟件仿真。

此外,ARM體系的CPU有兩種工作狀態(tài),分別是:ARM狀態(tài)、Thumb狀態(tài)。

實(shí)際上,CPU一上電就工作在ARM狀態(tài),所以我們不必關(guān)心CPU工作狀態(tài)。

每一種工作模式對(duì)應(yīng)相應(yīng)的寄存器,這里就不詳細(xì)說(shuō)了??梢宰约翰殚喯嚓P(guān)資料。

CPU處理不預(yù)期事件有以下兩種方法:

1.查詢(xún)方式:程序循環(huán)的查詢(xún)各個(gè)設(shè)備的狀態(tài)并作出相應(yīng)的反應(yīng)。

2.當(dāng)某些事件發(fā)生時(shí),硬件會(huì)設(shè)置某個(gè)寄存器;CPU在每執(zhí)行完一個(gè)指令時(shí),通過(guò)硬件查看這個(gè)寄存器,如果發(fā)現(xiàn)所關(guān)注的事件發(fā)生了,則中斷當(dāng)前程序流程,跳轉(zhuǎn)到一個(gè)固定的地址處理這件事,最后返回繼續(xù)執(zhí)行被中斷的程序。

我們來(lái)看一個(gè)中斷處理框圖

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

#include "2440addr.h"
#define U32 unsigned int

static void __irq Key1_ISR(void) //EINT3
{
int led;
rSRCPND = rSRCPND | (0x1<<3);//EINT1開(kāi)中斷請(qǐng)求 EINT3位置一
rINTPND = rINTPND | (0x1<<3);//經(jīng)過(guò)仲裁器選出優(yōu)先級(jí)高的中斷后,這個(gè)中斷在INTPND寄存器中相應(yīng)位置一
led = rGPBDAT & (0x1<<6);
if (led ==0)
rGPBDAT = rGPBDAT | (0x1<<6);//原本是亮的,熄滅
else
rGPBDAT = rGPBDAT & ~(0x1<<6);//原本是滅的,點(diǎn)亮
}

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;//上拉無(wú)效
rGPFCON = 0xaaaa;//1010 1010 1010 1010 GPF管腳均設(shè)為中斷模式

rSRCPND = 0x1d;//0001 1101 EINT0、2、3、4_7開(kāi)
rINTMSK = ~0x1d;//屏蔽關(guān)
rINTPND =0x1d;
rEINTPEND = (1<<4);
rEINTMASK = ~(1<<4);
rEXTINT0 = 0x22222;//0010 0010 0010 0010 0010 設(shè)計(jì)觸發(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è)置要保持一致,負(fù)責(zé)哪些中斷的開(kāi)關(guān)。INTMSK是總的中斷屏蔽。EINTPEND/EINTMASK只有外部中斷EINT4-EINT23需要設(shè)置,在EXTINT0寄存器中設(shè)置觸發(fā)方式。

//********************************************************************************/

pISR_EINT0-pISR_EINT4_7 定義的是中斷向量入口地址,在2440addr.h文件中。如圖:



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

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉