随便google了下,发现貌似没什么人关心这个问题,不过没关系,就让以后的初学者看到后不用再迷茫了。 其实两者是有很大不同的,前者只能通过软件不停查询LPC_GPIOINT->IO2IntStatR或LPC_GPIOINT->IO2IntStatF来获得端口边沿情况,而后者则一般由硬件自动进入中断处理函数。前者清除中断标志用LPC_GPIOINT->IO2IntClr,后者则用LPC_SC->EXTINT。
前者编程示例:
void EINTInit( void )
{
LPC_GPIO2->FIODIR &= ~(1 << 11); /* PORT2.11 defined as input */
LPC_GPIO2->FIODIR &= ~(1 << 11);
LPC_GPIOINT->IO2IntEnR |= (1 << 11); /* enable rising edge irq */
LPC_GPIOINT->IO2IntEnF |= (1 << 11); /* enable falling edge irq */}
}
int main(void)
{
While(1)
{
if(LPC_GPIOINT->IO2IntStatF!=0x0)
LED_On (0xff); //点亮LED
if(LPC_GPIOINT->IO2IntStatR)
LED_Off (0xff); //熄灭LED
LPC_GPIOINT->IO2IntClr |= (1 << 11); /* clear pending interrupt */
}
}
后者编程示例:
void EINTInit( void )
{
LPC_GPIO2->FIODIR &= ~(1 << 10); /* PORT2.10 defined as input */
LPC_PINCON->PINSEL4 = 0x00100000; // set P2.10 as EINT0
LPC_SC->EXTMODE = 0x01; /* INT0 edge trigger */
LPC_SC->EXTPOLAR = 0x01; /* INT0 is rising edge by default */
NVIC_EnableIRQ(EINT0_IRQn); //使能EINT0中断
}
void EINT0_IRQHandler()
{
LPC_SC->EXTINT = 0x01; //EXIT0中断状态清零,在P2.10
}
用户377235 2014-8-27 17:56
恩,不错 不错