zoukankan      html  css  js  c++  java
  • LPC1768外部中断与GPIO中断

    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)

    {

        NVIC_ClearPendingIRQ(EINT3_IRQn);

        if(LPC_GPIOINT->IntStatus &(1<<2))//端口2有中断

        {

            if(LPC_GPIOINT->IO2IntStatR &(1<<5))//p2.5有中断发生

            {

                LPC_GPIOINT->IO2IntClr |= (1<<5);//中断清零

                //接下来可以做自己的事情了

            }

        }

    }

     

  • 相关阅读:
    java 生成12位随机数,解决The literal 9999999999999 of type int is out of range 问题
    使用loadrunner 12 手动关联
    解析xml文件,修改Jenkins的配置
    自定义报告,用Java写一个html文件
    解决Jenkins的错误“The Server rejected the connection: None of the protocols were accepted”
    selenium项目--读取测试用例
    header("Location:login.php")
    详细设计说明书(转)
    Visual EmbedLinux Tools:让vs支持嵌入式Linux开发(转)
    phpstorm集成phpunit(转)
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4336271.html
Copyright © 2011-2022 走看看