裸奔程序之外部中断检测按键
实验实验功能:在TQ2440开发板上,利用外部中断模式检测按键是否按下,
如果某按键被按下则点亮对应某个LED。
——————————————————————————————————
#include"2440addr.h"
#include"option.h" //这个文件中定义了中断服务程序的起始地址
#define LED1_ON (rGPBDAT &=~(1<5))
#define LED1_OFF (rGPBDAT |=(1<5) )
#define LED2_ON (rGPBDAT &=~(1<6))
#define LED2_OFF (rGPBDAT |=(1<6))
#define LED3_ON (rGPBDAT &=~(1<7))
#define LED3_OFF (rGPBDAT |=(1<7))
#define LED4_ON (rGPBDAT &=~(1<8))
#define LED4_OFF (rGPBDAT |=(1<8))
void Delay(void)
{
int i;
for(i=0;i<100000;i++);
}
/外部中断处理函数/
void __irq IRQ_KEY1(void)
{
rSRCPND |=(1<1); //清除中断标志位
rINTPND |=(1<1);
LED1_ON;
Delay();
LED1_OFF;
}
void __irq IRQ_KEY2(void)
{
rSRCPND |=(1<4); //清除中断标志位
rINTPND |=(1<4);
rEINTPEND |=(1<4); //清除ENIT4的中断标志位
LED2_ON;
Delay();
LED2_OFF;
}
void __irq IRQ_KEY3(void)
{
rSRCPND |=(1<2); //清除中断标志位
rINTPND |=(1<2);
LED3_ON;
Delay();
LED3_OFF;
}
void __irq IRQ_KEY4(void)
{
rSRCPND |=1<0; //清除中断标志位
rINTPND |=1<0;
LED4_ON;
Delay();
LED4_OFF;
}
/外部中断初始化函数/
void Eint_Init(void)
{
rGPFCON &=~(0x33f);
rGPFCON |=0x22a; //设置GPF0、1、2、4为中断输入功能
rEXTINT0 = 0x20222; //ENIT0、1、2、4下降沿触发中断
rSRCPND = 0x17; //清除ENIT0、1、2、4的中断标志位
rINTPND = 0x17; //清除ENIT0、1、2、4的中断标志位
rEINTPEND=(1<4); //清除ENIT4的中断标志位
rINTMOD=0x0; //所有中断为IRQ中断
rINTMSK &= ~0x17; //ENIT0、1、2、4中断服务有效(这里就是使能外部中断)
rEINTMASK &= ~(1<4); //EINT4中断服务有效
pISR_EINT0 = (unsigned)IRQ_KEY4; //设置各中断服务子程序地址
pISR_EINT1 = (unsigned)IRQ_KEY1;
pISR_EINT2 = (unsigned)IRQ_KEY3;
pISR_EINT4_7 = (unsigned)IRQ_KEY2;
}
void Main(void)
{
rGPBCON &=~((3<10)|(3<12)|(3<14)|(3<16)); //对GPBCON[10:17]清零
rGPBCON |=((1<10)|(1<12)|(1<14)|(1<16)); //设置GPB5~8为输出
rGPBUP &=~((1<5)|(1<6)|(1<7)|(1<8)); //设置GPB5~8的上拉功能
rGPBDAT |=(1<5)|(1<6)|(1<7)|(1<8); //关闭LED
Eint_Init();
while(1);
}
——————————————————————————————————
我们来简单描述一下S3C2440的中断内容,它总共有60个中断源,分为中断源和子中断源;下图为中断源种类:
下图为子中断源种类:
中断控制器所用到的中断寄存器有八个:
中断处理框图如下所示(重点):
现在主要说下外部中断(其寄存器使用说明在数据手册的输入输出端口章节)
S3C2440有24个外部中断,GPF0--GPF7对应于外部中断EINT0--EINT7,GPG0--GPG15对应于外部中断EINT8--EINT23,支持上升沿、下降沿、高电平、低电平、双边沿触发。
设置外部中断的一般步骤
1、选择管脚功能为外部中断功能
2、设置触发方式
3、清中断源挂起寄存器,中断服务寄存器(可选,防止原有中断干扰)
4、设置中断模式(IRQ、FRQ, 默认为IRQ)
5、设置中断优先级(可选,一般默认)
6、打开外部中断屏蔽
7、设置中断服务入口程序
下面我们开始分析main.c这个程序,首先从main函数开始;
进入main函数后,首先是初始化LED,这四条语句在前面LED已经讲过,这里不再重复;接着调用Eint_Init();我们进入Eint_Init();函数看到,
首先是 rGPFCON &=~(0x33f); rGPFCON |=0x22a; 执行完这二句后,GPF0、1、2、4被设置为中断输入功能。
接着执行rEXTINT0 = 0x20222; 意思是将ENIT0、1、2、4配置为下降沿触发中断。
再执行rSRCPND = 0x17; 意思是清除ENIT0、1、2、4的中断标志位,SRCPND这个寄存器是中断请求标识的寄存器,如果SRCPND中哪一位置为1表示相应中断源有请求,如果要清除某一位则向相应位置写入1。
rINTPND = 0x17; 也是清除ENIT0、1、2、4的中断标志位 INTPND同样也是中断源请求寄存器,如果有中断发生,对应位会自动置1,如果要清除某一位也是向相应位写入1。
rEINTPEND=(1<4); //清除ENIT4的中断标志位
rINTMOD=0x0; //所有中断为IRQ中断 ,INITMOD为中断模式寄存器,有FIQ快速中断模式,当INTMOD被置1时为FIQ模式,否则为IRQ模式,默认为IRQ模式。
rINTMSK &= ~0x17; //ENIT0、1、2、4中断服务有效(这里就是使能外部中断) INTMSK负责总的中断向量屏蔽,当被置1时则被屏蔽,否则没有被屏蔽。
rEINTMASK &= ~(1<4);//EINT4中断服务有效 EINTMASK负责具体某一中断向量是否被屏蔽,当被置1时则被屏蔽,否则没有被屏蔽。
pISR_EINT0 = (unsigned)IRQ_KEY4; //设置各中断服务子程
裸奔程序外部中断检测按 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)