Cortex-M3 (NXP LPC1788)之外部中斷操作
由于我們使用的是外部中斷0,查閱數(shù)據(jù)手冊,其GPIO管腳為P2_10,為此我們設置IOCON_P2_10寄存器的FUNC字段,設置成001即為EINT0模式。 配置完引腳后,還需要繼續(xù)配置具體的中斷功能。我們需要打開中斷使能,設置ISER相應位;還要配置中斷的觸發(fā)方式如電平觸發(fā)和邊沿觸發(fā),相關(guān)寄存器為EXTMODE和EXTPOLAR;中斷觸發(fā)以后會將外部中斷標志寄存器EXTINT相應位置位,這將會向NVIC提交中斷請求,如果管腳中斷使能,則會產(chǎn)生中斷。中斷響應后必須將EXTINT中的該位清零,否則不能產(chǎn)生下一次中斷。
本文引用地址:http://www.ex-cimer.com/article/201611/318447.htm中斷入口向量的地址在啟動文件中定義,對于外部中斷0,其標號為EINT0_IRQHandler。開發(fā)板上的電路圖如圖1所示
圖1:按鍵SW6控制GPIO_P2_10的EINT0
按鍵按下時,GPIO_P2_10是低電平,沒有按下為高電平。配置EINT0的中斷觸發(fā)方式為低電平觸發(fā),在中斷函數(shù)中熄滅LED。在主函數(shù)中一直點亮。程序的效果為按下SW6,LED燈熄滅。松開則一直保持亮。程序如下:
- #definerFIO1DIR(*(volatileunsigned*)0x20098020)
- #definerFIO1MASK(*(volatileunsigned*)0x20098030)
- #definerFIO1PIN(*(volatileunsigned*)0x20098034)
- #definerFIO1SET(*(volatileunsigned*)0x20098038)
- #definerFIO1CLR(*(volatileunsigned*)0x2009803c)
- #definerIOCON_P2_10(*(volatileunsigned*)0x4002C128)
- #definerIOIntStatus(*(volatileunsigned*)0x40028080)
- #definerIO2IntEnF(*(volatileunsigned*)0x400280B4)
- #definerIO2IntClr(*(volatileunsigned*)0x400280AC)
- #definerEXTINT(*(volatileunsigned*)0x400FC140)
- #definerEXTMODE(*(volatileunsigned*)0x400FC148)
- #definerEXTPOLAR(*(volatileunsigned*)0x400FC14C)
- #definerISER0(*(volatileunsigned*)0xE000E100)
- #definerIRP4(*(volatileunsigned*)0xE000E410)
- voidEINT0_IRQHandler()
- {
- rEXTINT|=(0x1<<0);//中斷產(chǎn)生之后必須清除該位
- rFIO1PIN|=(1<<18);
- }
- voidGPIO_INIT()
- {
- rFIO1DIR|=(0x1<<18);//P1.18設置為輸出,控制LED
- rIOCON_P2_10=(rIOCON_P2_10&(~0x7))|(0x1<<0);//配置FUNC字段為EINT0模式
- }
- voidEINT_INIT()
- {
- rEXTMODE&=~(0x1<<0);//配置成低電平觸發(fā)
- rEXTPOLAR&=~(0x1<<0);
- rISER0=(0x1<<18);//打開EINT0中斷使能
- }
- intmain(void)
- {
- GPIO_INIT();
- EINT_INIT();
- while(1)
- {
- rFIO1PIN&=~(1<<18);
- }
- }
- voidSystemInit(void)
- {
- }
評論