单片机
返回首页

LPC2478的外部中断使用

2017-01-13 来源:eefocus

LPC2478外部中断

2478的外部中断模型如下


也就是说,port0和2支持外部中断,EINT0-2是三个独立管脚的中断,而EINT3则是port0和2的所有中断共同拥有的向量

对于port0和2不需要刻意去把引脚配置为中断模式,将他配置到输入模式然后启动中断就可以了,对于独立的中断,配置过程如下

1.      将对应的引脚配置为EINT模式



2.      mode按照自己的需求设置上拉或者下拉

3.      在系统控制寄存器中对中断模式和中断极性进行配置



4.      配置中端,配种中断函数,优先级,使能中断等

 

对于PORT0 与PORT2的中断,其实使用差不多,主要是EINT3的配置

1.      IO口功能选择GPIO

2.      使能管脚的GPIO中断


3.      接下来配置好eint3中断就可以使用了

 

中断处理的时候,对于eint0-2可以直接处理,对于eint3中的port0和port2中断要进行一次判断,依靠以下三个寄存器






从这三个寄存器可以看到每个引脚的中断状态,从而选择正确的处理方式

具体查看代码即可

 

  1. #ifndef __EXTI_H_  

  2. #define __EXTI_H_  

  3. #include 'common.h'  

  4. #include 'lpc24xx.h'  

  5.   

  6. extern u8 eint0Count;  

  7.   

  8. extern u8 eint3Count;  

  9.   

  10. void ExtiInit(void);  

  11.   

  12.   

  13. void GPIOEINT3Init(void);  

  14.   

  15.   

  16. #endif  



 

  1. #include 'exti.h'  

  2.   

  3. u8 eint0Count = 0;  

  4. u8 eint3Count = 0;  

  5.   

  6. void __irq EINT0_Handler(void)  

  7. {  

  8.     IENABLE;            /* handles nested interrupt */    

  9.     EXTINT |= (1<<0); //清除中断  

  10.     //do somethinghere  

  11.       

  12.     eint0Count = 1;  

  13.       

  14.     IDISABLE;  

  15.     VICVectAddr = 0;    /* Acknowledge Interrupt */  

  16. }  

  17.   

  18. void __irq EINT3_Handler(void)  

  19. {  

  20.     IENABLE;            /* handles nested interrupt */    

  21.     //do somethinghere  

  22.       

  23.     if((IO_INT_STAT&(1<<0)) == 1)//port0 中断  

  24.     {  

  25.         if((IO0_INT_STAT_F&(1<<10)) != 0)//确定P0.10上出现中断  

  26.         {  

  27.             eint3Count = 1;  

  28.             IO0_INT_CLR |= (1<<10);  

  29.         }  

  30.     }  

  31.     EXTINT |= (1<<3); //清除中断  

  32.       

  33.     IDISABLE;  

  34.     VICVectAddr = 0;    /* Acknowledge Interrupt */  

  35. }  

  36.   

  37.   

  38.   

  39.   

  40. //用exti0做例子  

  41. void ExtiInit(void)  

  42. {  

  43.     PINSEL4 &= ~(3<<20);//配置为中断  

  44.     PINSEL4 |= (1<<20);  

  45.       

  46.     PINMODE4 &= ~(3<<20);//配置上拉电阻  

  47.       

  48.     EXTMODE |= (1<<0);//边沿触发  

  49. //    

  50.     EXTPOLAR |= (1<<0);//上升沿触发  

  51.       

  52.     //中断向量配置  

  53.     VICSoftIntClr |= (1<<14);//清除软件中断,eint0中断源为14 0开始  

  54.     VICIntEnClr |= (1<<14);//禁止中断  

  55.     VICIntSelect &= (1<<14);//选择为IRQ中断  

  56.     VICVectAddr14 = (unsigned)EINT0_Handler;//连接中断向量  

  57.     VICVectPriority14 = 0x01;//中断优先级寄存器  

  58.     VICIntEnable |= (1<<14);//中断向量使能有效  

  59. }  

  60.   

  61.   

  62.   

  63. //用p0.10做例子  

  64. void GPIOEINT3Init(void)  

  65. {  

  66.     PINSEL0 &= ~(3<<20);//选择普通IO功能  

  67.     PINMODE0 &= ~(3<<20);//选择上拉  

  68.     IO0_INT_EN_F |= (1<<10);//下降沿中断使能  

  69.       

  70.       

  71.     EXTMODE |= (1<<3);//边沿触发  

  72.     EXTPOLAR &= ~(1<<3);//下降沿触发  

  73.       

  74.     //中断向量配置  

  75.     VICSoftIntClr |= (1<<17);//清除软件中断,eint3中断源为17 0开始  

  76.     VICIntEnClr |= (1<<17);//禁止中断  

  77.     VICIntSelect &= (1<<17);//选择为IRQ中断  

  78.     VICVectAddr17 = (unsigned)EINT3_Handler;//连接中断向量  

  79.     VICVectPriority17 = 0x01;//中断优先级寄存器  

  80.     VICIntEnable |= (1<<17);//中断向量使能有效  

  81.       

  82. }  


 

在外部中断处理程序中,记得先清除对应的IO口中断



然后再清除EINT0中断,不能先清除EINT再清除IO口中断(这会导致重复中断)


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章