【韦东山旧1期学习笔记】11.S3C2440 中断实验(三)按键FIQ实验


接着上一次实验,我们将S5按键对应的中断改为FIQ中断,并以此来控制三盏灯同时亮灭。

按键FIQ实验

硬件介绍

在这里插入图片描述
在这里插入图片描述
由上图可以看出,S5按键对应的管脚是GPG11。

CPSR使能FIQ

在这里插入图片描述
我们将CPSR寄存器的F位清零,从而使能FIQ。

按键初始化操作

在这里插入图片描述
我们将GPGCON中对应的GPG11设置为中断功能,其对应的中断为EINT19。

GPGCON &= (~(0x3 << 22));
GPGCON |= (0x2 << 22);

下面开始设置EINT19中断的触发方式:
在这里插入图片描述

//设置EINT19的触发方式为双边沿触发
EXTINT2 |= (0x7 << 12); 

在这里插入图片描述
解除GPIO控制器中对应的EINT19中断屏蔽。

EINTMASK &= (~(1 << 19));

中断控制器设置

下面将EINT19对应的中断设置为FIQ中断。
在这里插入图片描述

INTMOD |= (1 << 5);

这里我们可以看到,按键S5对应的中断为EINT19,按键S4对应的中断为EINT11,这两个中断对应同一个硬件中断号5。故设置后S4按键按下后对应的中断也变为FIQ中断了。实验结果也会印证我们的判断。
当我们将中断方式设置为FIQ时,FIQ中断发生时不会去设置INTPND和INTOFFSET这两个寄存器。

中断处理函数

在FIQ处理函数中,由于S5按键的EINT19和S4按键的EINT11都对应硬件中断号5,所以它们二者都是FIQ中断,INTPND和INTOFFSET寄存器都不会被设置。我们只能通过GPIO控制器中的EINTPEND寄存器来进行判断。
在FIQ中断函数处理完毕,清除中断时也要从源头开始清除,先清除GPIO控制器的EINTPEND寄存器,然后清除中断控制器的SRCPND寄存器。

void fiqExpHandler(void) {
	printf("FIQ is Detected!\n\r");
	unsigned int isKeyUp = 0;
	int offset = -1;
	int hardwareIntNum = -1;
	printf("EINTPEND(0x%08x)\n\r", EINTPEND);
	printf("SRCPND(0x%08x)\n\r", SRCPND);
	if(EINTPEND & (0x1 << 11)) {
		//S4按下或松开 EINT11
		isKeyUp = (GPGDAT & (0x1 << 3));
		if(isKeyUp) {
			//熄灭LED4
			led_off(LED4);
			printf("Key is Up.LED4 is turn off.\n\r");
		}else {
			led_on(LED4);
			printf("Key is Down.LED4 is turn on.\n\r");
		}
		offset = 11;
		//EINT11对应的硬件中断号是5
		hardwareIntNum = 5;
		
	}else if(EINTPEND & (0x1 << 19)) {
		//S5按下或松开 EINT19
		isKeyUp = (GPGDAT & (0x1 << 11));
		if(isKeyUp) {
			//熄灭LED4
			led_off(LED1);
			led_off(LED2);
			led_off(LED4);
			printf("Key is Up.LED1 LED2 LED4 is turn off.\n\r");
		}else {
			led_on(LED1);
			led_on(LED2);
			led_on(LED4);
			printf("Key is Down.LED1 LED2 LED4 is turn on.\n\r");
		}
		offset = 19;
		//EINT19对应的硬件中断号是5
		hardwareIntNum = 5;
	}else {
		printf("Unknown FIQ Interrupt!\n\r");	
	}
	//从源头开始清理中断标志
	//注意是写1清零
	if(offset >= 0) {
		EINTPEND |= (1 << offset);
		SRCPND |= (1 << hardwareIntNum);
	}
	printf("FIQ is Handled.\n\r");
}

实验结果

在这里插入图片描述

发布了25 篇原创文章 · 获赞 2 · 访问量 1064

猜你喜欢

转载自blog.csdn.net/BakerTheGreat/article/details/104547178