LPC1788的外部中断和GPIO中断

首先是gpio中断,这一点和1768不同,1768使用的中断时和eint3共用中断通道,到了1788,专门为gpio开辟了中断

#ifndef __JOYPAD_H_

#define __JOYPAD_H_

#include "sys.h"

#include "delay.h"

#define JOYPAD_A        0X01

#define JOYPAD_B        0X02

#define JOYPAD_C        0X03

#define JOYPAD_D        0X04

#define JOYPAD_ENTER    0X05

extern u8 joypadValue;

void Joypad_Scan_Init(void);

void Joypad_Exti_Init(void);

u8 Joypad_Get_Key(void);

#endif

#include "joypad.h"

u8 joypadValue = 0;

void Joypad_Exti_Init(void)

{

//p4没有中断通道,所以只有key1和key2拥有中断

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

//选择管脚模式,1788为每个管脚都设计了一个寄存器来选择管脚模式

LPC_IOCON->P2_25 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

LPC_IOCON->P2_25 |= (2<<3);//上拉

P2dir(25) = 0;  //输入

LPC_GPIOINT->IO2IntEnF |= (1<<25);//使能IO口下降沿触发

LPC_GPIOINT->IO2IntClr |= (1<<25);//清除io口中断

LPC_IOCON->P2_26 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

LPC_IOCON->P2_26 |= (2<<3);//上拉

P2dir(26) = 0;  //输入

LPC_GPIOINT->IO2IntEnF |= (1<<26);//使能IO口下降沿触发

LPC_GPIOINT->IO2IntClr |= (1<<26);//清除io口中断

LPC_IOCON->P2_23 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

LPC_IOCON->P2_23 |= (2<<3);//上拉

P2dir(23) = 0;  //输入

LPC_GPIOINT->IO2IntEnF |= (1<<23);//使能IO口下降沿触发

LPC_GPIOINT->IO2IntClr |= (1<<23);//清除io口中断

LPC_IOCON->P2_19 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

LPC_IOCON->P2_19 |= (2<<3);//上拉

P2dir(19) = 0;  //输入

LPC_GPIOINT->IO2IntEnF |= (1<<19);//使能IO口下降沿触发

LPC_GPIOINT->IO2IntClr |= (1<<19);//清除io口中断

//P0.14 与usb2_connect冲突,所以使用usb2连接的时候不用p0.14

//  LPC_IOCON->P0_14 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

//  LPC_IOCON->P0_14 |= (2<<3);//上拉

//  P0dir(14) = 0;  //输入

//  LPC_GPIOINT->IO0IntEnF |= (1<<14);//使能IO口下降沿触发

//  LPC_GPIOINT->IO0IntClr |= (1<<14);//清除io口中断

NVIC_ClearPendingIRQ(GPIO_IRQn);

NVIC_SetPriority(GPIO_IRQn,NVIC_EncodePriority(PriorityGroup2,GPIO_PreemptPriority,GPIO_SubPriority));

NVIC_EnableIRQ(GPIO_IRQn);

}

void Joypad_Scan_Init(void)

{

//p2.25 p2.26 p2.23 P2.19 P0.14

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

//选择管脚模式,1788为每个管脚都设计了一个寄存器来选择管脚模式

LPC_IOCON->P2_25 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

LPC_IOCON->P2_25 |= (2<<3);//上拉

P2dir(25) = 0;  //输入

LPC_IOCON->P2_26 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

LPC_IOCON->P2_26 |= (2<<3);//上拉

P2dir(26) = 0;  //输入

LPC_IOCON->P2_23 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

LPC_IOCON->P2_23 |= (2<<3);//上拉

P2dir(23) = 0;  //输入

LPC_IOCON->P2_19 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

LPC_IOCON->P2_19 |= (2<<3);//上拉

P2dir(19) = 0;  //输入

//  LPC_IOCON->P0_14 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

//  LPC_IOCON->P0_14 |= (2<<3);//上拉

//  P0dir(14) = 0;  //输入

}

u8 Joypad_Get_Key(void)

{

if(P2in(25) == 0)

{

Delay_Ms(5);

if(P2in(25) == 0)

{

joypadValue = JOYPAD_A;

}

}

if(P2in(26) == 0)

{

Delay_Ms(5);

if(P2in(26) == 0)

{

joypadValue = JOYPAD_B;

}

}

if(P2in(23) == 0)

{

Delay_Ms(5);

if(P2in(23) == 0)

{

joypadValue = JOYPAD_C;

}

}

if(P2in(19) == 0)

{

Delay_Ms(5);

if(P2in(19) == 0)

{

joypadValue = JOYPAD_D;

}

}

//  if(P0in(14) == 0)

//  {

//      Delay_Ms(5);

//      if(P0in(14) == 0)

//      {

//          joypadValue = JOYPAD_ENTER;

//      }

//  }

return joypadValue;

}

void GPIO_IRQHandler(void)

{

NVIC_ClearPendingIRQ(GPIO_IRQn);

//  if((LPC_GPIOINT->IntStatus & (1<<0)))   //p0中断

//  {

//      if((LPC_GPIOINT->IO0IntStatF & (1<<14)))

//      {

//          //清除中断

//          LPC_GPIOINT->IO0IntClr |= (1<<14);

//          joypadValue = JOYPAD_ENTER;

//      }

//  }

if((LPC_GPIOINT->IntStatus & (1<<2)))   //p2中断

{

if((LPC_GPIOINT->IO2IntStatF & (1<<25)))

{

//清除中断

LPC_GPIOINT->IO2IntClr |= (1<<25);

joypadValue = JOYPAD_A;

}

if((LPC_GPIOINT->IO2IntStatF & (1<<26)))

{

//清除中断

LPC_GPIOINT->IO2IntClr |= (1<<26);

joypadValue = JOYPAD_B;

}

if((LPC_GPIOINT->IO2IntStatF & (1<<23)))

{

//清除中断

LPC_GPIOINT->IO2IntClr |= (1<<23);

joypadValue = JOYPAD_C;

}

if((LPC_GPIOINT->IO2IntStatF & (1<<19)))

{

//清除中断

LPC_GPIOINT->IO2IntClr |= (1<<19);

joypadValue = JOYPAD_D;

}

}

}

然后是外部中断

void eint0_init(void)

{

//p2.10

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

LPC_IOCON->P2_10 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

LPC_IOCON->P2_10 |= (1<<0)|(2<<3);//上拉 eint0模式

LPC_SC->EXTMODE |= 1<<0;//边沿触发 0为电平触发

LPC_SC->EXTPOLAR |= 1<<0;//上升沿触发 0为下降沿触发

LPC_GPIOINT->IO2IntEnR &= 1<<10;//使能GPIO 2.0上升沿触发

LPC_SC->EXTINT |= (0x01<<0);    //清除中断

NVIC_SetPriority(EINT0_IRQn,NVIC_EncodePriority(PriorityGroup2,EINT0_PreemptPriority,EINT0_SubPriority));

NVIC_EnableIRQ(EINT0_IRQn);

}

中断函数就懒得写了,和1768类似了

时间: 2024-10-20 21:41:45

LPC1788的外部中断和GPIO中断的相关文章

LPC1768外部中断与GPIO中断

LPC1768的外部中断严格来说只有四个,分别是EINT0,EINT1,EINT2,EINT3,技术手册上有如下说明 控制这四个外部中断靠以下寄存器 这三个寄存器的0 1 2 3位分别代表中断的0 1 2 3,EXTINT寄存器表示中断是否发生,在发生中断的时候该寄存器会置位,可以通过写1清零,EXTMODE寄存器表示触发模式,有电平触发和变化沿触发两种,EXTPOLAR与EXTMODE,在电平触发模式下,决定高电平还是低电平触发,在变化沿触发的情况下决定上升沿还是下降沿触发 这三个中断分别相关

3、通过按键S1产生外部中断改变LED1状态(it&#39;s 中断-寄存器和中断子程序)

通过按键S1产生外部中断改变LED1状态 1 /**************************************************************************** 2 * 文 件 名: main.c 3 * 作 者: Amo [ www.amoMcu.com 阿莫单片机] 4 * 修 订: 2014-04-08 5 * 版 本: 1.0 6 * 描 述: 通过按键S1产生外部中断改变LED1状态 7 *****************************

ESP8266 SDK开发: 外设篇-GPIO中断检测

直接上代码 #include "gpio.h" //设置GPIO0下降沿中断 PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U , FUNC_GPIO0);//GPIO0做为普通IO使用 GPIO_DIS_OUTPUT(0);//0:GPIO0 如果以前设置过GPIO为输出,则调用此函数关闭GPIO0输出 PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);//GPIO0上拉输入 _xt_isr_mask(1<<ETS_G

定时器配置 中断配置 GPIO

GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO

Linux中断 - 驱动申请中断API

一.前言 本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的驱动的时候,如何向Linux Kernel中的中断子系统注册中断处理函数?为了理解注册中断的接口,必须了解一些中断线程化(threaded interrupt handler)的基础知识,这些在第二章描述.第三章主要描述了驱动申请 interrupt line接口API request_threaded_irq的规格.第四章是进入request_threaded_irq的实现细节,分析整个代码的执行过程. 二.和中断相关的lin

移动app中断测试之来电中断

智能设备功能的日益强大和用户使用场景的多样性,使一款APP在移动设备端中断操作非常频繁,APP在中断场景的表现直接影响用户体验,中断测试是APP功能测试的必测内容.说到手机的中断测试,来电中断是大家最容易想到的,常规的测试包括呼叫和通话中断,如下图. 贴近智能手机的用户应用场景,我们发现打电话已经不局限于使用运营商网络,常用的社交软件如QQ.微信都支持语音和视频电话.这些软件使用网络进行通话或者视频,与运营商电话网络形式不同,所以非常有必要做中断测试.来电中断的测试场景添加如下图. 中断测试要点

mini2440裸机试炼之—RTC闹钟中断,节拍中断

环境搭建 硬件环境:J-link v8.mini2440.J-link转接板.串口转USB线 软件环境:windows7(32位).开发板uboot(NandFlash).J-link驱动(J-Link ARM V4.10i).SecureCRT.ADS1.2 其中ADS里的AXD设置:加载JlinkRDI.dll+Options->Configure Interface...,在Session File一页中选择"Run Configuration Script",将该name

STM32之中断与事件---中断与事件的区别

STM32之中断与事件---中断与事件的区别  http://blog.csdn.net/flydream0/article/details/8208463 这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套.图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请求寄存器,最后经过编号4的与门输出到NVIC中断检测电路,这个边沿检测电路受上升

【转载】STM32之中断与事件---中断与事件的区别

这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套.图中的蓝色虚线箭头,标出了外部中断信号的传输路径.       首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请求寄存器,最后经过编号4的与门输出到NVIC中断检测电路,这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同