新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Cortex-M3 (NXP LPC1788)之外部中斷操作

        Cortex-M3 (NXP LPC1788)之外部中斷操作

        作者: 時間:2016-11-19 來源:網絡 收藏
        要使用LPC1788外部中斷,要進行兩部分的操作。由于外部中斷的管腳采用I/O復用的形式,顯然我們首先要對管腳進行配置,使其工作在外部中斷輸入的模式。其次,我們需要配置中斷相關的寄存器包括中斷使能以及中斷的觸發方式等。

        由于我們使用的是外部中斷0,查閱數據手冊,其GPIO管腳為P2_10,為此我們設置IOCON_P2_10寄存器的FUNC字段,設置成001即為EINT0模式。 配置完引腳后,還需要繼續配置具體的中斷功能。我們需要打開中斷使能,設置ISER相應位;還要配置中斷的觸發方式如電平觸發和邊沿觸發,相關寄存器為EXTMODE和EXTPOLAR;中斷觸發以后會將外部中斷標志寄存器EXTINT相應位置位,這將會向NVIC提交中斷請求,如果管腳中斷使能,則會產生中斷。中斷響應后必須將EXTINT中的該位清零,否則不能產生下一次中斷。

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

        中斷入口向量的地址在啟動文件中定義,對于外部中斷0,其標號為EINT0_IRQHandler。開發板上的電路圖如圖1所示

        圖1:按鍵SW6控制GPIO_P2_10的EINT0

        按鍵按下時,GPIO_P2_10是低電平,沒有按下為高電平。配置EINT0的中斷觸發方式為低電平觸發,在中斷函數中熄滅LED。在主函數中一直點亮。程序的效果為按下SW6,LED燈熄滅。松開則一直保持亮。程序如下:

        1. #definerFIO1DIR(*(volatileunsigned*)0x20098020)
        2. #definerFIO1MASK(*(volatileunsigned*)0x20098030)
        3. #definerFIO1PIN(*(volatileunsigned*)0x20098034)
        4. #definerFIO1SET(*(volatileunsigned*)0x20098038)
        5. #definerFIO1CLR(*(volatileunsigned*)0x2009803c)
        6. #definerIOCON_P2_10(*(volatileunsigned*)0x4002C128)
        7. #definerIOIntStatus(*(volatileunsigned*)0x40028080)
        8. #definerIO2IntEnF(*(volatileunsigned*)0x400280B4)
        9. #definerIO2IntClr(*(volatileunsigned*)0x400280AC)
        10. #definerEXTINT(*(volatileunsigned*)0x400FC140)
        11. #definerEXTMODE(*(volatileunsigned*)0x400FC148)
        12. #definerEXTPOLAR(*(volatileunsigned*)0x400FC14C)
        13. #definerISER0(*(volatileunsigned*)0xE000E100)
        14. #definerIRP4(*(volatileunsigned*)0xE000E410)
        15. voidEINT0_IRQHandler()
        16. {
        17. rEXTINT|=(0x1<<0);//中斷產生之后必須清除該位
        18. rFIO1PIN|=(1<<18);
        19. }
        20. voidGPIO_INIT()
        21. {
        22. rFIO1DIR|=(0x1<<18);//P1.18設置為輸出,控制LED
        23. rIOCON_P2_10=(rIOCON_P2_10&(~0x7))|(0x1<<0);//配置FUNC字段為EINT0模式
        24. }
        25. voidEINT_INIT()
        26. {
        27. rEXTMODE&=~(0x1<<0);//配置成低電平觸發
        28. rEXTPOLAR&=~(0x1<<0);
        29. rISER0=(0x1<<18);//打開EINT0中斷使能
        30. }
        31. intmain(void)
        32. {
        33. GPIO_INIT();
        34. EINT_INIT();
        35. while(1)
        36. {
        37. rFIO1PIN&=~(1<<18);
        38. }
        39. }
        40. voidSystemInit(void)
        41. {
        42. }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 清涧县| 阜阳市| 榆社县| 思南县| 大安市| 涞水县| 丰顺县| 新化县| 山阴县| 大余县| 五家渠市| 平塘县| 平阴县| 汝南县| 吉隆县| 隆化县| 五原县| 海门市| 新建县| 新密市| 老河口市| 海丰县| 红原县| 平远县| 乐陵市| 池州市| 抚松县| 南开区| 邯郸县| 玉溪市| 鲁甸县| 仙游县| 灵寿县| 蓝山县| 武清区| 南陵县| 雷山县| 和林格尔县| 永宁县| 景德镇市| 安塞县|