LPC2478的外部中断使用
扫描二维码
随时随地手机看文章
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中断要进行一次判断,依靠以下三个寄存器
从这三个寄存器可以看到每个引脚的中断状态,从而选择正确的处理方式
具体查看代码即可
#ifndef__EXTI_H_
#define__EXTI_H_
#include"common.h"
#include"lpc24xx.h"
externu8eint0Count;
externu8eint3Count;
voidExtiInit(void);
voidGPIOEINT3Init(void);
#endif
#include"exti.h"
u8eint0Count=0;
u8eint3Count=0;
void__irqEINT0_Handler(void)
{
IENABLE;/*handlesnestedinterrupt*/
EXTINT|=(1<<0);//清除中断
//dosomethinghere
eint0Count=1;
IDISABLE;
VICVectAddr=0;/*AcknowledgeInterrupt*/
}
void__irqEINT3_Handler(void)
{
IENABLE;/*handlesnestedinterrupt*/
//dosomethinghere
if((IO_INT_STAT&(1<<0))==1)//port0中断
{
if((IO0_INT_STAT_F&(1<<10))!=0)//确定P0.10上出现中断
{
eint3Count=1;
IO0_INT_CLR|=(1<<10);
}
}
EXTINT|=(1<<3);//清除中断
IDISABLE;
VICVectAddr=0;/*AcknowledgeInterrupt*/
}
//用exti0做例子
voidExtiInit(void)
{
PINSEL4&=~(3<<20);//配置为中断
PINSEL4|=(1<<20);
PINMODE4&=~(3<<20);//配置上拉电阻
EXTMODE|=(1<<0);//边沿触发
//
EXTPOLAR|=(1<<0);//上升沿触发
//中断向量配置
VICSoftIntClr|=(1<<14);//清除软件中断,eint0中断源为140开始
VICIntEnClr|=(1<<14);//禁止中断
VICIntSelect&=(1<<14);//选择为IRQ中断
VICVectAddr14=(unsigned)EINT0_Handler;//连接中断向量
VICVectPriority14=0x01;//中断优先级寄存器
VICIntEnable|=(1<<14);//中断向量使能有效
}
//用p0.10做例子
voidGPIOEINT3Init(void)
{
PINSEL0&=~(3<<20);//选择普通IO功能
PINMODE0&=~(3<<20);//选择上拉
IO0_INT_EN_F|=(1<<10);//下降沿中断使能
EXTMODE|=(1<<3);//边沿触发
EXTPOLAR&=~(1<<3);//下降沿触发
//中断向量配置
VICSoftIntClr|=(1<<17);//清除软件中断,eint3中断源为170开始
VICIntEnClr|=(1<<17);//禁止中断
VICIntSelect&=(1<<17);//选择为IRQ中断
VICVectAddr17=(unsigned)EINT3_Handler;//连接中断向量
VICVectPriority17=0x01;//中断优先级寄存器
VICIntEnable|=(1<<17);//中断向量使能有效
}
在外部中断处理程序中,记得先清除对应的IO口中断
然后再清除EINT0中断,不能先清除EINT再清除IO口中断(这会导致重复中断)