您的位置 首页 报告

LPC1768外部中止与GPIO中止

LPC1768的外部中断严格来说只有四个,分别是EINT0,EINT1,EINT2,EINT3,技术手册上有如下说明控制这四个外部中断靠以下寄存器这三个寄存器的0…

LPC1768外部中止严格来说只要四个,别离是EINT0,EINT1,EINT2,EINT3,技能手册上有如下阐明

操控这四个外部中止靠以下寄存器

这三个寄存器的0 1 2 3位别离代表中止的0 1 2 3,EXTINT寄存器一共中止是否产生,在产生中止的时分该寄存器会置位,能够经过写1清零,EXTMODE寄存器一共触发形式,有电平触发和改变沿触发两种,EXTPOLAR与EXTMODE,在电平触发形式下,决议高电平仍是低电平触发,在改变沿触发的情况下决议上升沿仍是下降沿触发

这三个中止别离相关的引脚为 EINT0—P2.10 EINT1—P2.11 EINT2—P2.12 EINT3—P2.13,

运用这三个引脚作为中止的办法如下.

首要初始化相应的引脚,挑选中止功用,然后装备中止触发方法,最终翻开nvic中止答应,这就完成了初始化,然后就是中止呼应程序,在中止呼应程序中先铲除extint中的中止标志,然后铲除nvic中止挂起,接着做自己的工作,完好的流程就OK了,示例代码如下:

static void Eint1Init(EINTMODE eintMode,EINTLOGIC eintLogic,PREEMPTPRIORITY PreemptPriority,SUBPRIORITY SubPriority)

{

u8 i = 0;

LPC_PINCON->PINSEL4 &= ~(0X03L<<22);

LPC_PINCON->PINSEL4 = (0X01L<<22);//设置IO口功用为EINT1

if(eintMode)LPC_SC->EXTMODE = 1<<1;

else LPC_SC->EXTMODE &= ~(1<<1);//挑选中止形式为电平或许边缘

if(eintLogic)

{

LPC_SC->EXTPOLAR = 1<<1;

LPC_GPIOINT->IO2IntEnR &= 1<<11;

}

else

{

LPC_SC->EXTPOLAR &= ~(1<<1);

LPC_GPIOINT->IO2IntEnF &= 1<<11;

}//设置中止触发电平

//初始化清零

i = (LPC_SC->EXTINT>>1)&0x01;

if(i)LPC_SC->EXTINT &= ~(0x01<<1); //铲除中止标志

NVIC_SetPriority(EINT1_IRQn,NVIC_EncodePriority(PriorityGroup2,PreemptPriority,SubPriority));//设置中止优先级

NVIC_EnableIRQ(EINT1_IRQn);//使能中止

}

中止处理函数中流程如下

void EINT1_IRQHandler(void)

{

if(Eint1GetFlag())

{

Eint1ClearFlag();

}

}

从这一点看,好像1768的中止数量少了点,可是在gpio的资猜中,有这么一句话

也就是说,1768的gpio口是有中止的,可是可能是厂商觉得费事,没有专门拓荒GPIO中止通道,所GPIO中止也是用的EINT3的中止通道,P0端口和P2端口的一切端口都能用在中止上,那么1768的外部中止一会儿就提升了几十个.

运用GPIO作中止有这些需求设置

指明整个端口有没有中止产生,可想而知,这个寄存器只要两个位是可用的,由于只要两个端口支撑中止

这是使能某个端口的上升沿中止,既然如此,就还会有一个对应的下降沿中止使能

然后,上升沿中止和下降沿中止都有一个中止标志位,别离如下

最终,中止标志位需求有一个清零位,原则上,两个标志位应该对应两个清零,可是1768为了简洁,用一个清零位铲除两个标志位,如下

别的,运用GPIO中止的时分,GPIO设置为通用输出输入功用,运用IO口中止的例程如下

//运用p2.5做测验

void GPIO_INT_Init(void)

{

LPC_SC->PCONP = (1<<15);//翻开时钟

LPC_PINCON->PINSEL4 &= ~(0X03L<<10);//挑选GPIO功用

LPC_PINCON->PINMODE4 &= ~(0X03L<<10);//使能内部上拉电阻

LPC_PINCON->PINMODE_OD2 &= ~(0X01<<5);//撤销推挽形式

LPC_GPIOINT->IO2IntEnR = (1<<5);//使能下降沿中止

LPC_GPIOINT->IO2IntEnF &= ~(1<<5);//制止上升沿中止

LPC_GPIOINT->IO2IntClr = (1<<5);//中止清零

NVIC_SetPriority(EINT3_IRQn,NVIC_EncodePriority(PriorityGroup2,PreemptPriority,SubPriority));

NVIC_EnableIRQ(EINT3_IRQn);//翻开NVIC中止

}

void EINT3_IRQHandler(void)

{

NV%&&&&&%_ClearPendingIRQ(EINT3_IRQn);

if(LPC_GPIOINT->IntStatus &(1<<2))//端口2有中止

{

if(LPC_GPIOINT->IO2IntStatR &(1<<5))//p2.5有中止产生

{

LPC_GPIOINT->IO2IntClr = (1<<5);//中止清零

//接下来能够做自己的工作了

}

}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/263872.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部