zoukankan      html  css  js  c++  java
  • 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口中断(这会导致重复中断)

  • 相关阅读:
    IDEA 如何恢复默认布局 和显示项目目录导航
    jdbcTemplate 和 Thymeleaf模板引擎 查询 到模板赋值例子
    <meta charset="UTF-8"> 出错
    spring boot Thymeleaf模板引擎 最简单输出例子
    spring boot jpa 无法自动生成表
    IDea 运行程序就说ClassNotFind:com.jdbc.mysql.Driver
    pom.xml 里面dependency 添加spring-boot-starter-data-jpa 后运行出错
    IDEA 同时启动两个环境
    cannot resolve symbol
    Shell之expect的测试
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4279399.html
Copyright © 2011-2022 走看看