关于#嵌入式硬件#的问题:如何将响应的IO口配置为外部中断0(语言-c语言)

LPC2114芯片的外部中断0使用哪个IO?如何将响应的IO口配置为外部中断0?

LPC2114与LPC2124使用P0.16作为EINT0的GPIO,使用时需要设置PINSEL寄存器的值为EINT。

添加eint.h的代码

#ifndef __EINT_H
#define __EINT_H
#include "sys.h"

void eint_st0(u32 pin_num);//外部中断0,pin_num:1或者16

#endif

添加eint.c的代码

#include "eint.h"
__irq void IRQ_Eint0(void);//外部中断0中断服务函数声明

//外部中断0只能选择1或者16
void eint_st0(u32 pin_num){
    if(pin_num == 1){
        PINSEL0 = PINSEL0 | 0x0000000C; //P0.1管脚功能选择为外部中断
    }
    else{
        PINSEL1 = PINSEL1 | 0x00000003; //P0.16管脚功能选择为外部中断
    }
        VICIntSelect = VICIntSelect & (~0x00004000); //将外部中断0设置为IRQ模式
        VICIntEnable = VICIntEnable | 0x00004000; //使能外部中断0
        VICVectCntl0 = 0x2E; //将14号中断外部中断0优先级设置为0
        VICVectAddr0 = (int)IRQ_Eint0; //设置中断服务子程序
        EXTINT = EXTINT | 0x01;
        EXTMODE = EXTMODE & (~0x01); //0为电平激活,1为边沿激活
        EXTPOLAR = EXTPOLAR & (~0x01); //0为低电平产生中断,1位高电平产生中断
}

//外部中断0中断服务函数
__irq void IRQ_Eint0(void){

}

添加main.c的代码

#include "sys.h"
#include "gpio.h"
#include "eint.h"

u32 flag = 0;

__irq void IRQ_Eint0(void){
    flag = 1;
    while((EXTINT&0x01)!=0){  //等待外部中断信号恢复为高电平
      EXTINT = 0x01; //清除EINT0中断标志
  }
  VICVectAddr=0;
}

int main(){
    eint_st0(16);
    while(1){
        if(flag == 1){
            gpio1_seL(23);
            delay_ms(100);
            gpio1_seH(23);
            delay_ms(100);        
        }
        else{
            gpio1_seH(23);
        }
    }
}