除了外部中断管脚,LPC178x/7x的端口中的Port 0和Port 2也可以提供中断功能。
这些端口管脚可以由上升沿、下降沿或边沿产生中断
- 因为 边沿检测是非同步的,所以可以在没有时钟的情况下操作。不需要电平来触发中断。
- 每个使能的中断都可以产生唤醒信号,使器件退出掉电模式。
- 寄存器为软件提供挂起的上升沿中断、挂起的下降沿中断,以及整个挂起的GPIO中断
- GPIO中断功能并不要求管脚配置为GPIO。这就允许作为外设接口的一部分管脚改变时发生中断。
GPIO中断寄存器描述
1.GPIO整体中断状态寄存器(IOIntStatus -- 0x4002 8080)
bit0和bit2分别标识Port0和Port2上是否有中断
2.端口0上升沿GPIO中断使能(IO0IntEnR -- 0x4002 8090)
在P0.0~P0.31管脚上使能上升沿GPIO中断
3.端口2上升沿GPIO中断使能(IO2IntEnR -- 0x4002 80B0)
在P2.0~P2.31管脚上使能上升沿GPIO中断
4.端口0下降沿GPIO中断使能(IO0IntEnF -- 0x4002 8094)
在P0.0~P0.31管脚上使能下降沿GPIO中断
5.端口2下降沿GPIO中断使能(IO2IntEnF -- 0x4002 80B4)
在P2.0~P2.31管脚上使能下降沿GPIO中断
6.端口0上升沿GPIO中断状态(IO0IntStatR -- 0x4002 8094)
在P0.0~P0.31管脚上的上升沿中断状态
7.端口2上升沿GPIO中断状态(IO2IntStatR -- 0x4002 80A4)
在P2.0~P2.31管脚上的上升沿中断状态
8.端口0下降沿GPIO中断状态(IO0IntStatF -- 0x4002 8088)
在P0.0~P0.31管脚上的下降沿中断状态
9.端口2下降沿GPIO中断状态(IO2IntStatF -- 0x4002 80A8)
在P2.0~P2.31管脚上的下降沿中断状态
10.端口0的GPIO中断清零状态(IO0IntClr -- 0x4002 808C)
向相应的位写入1可以清零该管脚的任何中断
11.端口2的GPIO中断清零状态(IO2IntClr -- 0x4002 80AC)
向相应的位写入1可以清零该管脚的任何中断
范例: //启用P2.1 GPIO中断,下降沿 LPC_GPIOINT->IO2IntEnF = 1<<1; // 使能GPIO中断 void GPIO_IRQHandler (void) { uint32_t i = 0; uint32_t status = 0; uint32_t status_R_P0 = 0, status_F_P0 = 0; uint32_t status_R_P2 = 0, status_F_P2 = 0; status = LPC_GPIOINT->IntStatus; //GPIO整体中断状态寄存器 if (status & 0x1) { /* P0口中断 */ status_R_P0 = LPC_GPIOINT->IO0IntStatR; //P0上升沿中断状态 status_F_P0 = LPC_GPIOINT->IO0IntStatF; //P0下降沿中断状态 if (status_R_P0) { LPC_GPIOINT->IO0IntClr = status_R_P0; /* P0口上升沿中断 */ ///action } if (status_F_P0) { /* P0口有下降沿中断 */ LPC_GPIOINT->IO0IntClr = status_F_P0; /* 清除P0口中断状态 */ ///action } } if (status & 0x4) { /* P2口中断 */ status_R_P2 = LPC_GPIOINT->IO2IntStatR; //P2上升沿中断状态 status_F_P2 = LPC_GPIOINT->IO2IntStatF; //P2下降沿中断状态 if (status_R_P2) { /* P2口上升沿中断 */ LPC_GPIOINT->IO2IntClr = status_R_P2; ///action } if (status_F_P2) { /* P2口下降沿中断 */ LPC_GPIOINT->IO2IntClr = status_F_P2; ///action } } return; } |