【LV12 DAY17-18 中断处理】




GPX1_1是外部中断9 EINT9

查询可知其中断ID是57

所以需要进行人为修正lr的地址

sub lr,lr,#4

//iqr异常处理程序

irq_handler:

复制代码
	//IRQ异常后LR保存的地址是被IRQ打断指令的下一条再下一条指令的地址,所以我们需要人为进行修正一下
	sub LR,LR,#4

	//因为irq模式下使用的R0-R12寄存器和user模式下的是同一组

	//所以在处理异常之前需要将USER模式下的寄存器进行压栈保护现场

	stmfd sp!,{r0-r12,LR}

	//处理异常

	bl do_irq

	//异常返回

	//1.将r0-r12寄存器中的值出栈,使其恢复到异常打断之前的值

	//2.将SPSR寄存器的值返回到CPSR,使得cpu恢复到异常前的状态

	//3.将LR寄存器的值给PC,程序返回

	ldmfd sp!,{r0-r12,PC}^
c 复制代码
#include "exynos_4412.h"

//异常处理程序

void  do_irq(void)

{

	unsigned int Irqnum=0;

	//从中断控制器中获取当前中断的中断号,只取后10位

	Irqnum=CPU0.ICCIAR & (0X3FF);

	switch(Irqnum)

	{

	case 0:

		//0号中断处理程序//

		break;

	//...//

	case 57:

		printf("key pressed\n");

		//清楚gpio控制器的中断挂起位

		EXT_INT41_PEND=(1<<1);

		//将当前的中断号写回到中断控制器,以这种方式来告知中断控制器CPU当前的中断已经处理完成,可以发送其他中断

		CPU0.ICCEOIR=CPU0.ICCEOIR & (~(0X3FF)) | (57);

		break;

	//...//

	case 159:

		//159处理中断程序//

		break;

	default:

		break;
}
}

void delay(unsigned int time)

{

	while(time--);

}

int main()

{

	//外设层次---外部设备能产生一个中断信号并且发送给中断控制器

	//将GPX1_1设置为中断功能//

	GPX1.CON=GPX1.CON | (0xF << 4);



	//设置GPX_1中断触发模式---下降沿触发//

	EXT_INT41_CON=EXT_INT41_CON & (~(0x7<<4)) |(0x2<<4);


	//使能GPX1_1---开启中断模式//

	EXT_INT41_MASK=EXT_INT41_MASK & (~(1<<1));

	
	//中断控制器层次---让中断控制器接收外设发来的中断信号并且进行管理,然后转发给合适的CPU进行处理

	//全局使能中断控制器使其能够接受外部设备产生的中断信号并且转发给CPU

	ICDDCR=ICDDCR | 1;

	//在中断控制器中使能57号中断,使中断控制器把57号中断转发给CPU接口	

	
	ICDISER.ICDISER1=ICDISER.ICDISER1 | (1<<25);

	//将57号中断选择CPU0处理

	ICDIPTR.ICDIPTR14=ICDIPTR.ICDIPTR14 & (~(0XFF<<8)) | (0X01<<8);

	//将中断控制器和CPU0之间的接口使能,使得中断控制器转发的信号能够到达CPU0

	CPU0.ICCICR=CPU0.ICCICR | 1;

		GPX2.CON=GPX2.CON&(~(0XF<<28))|(0X1<<28);

while(1)

	{	

		//点亮LED2//

		GPX2.DAT=GPX2.DAT|(1<<7);
		//delay//
		delay(1000000);
		//熄灭LED2//
		GPX2.DAT=GPX2.DAT&(~(1<<7));
		//DELAY//
		delay(1000000);
	}
	return 0;
}

作业:通过使用中断的方式检测Key3按键的状态,实现按一次按键,LED2点亮,再次按下,LED2熄灭。

c 复制代码
#include "exynos_4412.h"

int flag=0;

//异常处理程序

void  do_irq(void)

{

	unsigned int Irqnum=0;

	//从中断控制器中获取当前中断的中断号,只取后10位

	Irqnum=CPU0.ICCIAR & (0X3FF);

	switch(Irqnum)

	{

	case 0:

		//0号中断处理程序//

		break;

	//...//

	case 57:

		printf("key pressed\n");

		//清楚gpio控制器的中断挂起位

		EXT_INT41_PEND=(1<<1);

		//将当前的中断号写回到中断控制器,以这种方式来告知中断控制器CPU当前的中断已经处理完成,可以发送其他中断

		CPU0.ICCEOIR=CPU0.ICCEOIR & (~(0X3FF)) | (58);

		break;

	//...//

	case 58:

		flag=~flag;

		

		EXT_INT41_PEND=(1<<2);

		//将当前的中断号写回到中断控制器,以这种方式来告知中断控制器CPU当前的中断已经处理完成,可以发送其他中断

		CPU0.ICCEOIR=CPU0.ICCEOIR & (~(0X3FF)) | (58);

		delay(1000);

		break;

	case 159:

		//159处理中断程序//

		break;

	default:

		break;

	

	}



}





void delay(unsigned int time)

{

	while(time--);

}







int main()

{

	//外设层次---外部设备能产生一个中断信号并且发送给中断控制器

	//将GPX1_2设置为中断功能//

	GPX1.CON=GPX1.CON | (0xF << 8);

	//设置GPX_1中断触发模式---下降沿触发//

	EXT_INT41_CON=EXT_INT41_CON & (~(0x7<<8)) |(0x2<<8);

	//使能GPX1_1---开启中断模式//

	EXT_INT41_MASK=EXT_INT41_MASK & (~(1<<2));
	//中断控制器层次---让中断控制器接收外设发来的中断信号并且进行管理,然后转发给合适的CPU进行处理
	//全局使能中断控制器使其能够接受外部设备产生的中断信号并且转发给CPU
	ICDDCR=ICDDCR | 1;
	//在中断控制器中使能58号中断,使中断控制器把58号中断转发给CPU接口	
	ICDISER.ICDISER1=ICDISER.ICDISER1 | (1<<26);
	//将58号中断选择CPU0处理
	ICDIPTR.ICDIPTR14=ICDIPTR.ICDIPTR14 & (~(0XFF<<16)) | (0X01<<16);
	//将中断控制器和CPU0之间的接口使能,使得中断控制器转发的信号能够到达CPU0
	CPU0.ICCICR=CPU0.ICCICR | 1;
		GPX2.CON=GPX2.CON&(~(0XF<<28))|(0X1<<28);
while(1)
	{	
		//点亮LED2//
	//	GPX2.DAT=GPX2.DAT|(1<<7);
		//delay//
	//	delay(1000000);
		//熄灭LED2//
	//	GPX2.DAT=GPX2.DAT&(~(1<<7));
		//DELAY//
	//	delay(1000000);
 	if(flag)
			GPX2.DAT=GPX2.DAT|(1<<7);
		else
			GPX2.DAT=GPX2.DAT&(~(1<<7));

	}
	return 0;

}
相关推荐
日更嵌入式的打工仔11 分钟前
(实用向)中断服务程序(ISR)的优化方向
笔记·单片机
离离茶21 分钟前
【笔记1-11】Qt 关闭QToolbar的拓展菜单
开发语言·笔记·qt
想放学的刺客1 小时前
单片机嵌入式试题(第25)嵌入式系统可靠性设计与外设驱动异常处理
stm32·单片机·嵌入式硬件·mcu·物联网
wotaifuzao1 小时前
STM32+FreeRTOS 长期可维护架构设计(事件驱动篇)-- 告别“屎山”代码
c语言·stm32·嵌入式硬件·freertos·状态机·事件驱动·嵌入式架构
淘晶驰AK1 小时前
大学如何自学嵌入式开发?
单片机·嵌入式硬件
yantaohk1 小时前
【2025亲测】中兴B860AV3.2M完美刷机包ATV版本安卓9-解决1G运存BUG,开ADB已ROOT
android·嵌入式硬件·adb·云计算
了一梨1 小时前
SQLite3学习笔记6:UPDATE(改)+ DELETE(删)数据(C API)
笔记·学习·sqlite
霸王蟹1 小时前
Uni-app 跨端开发框架Unibest快速体验
前端·笔记·微信·uni-app·unibest
一路往蓝-Anbo2 小时前
第 1 篇:对象池模式 (Object Pool) —— 裸机下的动态内存革命
jvm·数据库·stm32·单片机·嵌入式硬件·网络协议·tcp/ip
飞凌嵌入式2 小时前
1块集成了4核Cortex-A7高性能CPU、1颗RISC-V MCU、多种高速总线、还兼容树莓派的T153低成本开发板
linux·arm开发·嵌入式硬件·risc-v