LPC1768的外部中止严格来说只要四个,别离是EINT0,EINT1,EINT2,EINT3,技能手册上有如下阐明
操控这四个外部中止靠以下寄存器
这三个寄存器的0 1 2 3位别离代表中止的0 1 2 3,EXTINT寄存器一共中止是否产生,在产生中止的时分该寄存器会置位,能够经过写1清零,EXTMODE寄存器一共触发形式,有电平触发和改变沿触发两种,EXTPOLAR与EXTMODE,在电平触发形式下,决议高电平仍是低电平触发,在改变沿触发的情况下决议上升沿仍是下降沿触发
这三个中止别离相关的引脚为 EINT0—P2.10 EINT1—P2.11 EINT2—P2.12 EINT3—P2.13,
运用这三个引脚作为中止的办法如下.
首要初始化相应的引脚,挑选中止功用,然后装备中止触发方法,最终翻开nvic中止答应,这就完成了初始化,然后就是中止呼应程序,在中止呼应程序中先铲除extint中的中止标志,然后铲除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);//设置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;
}//设置中止触发电平
//初始化清零
i = (LPC_SC->EXTINT>>1)&0x01;
if(i)LPC_SC->EXTINT &= ~(0x01<<1); //铲除中止标志
NVIC_SetPriority(EINT1_IRQn,NVIC_EncodePriority(PriorityGroup2,PreemptPriority,SubPriority));//设置中止优先级
NVIC_EnableIRQ(EINT1_IRQn);//使能中止
}
中止处理函数中流程如下
void EINT1_IRQHandler(void)
{
if(Eint1GetFlag())
{
Eint1ClearFlag();
}
}
从这一点看,好像1768的中止数量少了点,可是在gpio的资猜中,有这么一句话
也就是说,1768的gpio口是有中止的,可是可能是厂商觉得费事,没有专门拓荒GPIO中止通道,所GPIO中止也是用的EINT3的中止通道,P0端口和P2端口的一切端口都能用在中止上,那么1768的外部中止一会儿就提升了几十个.
运用GPIO作中止有这些需求设置
指明整个端口有没有中止产生,可想而知,这个寄存器只要两个位是可用的,由于只要两个端口支撑中止
这是使能某个端口的上升沿中止,既然如此,就还会有一个对应的下降沿中止使能
然后,上升沿中止和下降沿中止都有一个中止标志位,别离如下
最终,中止标志位需求有一个清零位,原则上,两个标志位应该对应两个清零,可是1768为了简洁,用一个清零位铲除两个标志位,如下
别的,运用GPIO中止的时分,GPIO设置为通用输出输入功用,运用IO口中止的例程如下
//运用p2.5做测验
void GPIO_INT_Init(void)
{
LPC_SC->PCONP = (1<<15);//翻开时钟
LPC_PINCON->PINSEL4 &= ~(0X03L<<10);//挑选GPIO功用
LPC_PINCON->PINMODE4 &= ~(0X03L<<10);//使能内部上拉电阻
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);//翻开NVIC中止
}
void EINT3_IRQHandler(void)
{
NV%&&&&&%_ClearPendingIRQ(EINT3_IRQn);
if(LPC_GPIOINT->IntStatus &(1<<2))//端口2有中止
{
if(LPC_GPIOINT->IO2IntStatR &(1<<5))//p2.5有中止产生
{
LPC_GPIOINT->IO2IntClr = (1<<5);//中止清零
//接下来能够做自己的工作了
}
}
}