实验三:外部中断实验【实验目的】掌握lpc2000系列arm处理器的中断处理工作原理掌握外部中断的寄存器设置掌握中断服务程序的在Keil下的编程方法【实验内容】借助于外部中断,将按键动作进行累加计数,用4个led指示当前按键的次数。【实验原理】LPC2000系列可以管理最多32个外部中断,并将这些中断源最终通过irq或者fiq提交给ARM核进行处理。外部中断也在管理之中,通过设置相应的外部中断寄存器,可以对外部按键的输入进行中断处理。VIC的中断处理通道和相应的寄存器管理如下图具体的寄存器功能请参照教材,VIC一章节。外部中断寄存器见下图根据需要可以设置外部中断的方式和极性,寄存器的具体描述参照教材。【实验步骤】按照下图设计一个可以进行外部中断实验的电路。按键要接到EINT0~3的任一引脚上。下图以EINT0.0为例:向量IRQ0使能中断源向量IRQ0控制寄存器VICVectCntl0向量地址0寄存器VICVectAddr0默认向量地址寄存器VICDefVectAddr向量IRQ15使中断源向量IRQ15控制寄存器VICVectCntl15向量地址15寄存器VICVectAddr15DefIRQIRQ0IRQ15VectAddrVectAddr1DefVectAd硬件优先级向量地址寄存IRQ0IRQ15DefIRQIRQ中断信号向量向量非向量高低优先级IRQ中断状态寄存FIQ中断中断选择寄存中断使能寄存器中断使能清零寄中断源软件中断使能寄软件中断清零寄FIQ中断状态寄中断状态寄存IRQFIQ+用Keil建立一个工程,命名为eintled,并添加一个main.c文件到项目中。具体步骤参照实验一和实验二。主要函数功能如下:staticcharled=0;voideint0_isr()__irq{IOCLR=0xff;IOSET=led;led++;while(EXTINT&0x01){//EXTINT=0x01;/*清除EINT0中断标志*/}VICVectAddr=0;/*通知VIC中断处理结束*/}intmain(){//设定相应的引脚,P0.0~P0.3为GPIO输出;P0.16设置为EINT0功能PINSEL0=0;IODIR|=0xf;PINSEL1|=1;//设置外部中断触发方式EXTMODE=EXTMODE|0x01;//初始化EINT0为下降沿中断EXTPOLAR=EXTPOLAR&0x0E;//EXTINT=0x0F;//清除所有外部中断标志//设置VIC,将外部中断0分配到向量irq0VICIntSelect=0;//将所有的中断源都分配给irqVICVectAddr0=(unsignedlong)eint0_isr;VICVectCntl0=(0x20|14);//使能irq0给外部中断0VICIntEnable=1<<14;//外部中断0的VIC通道号是14while(1);//让程序停在这里,等待中断return0;}仔细分析上述代码,用keil编译后在proteus中运行,记录运行结果。【思考与分析】1.分析此中断服务处理程序,还缺少哪些部分?试着补全并验证(可以试着去除等待按键那条语句“while(EXTINT&0x01){”和对应的“}”)。2.若在硬件电路设计时候将按键变成按下产生高电平,抬起为低电平。试着用上升沿产生中断,重试此程序。3.若要使用向量irq15来完成此功能,如何修改代码?4.若要在VIC设置中,将irq0的是能寄存器中的使能位(即:VICVectCntl0的D5位)清0,此中断服务程序还会执行吗?怎么样才会执行?写出让led出现上述程序相同的现象的程序。