一起学mini2440裸机开发(十)--mini2440外部中断实验
实验功能
硬件电路分析:
程序分析:
#include"led.h"
#include"button.h"
#include"isrservice.h"
#include"interrupt.h"int main()
{Led_Init(); //初始化LED KeyInt_Init(); //初始化按键 Irq_Init(); //初始化外部中断 while(1) //循环,等待中断发生 { ; }
}
#include
void Led_Init(void)
{GPBCON&=~((3<10)|(3<12)|(3<14)|(3<16)); GPBCON|=((1<10)|(1<12)|(1<14)|(1<16)); //设置GPB5-8口为输出功能 GPBUP&=~((1<5)|(1<6)|(1<7)|(1<8)); //上拉电阻使能 GPBDAT|=(1<5)|(1<6)|(1<7)|(1<8); //令GPBDAT5-8均为高电平,即令4个led灯全灭
}
#ifndef __LED_H__
#define __LED_H__#include
#define Led1_On(){GPBDAT&=(~(1<5));}
#defineLed1_Off() {GPBDAT|=(1<5);}
#define Led2_On(){GPBDAT&=(~(1<6));}
#defineLed2_Off() {GPBDAT|=(1<6);}
#define Led3_On(){GPBDAT&=(~(1<7));}
#defineLed3_Off() {GPBDAT|=(1<7);}
#define Led4_On(){GPBDAT&=(~(1<8));}
#defineLed4_Off() {GPBDAT|=(1<8);}
void Led_Init(void);#endif
#include
#include"button.h"#define
KEY1_C (3<0)
#defineKEY2_C (3<6)
#defineKEY3_C (3<10)
#defineKEY4_C (3<12) #define
KEY1 (2<0)
#defineKEY2 (2<6)
#defineKEY3 (2<10)
#defineKEY4 (2<12)
void KeyInt_Init(void)
{GPGCON&=~(KEY1_C|KEY2_C|KEY3_C|KEY4_C); GPGCON|=KEY1|KEY2|KEY3|KEY4; //将GPG0、3、5、6、7、11设为外部中断输入功能 GPGUP&=~((1<0)|(1<3)|(1<5)|(1<6)); GPGDAT|=(1<0)|(1<3)|(1<5)|(1<6); //因为按下按键后,相应的GPIO口为0,所以初始化为高电平
}
#ifndef __BUTTON_H__
#define __BUTTON_H__void KeyInt_Init(void);
#endif
#ifndef
void Irq_Init(void);__INTERRUPT_H__
#define__INTERRUPT_H__ #endif
#include
void Irq_Init(void)
#include"interrupt.h"
{//对于EINT8,EINT11,EINT13,EINT14,需要在EINTMASK寄存器使能它们 EINTMASK&=(~(1<8))&(~(1<11))&(~(1<13))&(~(1<14)); //这4个外部中断的优先级是相同的,EINT8_23都接仲裁器的REQ1引脚 //所以不用像韦东山程序里那样再设置优先级了 //EINT8,EINT11,EINT13,EINT14使能 INTMSK&=(~(1<5));
}
#ifndef
__ISRSERVICE_H__
#define __ISRSERVICE_H__void __irq IRQ_Handler(void);
#endif
#include
#include"isrservice.h"
#include"led.h"
void delay(void);
void __irq IRQ_Handler(void)
{unsigned long oft=INTOFFSET; unsigned long val;
val=EINTPEND; //EINT寄存器,它的位x为1时,表示EINT已经发生(x为4——23)。 if(val&(1<8)) //K1被按下,LED1被点亮 { Led1_On();delay();Led1_Off(); } if(val&(1<11)) //K2被按下,LED2被点亮 { Led2_On();delay();Led2_Off(); } if(val&(1<13)) //K3被按下,LED3被点亮 { Led3_On();delay();Led3_Off(); } if(val&(1<14)) //K4被按下,LED4被点亮 { Led4_On();delay();Led4_Off(); } //清除中断 if(oft==5) EINTPEND=(1<8)|(1<11)|(1<13)|(1<14); //清除EINTPEND寄存器,往某位写入1即可清楚此位 SRCPND=1 //清除SRCPND寄存器,往某位写入1即可清楚此位 INTPND=1 //清除INTPND寄存器,往某位写入1即可清楚此位 //注意:清除顺序很重要:先是EINTPEND,然后是SRCPND,最后是INTPND
}
static void delay(void)
{int i,j; for(i=0;i<100;i++) for(j=0;j<10;j++);
}
mini2440裸机开发外部中 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)