LPC178x/7x的GPIO中断

时间:2022-11-16 17:51:34

      除了外部中断管脚,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中断
  NVIC_SetPriority(GPIO_IRQn, 0);  // 0-31 Priority(0=highest priority)
  NVIC_EnableIRQ(GPIO_IRQn); 


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;
}