LPC1768外部中斷與GPIO中斷
控制這四個(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)可以做自己的事情了
}
}
}
評(píng)論