LPC2478外部中斷
2478的外部中斷模型如下
也就是說(shuō),port0和2支持外部中斷,EINT0-2是三個(gè)獨(dú)立管腳的中斷,而EINT3則是port0和2的所有中斷共同擁有的向量
對(duì)于port0和2不需要刻意去把引腳配置為中斷模式,將他配置到輸入模式然后啟動(dòng)中斷就可以了,對(duì)于獨(dú)立的中斷,配置過(guò)程如下
1.將對(duì)應(yīng)的引腳配置為EINT模式
2.mode按照自己的需求設(shè)置上拉或者下拉
3.在系統(tǒng)控制寄存器中對(duì)中斷模式和中斷極性進(jìn)行配置
4.配置中端,配種中斷函數(shù),優(yōu)先級(jí),使能中斷等
對(duì)于PORT0 與PORT2的中斷,其實(shí)使用差不多,主要是EINT3的配置
1.IO口功能選擇GPIO
2.使能管腳的GPIO中斷
3.接下來(lái)配置好eint3中斷就可以使用了
中斷處理的時(shí)候,對(duì)于eint0-2可以直接處理,對(duì)于eint3中的port0和port2中斷要進(jìn)行一次判斷,依靠以下三個(gè)寄存器
從這三個(gè)寄存器可以看到每個(gè)引腳的中斷狀態(tài),從而選擇正確的處理方式
具體查看代碼即可
#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上出現(xiàn)中斷
{
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);//邊沿觸發(fā)
//
EXTPOLAR|=(1<<0);//上升沿觸發(fā)
//中斷向量配置
VICSoftIntClr|=(1<<14);//清除軟件中斷,eint0中斷源為140開始
VICIntEnClr|=(1<<14);//禁止中斷
VICIntSelect&=(1<<14);//選擇為IRQ中斷
VICVectAddr14=(unsigned)EINT0_Handler;//連接中斷向量
VICVectPriority14=0x01;//中斷優(yōu)先級(jí)寄存器
VICIntEnable|=(1<<14);//中斷向量使能有效
}
//用p0.10做例子
voidGPIOEINT3Init(void)
{
PINSEL0&=~(3<<20);//選擇普通IO功能
PINMODE0&=~(3<<20);//選擇上拉
IO0_INT_EN_F|=(1<<10);//下降沿中斷使能
EXTMODE|=(1<<3);//邊沿觸發(fā)
EXTPOLAR&=~(1<<3);//下降沿觸發(fā)
//中斷向量配置
VICSoftIntClr|=(1<<17);//清除軟件中斷,eint3中斷源為170開始
VICIntEnClr|=(1<<17);//禁止中斷
VICIntSelect&=(1<<17);//選擇為IRQ中斷
VICVectAddr17=(unsigned)EINT3_Handler;//連接中斷向量
VICVectPriority17=0x01;//中斷優(yōu)先級(jí)寄存器
VICIntEnable|=(1<<17);//中斷向量使能有效
}
在外部中斷處理程序中,記得先清除對(duì)應(yīng)的IO口中斷
然后再清除EINT0中斷,不能先清除EINT再清除IO口中斷(這會(huì)導(dǎo)致重復(fù)中斷)