新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > LPC1768外部中斷與GPIO中斷

        LPC1768外部中斷與GPIO中斷

        作者: 時間:2016-11-20 來源:網絡 收藏
        LPC1768外部中斷嚴格來說只有四個,分別是EINT0,EINT1,EINT2,EINT3,技術手冊上有如下說明

        本文引用地址:http://www.104case.com/article/201611/318675.htm

        控制這四個外部中斷靠以下寄存器

        這三個寄存器的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);//中斷清零

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

        }

        }

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 津南区| 通化市| 新沂市| 获嘉县| 绥宁县| 渭源县| 凤山县| 互助| 鞍山市| 会理县| SHOW| 大安市| 桐庐县| 诏安县| 长丰县| 靖宇县| 星座| 东台市| 游戏| 建水县| 泰兴市| 裕民县| 应城市| 永修县| 泽州县| 华亭县| 石门县| 阜宁县| 武隆县| 张北县| 油尖旺区| 镇安县| 丽水市| 宾阳县| 秦皇岛市| 河南省| 桐柏县| 志丹县| 玛沁县| 佳木斯市| 唐河县|