Cortex-M3 (NXP LPC1788)之外部中斷操作
阿新 • • 發佈:2021-01-10
技術標籤:LPC1788
要使用LPC1788的外部中斷,要進行兩部分的操作。由於外部中斷的管腳採用I/O複用的形式,顯然我們首先要對管腳進行配置,使其工作在外部中斷輸入的模式。其次,我們需要配置中斷相關的暫存器包括中斷使能以及中斷的觸發方式等。
由於我們使用的是外部中斷0,查閱資料手冊,其GPIO管腳為P2_10,為此我們設定IOCON_P2_10暫存器的FUNC欄位,設定成001即為EINT0模式。 配置完引腳後,還需要繼續配置具體的中斷功能。我們需要開啟中斷使能,設定ISER相應位;還要配置中斷的觸發方式如電平觸發和邊沿觸發,相關暫存器為EXTMODE和EXTPOLAR;中斷觸發以後會將外部中斷標誌暫存器EXTINT相應位置位,這將會向NVIC提交中斷請求,如果管腳中斷使能,則會產生中斷。中斷響應後必須將EXTINT中的該位清零,否則不能產生下一次中斷。
中斷入口向量的地址在啟動檔案中定義,對於外部中斷0,其標號為EINT0_IRQHandler。開發板上的電路圖如圖1所示
按鍵按下時,GPIO_P2_10是低電平,沒有按下為高電平。配置EINT0的中斷觸發方式為低電平觸發,在中斷函式中熄滅LED。在主函式中一直點亮。程式的效果為按下SW6,LED燈熄滅。鬆開則一直保持亮。程式如下:
#define rFIO1DIR (*(volatile unsigned*)0x20098020)
#define rFIO1MASK (*(volatile unsigned*)0x20098030)
#define rFIO1PIN (*(volatile unsigned*)0x20098034)
#define rFIO1SET (*(volatile unsigned*)0x20098038)
#define rFIO1CLR (*(volatile unsigned*)0x2009803c)
#define rIOCON_P2_10 (*(volatile unsigned *)0x4002C128)
#define rIOIntStatus (*(volatile unsigned *)0x40028080)
#define rIO2IntEnF (*(volatile unsigned *)0x400280B4)
#define rIO2IntClr (*(volatile unsigned *)0x400280AC)
#define rEXTINT (*(volatile unsigned *)0x400FC140)
#define rEXTMODE (*(volatile unsigned *)0x400FC148)
#define rEXTPOLAR (*(volatile unsigned *)0x400FC14C)
#define rISER0 (*(volatile unsigned *)0xE000E100)
#define rIRP4 (*(volatile unsigned *)0xE000E410)
void EINT0_IRQHandler()
{
rEXTINT |= (0x1<<0);//中斷產生之後必須清除該位
rFIO1PIN |= (1<<18);
}
void GPIO_INIT()
{
rFIO1DIR |= (0x1<<18);//P1.18設定為輸出,控制LED
rIOCON_P2_10 = (rIOCON_P2_10&(~0x7))|(0x1<<0);//配置FUNC欄位為EINT0模式
}
void EINT_INIT()
{
rEXTMODE &= ~(0x1<<0);//配置成低電平觸發
rEXTPOLAR &= ~(0x1<<0);
rISER0 = (0x1<<18);//開啟EINT0中斷使能
}
int main(void)
{
GPIO_INIT();
EINT_INIT();
while(1)
{
rFIO1PIN &= ~(1<<18);
}
}
void SystemInit (void)
{
}