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"

extern u8 eint0Count;

extern u8 eint3Count;

void ExtiInit(void);


void GPIOEINT3Init(void);


#endif







#include "exti.h"

u8 eint0Count = 0;
u8 eint3Count = 0;

void __irq EINT0_Handler(void)
{
	IENABLE;			/* handles nested interrupt */	
	EXTINT |= (1<<0);	//清除中断
	//do somethinghere
	
	eint0Count = 1;
	
	IDISABLE;
	VICVectAddr = 0;	/* Acknowledge Interrupt */
}

void __irq EINT3_Handler(void)
{
	IENABLE;			/* handles nested interrupt */	
	//do somethinghere
	
	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;	/* Acknowledge Interrupt */
}




//用exti0做例子
void ExtiInit(void)
{
	PINSEL4 &= ~(3<<20);//配置为中断
	PINSEL4 |= (1<<20);
	
	PINMODE4 &= ~(3<<20);//配置上拉电阻
	
	EXTMODE |= (1<<0);//边沿触发
//	
	EXTPOLAR |= (1<<0);//上升沿触发
	
	//中断向量配置
	VICSoftIntClr |= (1<<14);//清除软件中断,eint0中断源为14 0开始
	VICIntEnClr |= (1<<14);//禁止中断
	VICIntSelect &= (1<<14);//选择为IRQ中断
	VICVectAddr14 = (unsigned)EINT0_Handler;//连接中断向量
	VICVectPriority14 = 0x01;//中断优先级寄存器
	VICIntEnable |= (1<<14);//中断向量使能有效
}



//用p0.10做例子
void GPIOEINT3Init(void)
{
	PINSEL0 &= ~(3<<20);//选择普通IO功能
	PINMODE0 &= ~(3<<20);//选择上拉
	IO0_INT_EN_F |= (1<<10);//下降沿中断使能
	
	
	EXTMODE |= (1<<3);//边沿触发
	EXTPOLAR &= ~(1<<3);//下降沿触发
	
	//中断向量配置
	VICSoftIntClr |= (1<<17);//清除软件中断,eint3中断源为17 0开始
	VICIntEnClr |= (1<<17);//禁止中断
	VICIntSelect &= (1<<17);//选择为IRQ中断
	VICVectAddr17 = (unsigned)EINT3_Handler;//连接中断向量
	VICVectPriority17 = 0x01;//中断优先级寄存器
	VICIntEnable |= (1<<17);//中断向量使能有效
	
}

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


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

原文地址:https://www.cnblogs.com/dengxiaojun/p/4279399.html