新聞中心

LPC1768外部中斷與GPIO中斷

作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò) 收藏
LPC1768外部中斷嚴(yán)格來(lái)說(shuō)只有四個(gè),分別是EINT0,EINT1,EINT2,EINT3,技術(shù)手冊(cè)上有如下說(shuō)明

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

控制這四個(gè)外部中斷靠以下寄存器

這三個(gè)寄存器的0 1 2 3位分別代表中斷的0 1 2 3,EXTINT寄存器表示中斷是否發(fā)生,在發(fā)生中斷的時(shí)候該寄存器會(huì)置位,可以通過(guò)寫(xiě)1清零,EXTMODE寄存器表示觸發(fā)模式,有電平觸發(fā)和變化沿觸發(fā)兩種,EXTPOLAR與EXTMODE,在電平觸發(fā)模式下,決定高電平還是低電平觸發(fā),在變化沿觸發(fā)的情況下決定上升沿還是下降沿觸發(fā)

這三個(gè)中斷分別相關(guān)的引腳為 EINT0—P2.10 EINT1—P2.11 EINT2—P2.12 EINT3—P2.13,

使用這三個(gè)引腳作為中斷的方法如下.

首先初始化相應(yīng)的引腳,選擇中斷功能,然后配置中斷觸發(fā)方式,最后打開(kāi)nvic中斷許可,這就完成了初始化,然后便是中斷響應(yīng)程序,在中斷響應(yīng)程序中先清除extint中的中斷標(biāo)志,然后清除nvic中斷掛起,接著做自己的事情,完整的流程就OK了,示例代碼如下:

static void Eint1Init(EINTMODE eintMode,EINTLOGIC eintLogic,PREEMPTPRIORITY PreemptPriority,SUBPRIORITY SubPriority)

{

u8 i = 0;

LPC_PINCON->PINSEL4 &= ~(0X03L<<22);

LPC_PINCON->PINSEL4 = (0X01L<<22);//設(shè)置IO口功能為EINT1

if(eintMode)LPC_SC->EXTMODE = 1<<1;

else LPC_SC->EXTMODE &= ~(1<<1);//選擇中斷模式為電平或者邊沿

if(eintLogic)

{

LPC_SC->EXTPOLAR = 1<<1;

LPC_GPIOINT->IO2IntEnR &= 1<<11;

}

else

{

LPC_SC->EXTPOLAR &= ~(1<<1);

LPC_GPIOINT->IO2IntEnF &= 1<<11;

}//設(shè)置中斷觸發(fā)電平

//初始化清零

i = (LPC_SC->EXTINT>>1)&0x01;

if(i)LPC_SC->EXTINT &= ~(0x01<<1); //清除中斷標(biāo)志

NVIC_SetPriority(EINT1_IRQn,NVIC_EncodePriority(PriorityGroup2,PreemptPriority,SubPriority));//設(shè)置中斷優(yōu)先級(jí)

NVIC_EnableIRQ(EINT1_IRQn);//使能中斷

}

中斷處理函數(shù)中流程如下

void EINT1_IRQHandler(void)

{

if(Eint1GetFlag())

{

Eint1ClearFlag();

}

}

從這一點(diǎn)看,似乎1768的中斷數(shù)量少了點(diǎn),但是在gpio的資料中,有這么一句話(huà)

也就是說(shuō),1768的gpio口是有中斷的,但是可能是廠商覺(jué)得麻煩,沒(méi)有專(zhuān)門(mén)開(kāi)辟GPIO中斷通道,所GPIO中斷也是用的EINT3的中斷通道,P0端口和P2端口的所有端口都能用在中斷上,那么1768的外部中斷一下子就提升了幾十個(gè).

使用GPIO作中斷有這些需要設(shè)置

指明整個(gè)端口有沒(méi)有中斷發(fā)生,可想而知,這個(gè)寄存器只有兩個(gè)位是可用的,因?yàn)橹挥袃蓚€(gè)端口支持中斷

這是使能某個(gè)端口的上升沿中斷,既然如此,就還會(huì)有一個(gè)對(duì)應(yīng)的下降沿中斷使能

然后,上升沿中斷和下降沿中斷都有一個(gè)中斷標(biāo)志位,分別如下

最后,中斷標(biāo)志位需要有一個(gè)清零位,原則上,兩個(gè)標(biāo)志位應(yīng)該對(duì)應(yīng)兩個(gè)清零,但是1768為了簡(jiǎn)便,用一個(gè)清零位清除兩個(gè)標(biāo)志位,如下

另外,使用GPIO中斷的時(shí)候,GPIO設(shè)置為通用輸出輸入功能,使用IO口中斷的例程如下

//使用p2.5做測(cè)試

void GPIO_INT_Init(void)

{

LPC_SC->PCONP = (1<<15);//打開(kāi)時(shí)鐘

LPC_PINCON->PINSEL4 &= ~(0X03L<<10);//選擇GPIO功能

LPC_PINCON->PINMODE4 &= ~(0X03L<<10);//使能內(nèi)部上拉電阻

LPC_PINCON->PINMODE_OD2 &= ~(0X01<<5);//取消推挽模式

LPC_GPIOINT->IO2IntEnR = (1<<5);//使能下降沿中斷

LPC_GPIOINT->IO2IntEnF &= ~(1<<5);//禁止上升沿中斷

LPC_GPIOINT->IO2IntClr = (1<<5);//中斷清零

NVIC_SetPriority(EINT3_IRQn,NVIC_EncodePriority(PriorityGroup2,PreemptPriority,SubPriority));

NVIC_EnableIRQ(EINT3_IRQn);//打開(kāi)NVIC中斷

}

void EINT3_IRQHandler(void)

{

NVIC_ClearPendingIRQ(EINT3_IRQn);

if(LPC_GPIOINT->IntStatus &(1<<2))//端口2有中斷

{

if(LPC_GPIOINT->IO2IntStatR &(1<<5))//p2.5有中斷發(fā)生

{

LPC_GPIOINT->IO2IntClr = (1<<5);//中斷清零

//接下來(lái)可以做自己的事情了

}

}

}



關(guān)鍵詞: LPC1768外部中斷GPIO中

評(píng)論


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

關(guān)閉