开发环境:ADS1.2
试验试验功用:在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; //设置各中止服务子程序地址
咱们在2440addr.h头文件晒干找到 #define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20))
咱们在option.inc汇编头文件晒干找到 _ISR_STARTADDRESS EQU 0x33ffff00 从上面二句咱们知道,这是中止服务的开端地址。
pISR_EINT0是一个中止进口地址变量,把该中止处理函数的首地址传递给该变量,即中止进口地址。
一般来说,运用__irq这个关键词来界说中止处理函数,这样体系会为咱们主动保存一些必要的变量,并能够在中止处理函数碑文完后正确地回来。还需要注意的是,中止处理函数不能有回来值,也不能传递任何参数。
void __irq IRQ_KEY4(void)
{
rSRCPND |=1<<0; //铲除中止标志位
rINTPND |=1<<0;
LED4_ON;
Delay();
LED4_OFF;
}
这是一个外部中止0的处理函数,
rSRCPND |=1<<0;
rINTPND |=1<<0;
碑文完这二句后一共源挂起中止标志和详细某中止挂起标志都被清楚,其他外部中止1、2、4处理函数亦是如此。
———————————————————————————————————
到这儿,这个main.c程序就解说结束啦。你懂了吗?