cortex m0 lpc1114 GPIO中斷
這一節(jié),介紹如何配置引腳上產(chǎn)生中斷來檢測引腳上的高低電平變化。
單片機的任何一個IO口,都可以作為中斷引腳,所以,LPC1114一共有41個外部中斷引腳。
可以設(shè)置為低電平引發(fā)中斷、高電平引發(fā)中斷、上升沿引發(fā)中斷、下降沿引發(fā)中斷、雙邊沿引發(fā)中斷,一共5種中斷方式。
下面,以下降沿中斷為例,進行說明:
新建一個工程,結(jié)構(gòu)如下圖所示:
在main.c文件中,加入以下代碼:
#include"LPC11XX.H"#defineLED1_ONLPC_GPIO1->DATA&=~(1<<0)#defineLED1_OFFLPC_GPIO1->DATA|=(1<<0)#defineLED2_ONLPC_GPIO1->DATA&=~(1<<1)#defineLED2_OFFLPC_GPIO1->DATA|=(1<<1)#defineKEY1_DOWN(LPC_GPIO1->DATA&(1<<9))!=(1<<9)#defineKEY2_DOWN(LPC_GPIO1->DATA&(1<<10))!=(1<<10)voidled_init(){LPC_SYSCON->SYSAHBCLKCTRL|=(1<<16);//使能IOCON時鐘LPC_IOCON->R_PIO1_0&=~0x07;LPC_IOCON->R_PIO1_0|=0x01;//把P1.0腳設(shè)置為GPIOLPC_IOCON->R_PIO1_1&=~0x07;LPC_IOCON->R_PIO1_1|=0x01;//把P1.1腳設(shè)置為GPIOLPC_SYSCON->SYSAHBCLKCTRL&=~(1<<16);//禁能IOCON時鐘LPC_GPIO1->DIR|=(1<<0);//把P1.0設(shè)置為輸出引腳LPC_GPIO1->DATA|=(1<<0);//把P1.0設(shè)置為高電平LPC_GPIO1->DIR|=(1<<1);//把P1.1設(shè)置為輸出引腳LPC_GPIO1->DATA|=(1<<1);//把P1.1設(shè)置為高電平}voidPIOINT1_IRQHandler(){if((LPC_GPIO1->MIS&(1<<9))==(1<<9))//如果是P1.9引起的中斷{LED1_ON;while(KEY1_DOWN);LED1_OFF;LPC_GPIO1->IC=0XFFF;//清中斷}if((LPC_GPIO1->MIS&(1<<10))==(1<<10))//如果是P1.10引起的中斷{LED2_ON;while(KEY2_DOWN);LED2_OFF;LPC_GPIO1->IC=0XFFF;//清中斷}}intmain(){led_init();//配置LEDLPC_GPIO1->IE|=(1<<9);//允許P1.9引腳上的中斷LPC_GPIO1->IE|=(1<<10);//允許P1.10引腳上的中斷NVIC_EnableIRQ(EINT1_IRQn);//打開GPIO1中斷while(1){;}}
在main()函數(shù)中,第41和42行,給IE寄存器bit9和bit10寫1允許P1.9和P1.10引腳的中斷。第43行,開啟NVIC中斷。
第21~37是P1口的中斷服務(wù)函數(shù)。在中斷服務(wù)函數(shù)里面,讀取MIS寄存器來檢測是哪個引腳上產(chǎn)生的中斷。
IE就是MIS的開關(guān),MIS某位置1,引發(fā)進入中斷服務(wù)函數(shù)事件。
如果要設(shè)置成其它中斷方式,可以給IS、IBE、IEV寄存器寫值。例如:
低電平中斷:
LPC_GPIO1->IS |= (1<<9);
LPC_GPIO1->IS |= (1<<10);
IS對應(yīng)位置1,IBE、IEV寄存器保持默認(rèn)值。
上升沿中斷:
LPC_GPIO1->IEV |= (1<<9);
LPC_GPIO1->IEV |= (1<<10);
IEV對應(yīng)位置1,IS、IBE保持默認(rèn)值。
雙邊沿中斷:
LPC_GPIO1->IBE |= (1<<9);
LPC_GPIO1->IBE |= (1<<10);
IBE對應(yīng)位置1,IS、IEV寄存器保持默認(rèn)值。