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

时间:2021-02-07 19:13:12

要使用LPC1788的外部中断,要进行两部分的操作。由于外部中断的管脚采用I/O复用的形式,显然我们首先要对管脚进行配置,使其工作在外部中断输入的模式。其次,我们需要配置中断相关的寄存器包括中断使能以及中断的触发方式等。

        由于我们使用的是外部中断0,查阅数据手册,其GPIO管脚为P2_10,为此我们设置IOCON_P2_10寄存器的FUNC字段,设置成001即为EINT0模式。 配置完引脚后,还需要继续配置具体的中断功能。我们需要打开中断使能,设置ISER相应位;还要配置中断的触发方式如电平触发和边沿触发,相关寄存器为EXTMODE和EXTPOLAR;中断触发以后会将外部中断标志寄存器EXTINT相应位置位,这将会向NVIC提交中断请求,如果管脚中断使能,则会产生中断。中断响应后必须将EXTINT中的该位清零,否则不能产生下一次中断。

        中断入口向量的地址在启动文件中定义,对于外部中断0,其标号为EINT0_IRQHandler。开发板上的电路图如图1所示 

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

图1:按键SW6控制GPIO_P2_10的EINT0

        按键按下时,GPIO_P2_10是低电平,没有按下为高电平。配置EINT0的中断触发方式为低电平触发,在中断函数中熄灭LED。在主函数中一直点亮。程序的效果为按下SW6,LED灯熄灭。松开则一直保持亮。程序如下:

[cpp]  view plain  copy
  1. #define rFIO1DIR        (*(volatile unsigned*)0x20098020)  
  2. #define rFIO1MASK       (*(volatile unsigned*)0x20098030)  
  3. #define rFIO1PIN        (*(volatile unsigned*)0x20098034)  
  4. #define rFIO1SET        (*(volatile unsigned*)0x20098038)  
  5. #define rFIO1CLR        (*(volatile unsigned*)0x2009803c)  
  6.   
  7. #define rIOCON_P2_10            (*(volatile unsigned *)0x4002C128)  
  8. #define rIOIntStatus            (*(volatile unsigned *)0x40028080)  
  9. #define rIO2IntEnF      (*(volatile unsigned *)0x400280B4)  
  10. #define rIO2IntClr      (*(volatile unsigned *)0x400280AC)  
  11.   
  12. #define rEXTINT         (*(volatile unsigned *)0x400FC140)  
  13. #define rEXTMODE        (*(volatile unsigned *)0x400FC148)  
  14. #define rEXTPOLAR       (*(volatile unsigned *)0x400FC14C)  
  15.   
  16. #define rISER0          (*(volatile unsigned *)0xE000E100)  
  17. #define rIRP4           (*(volatile unsigned *)0xE000E410)  
  18.   
  19. void EINT0_IRQHandler()  
  20. {  
  21.     rEXTINT |= (0x1<<0);//中断产生之后必须清除该位  
  22.       
  23.     rFIO1PIN |= (1<<18);  
  24. }  
  25.   
  26. void GPIO_INIT()  
  27. {  
  28.     rFIO1DIR |= (0x1<<18);//P1.18设置为输出,控制LED  
  29.     rIOCON_P2_10 = (rIOCON_P2_10&(~0x7))|(0x1<<0);//配置FUNC字段为EINT0模式  
  30. }  
  31.   
  32. void EINT_INIT()  
  33. {  
  34.     rEXTMODE &= ~(0x1<<0);//配置成低电平触发  
  35.     rEXTPOLAR &= ~(0x1<<0);  
  36.       
  37.     rISER0 = (0x1<<18);//打开EINT0中断使能  
  38. }  
  39.   
  40. int main(void)  
  41. {  
  42.     GPIO_INIT();  
  43.     EINT_INIT();  
  44.     while(1)  
  45.     {  
  46.         rFIO1PIN &= ~(1<<18);  
  47.     }  
  48. }  
  49.   
  50. void SystemInit (void)  
  51. {  
  52. }