【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;

}
相关推荐
小码的头发丝、12 分钟前
Java进阶学习笔记|面向对象
java·笔记·学习
Purple Coder1 小时前
第6章 图论
笔记
NEWEVA__zzera222 小时前
利用光耦来隔离485芯片与串口引脚,实现自动收发485电路
单片机·嵌入式硬件
m0_748240542 小时前
STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)
stm32·单片机·嵌入式硬件
胡西风_foxww2 小时前
【ES6复习笔记】数值扩展(16)
前端·笔记·es6·扩展·数值
温柔的男孩像海洋丶2 小时前
vscode的keil assistant 中搜索不到全局变量
ide·vscode·单片机
沐欣工作室_lvyiyi3 小时前
基于单片机的多功能智能小车(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·单片机毕业设计
Somnus陳3 小时前
软考架构师笔记-计算机系统组成-1
笔记·系统架构
鸿喵小仙女3 小时前
C# WPF读写STM32/GD32单片机Flash数据
stm32·单片机·c#·wpf
lucy153027510794 小时前
MCU 功耗基准测试
科技·单片机·嵌入式硬件·智能家居·信号处理·工控主板