LPC1788的外部中断和GPIO中断

发布者:温馨家园最新更新时间:2017-01-13 来源: eefocus关键字: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类似了


关键字:LPC1788  外部中断  GPIO中断 引用地址:LPC1788的外部中断和GPIO中断

上一篇:LPC1788的spi使用
下一篇:LPC1788的EMC驱动norflash

推荐阅读最新更新时间:2024-03-16 15:30

stm32mp1 Cortex M4开发篇4:GPIO外部中断详解
写在前面: 本文章为《ARM Cortex-M4裸机开发篇》系列中的一篇,,全系列总计14篇。笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板),Cortex-M4裸机开发篇除了讲M4裸机开发外,还会讲解通过M4控制资源扩展板上的各种传感器执行器模块(包括空气温湿度传感器、LED灯、数码管、蜂鸣器、震动马达、按键中断、风扇等),本篇是M4控制资源扩展板中的一篇。 资源扩展板是FS-MP1A开发板的扩展模块,主要包含了10余种助主流传感器、执行器件、总线控制器件,非常方便项目扩展用。可拓展开发智慧家庭、智能医疗、智能安防、工业控制、图像识别、环境检测等方向的10个左右综合项目,华清远见开发板也将配套提
[单片机]
stm32mp1 Cortex M4开发篇4:GPIO<font color='red'>外部中断</font>详解
ARM7与FPGA相结合的应用
  ARM7与FPGA相结合在工业控制和故障检测中的应用   工业控制中往往需要完成多通道故障检测及多通道命令控制(这种多任务设置非常普遍),单独的CPU芯片由于其外部控制接口数量有限而难以直接完成多路检控任务,故利用ARM芯片与FPGA相结合来扩展检控通道是一个非常好的选择。这里介绍用Atmel公司ARM7处理器(AT91FR40162)和ALTERA公司的低成本FPGA芯片(cyclone2)结合使用完成多通道检控任务的一种实现方法。    各部分功能简介   图1为此系统的结构连接框图。如图所示,ARM芯片与FPGA芯片之间通过数据总线、地址总线及读写控制线相连,而与终端PC则通过串口通信;FPGA与目标设备通过命令控
[工业控制]
stm32 EXTI中断BUG,无法进入外部中断的问题
我在调试程序时,发现有个EXTI中断怎样都无法进入,虽然查了网上各种经验,但对我的程序都没有帮助,后来终于发现问题了,原因是官方库函数有些问题。 情况是这样的。我的程序中有两个EXTI外部中断,假设为EXTI1和EXTI2,由于功能需要,在某个地方,我需要关闭EXTI1,一段代码之后再打开EXTI1。 void EXTI_Config2(void) { EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line1; EXTI_InitStructure.EXTI_LineCmd = DISABLE; EXTI_Clear
[单片机]
STM32G0技术详解 _ GPIO-EXTI-系统DMA
STM32G0 的复用率是很高的,更多的引脚可以被当做 GPIO引脚 来使用。 G0的GPIO模块与F0的类似,主要有以下 区别 STM32F0系统架构 STM32G0系统架构 主要特性 双向操作最多达60个I/O引脚,从GPIOA~GPIOF共5个端口,每个端口最多16个I/O引脚,全部具有外部中断和唤醒功能,使用BSRR和BRR寄存器进行原子操作(置位和复位),每个端口独立配置。 GPIOx直接挂在IOPORT总线上。 大多数I/O引脚能够支持5V容忍。 引脚的基本结构 操作模式 输入模式:悬浮(无上下拉电阻),输入上拉/下拉,模拟输入模式。 输出模式:推挽,带有可选上拉/下拉的开漏。
[单片机]
STM32G0技术详解 _ GPIO-<font color='red'>EXTI</font>-系统DMA
STM32F429 >> 7. 中断
本工程板级支持包文件适用于野火stm32f429 开发板。 STM32 的中断主要涉及两个部分,NVIC 和EXTI NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能;外部中断/事件控制器(EXTI)可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。 EXTI 可分为两大功能:产生中断 和 产生事件 当其产生中断时,其中断线路将输入信号输入到NVIC,进一步运行中断服务函数,实现功能(其输出最终被映射到NVIC的相应通道。);而当其产生事件时,则是传输一个脉冲信号给其他外设使用 EXTI 是在APB2 总线上的 EXTI0 至 EXTI15 用于 GPIO,通
[单片机]
STM32F429 >> 7. 中断
S3C2440外部中断详解
要想正确地执行2440的外部中断,一般需要完成两个部分内容:中断初始化和中断处理函数。 在具体执行中断之前,要初始化好要用的中断。2440的外部中断引脚EINT与通用IO引脚F和G复用,要想使用中断功能,就要把相应的引脚配置成中断模式,如我们想把端口F0设置成外部中断,而其他引脚功能不变,则GPFCON=(GPFCON & ~0x3) | 0x2。配置完引脚后,还需要配置具体的中断功能。我们要打开某一中断的屏蔽,这样才能响应该中断,相对应的寄存器为INTMSK;还要设置外部中断的触发方式,如低电平、高电平、上升沿、下降沿等,相对应的寄存器为EXTINTn。另外由于EINT4到EINT7共用一个中断向量,EINT8到EINT2
[单片机]
S3C2440<font color='red'>外部中断</font>详解
STM32G0—外部中断
EXTI,即外部中断,这也是将系统或STM32从停止模式唤醒的一种方式,它能产生中断和事件。我们可以基于触发沿配置事件,有效触发沿可以是下降沿或上升沿,此外,还有一些直接的触发事件。 外部中断的功能框图 如图所示,任何GPIO都可以配置为外部中断或事件,STM32G0还提供了使用EXTI唤醒微控制器或微控制器电源模块的方法。因此,用户可以从低功耗模式唤醒系统,一些可配置事件和直接事件连接到NVIC和Cortex-M0+内核的事件输入。 EXTI的线路映射 如图所示,对于线路0-18,即GPIO、PVD和比较器而言,这些线路的事件时可配置的。然而,线路19至33是直接连接。举例来说,它们来自其他外设,例如RTC、TA
[单片机]
STM32学习笔记(2):外部中断的使用
中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大大增加,而且中断的设置也更加复杂。今天就将来探讨一下关于STM32中的中断系统。 1 基本概念 ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved