【LV12 DAY17-18 中断处理】

在这里插入图片描述
q
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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}^
#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熄灭。

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

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/320213.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【DC系列教程2--Timing and Area Constrains】

DC系列教程2--Timing and Area Constrains Lab Flow:依赖输入Design SpecificationLab Demo Goal: determin the unit of time in the target library; //设置时间精度Create a Design Compiler timing and area constrains file based on a provided schematic and specifacat…

动态内存管理4大函数的进阶

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

std::atomic<int>的原理

⚠️WARNING⚠️ 注意&#xff1a; 试验平台是CentOS7&#xff0c;x86_64&#xff0c;Intel Xeon CPU 不同平台原理大不相同&#xff01; [mzhaiinclude]$ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 1 On-line CPU(s) lis…

66.网游逆向分析与插件开发-角色数据的获取-角色类的数据分析与C++还原

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;65.网游逆向分析与插件开发-角色数据的获取-项目需求与需求拆解-CSDN博客 ReClass.NET工具下载&#xff0c;它下方链接里的 逆向工具.zip 里的reclass目录下&#xff1a;注意它分x64、x32版本&#x…

HarmonyOS-LocalStorage:页面级UI状态存储

管理应用拥有的状态概述 上一个章节中介绍的装饰器仅能在页面内&#xff0c;即一个组件树上共享状态变量。如果开发者要实现应用级的&#xff0c;或者多个页面的状态数据共享&#xff0c;就需要用到应用级别的状态管理的概念。ArkTS根据不同特性&#xff0c;提供了多种应用状态…

EasyExcel简单实例

EasyExcel简单实例 准备工作场景一&#xff1a;读取 Student 表需求1&#xff1a;简单读取需求2&#xff1a;读取到异常信息时不中断需求3&#xff1a;读取所有的sheet工作表需求4&#xff1a;读取指定的sheet工作表需求5&#xff1a;从指定的行开始读取 场景二&#xff1a;写入…

YOLOv8 Ultralytics:使用Ultralytics框架进行MobileSAM图像分割

YOLOv8 Ultralytics&#xff1a;使用Ultralytics框架进行MobileSAM图像分割 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行MobileSAM图像分割参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩…

【云原生】springboot 整合 OpenTelemetry

目录 一、前言 二、应用可观测性概述 2.1 什么是可观测性 2.2 可观测性三大指标 2.2.1 指标&#xff08;Metrics&#xff09; 2.2.2 日志&#xff08;log&#xff09; 2.2.3 追踪(Traces) 三、OpenTelemetry 介绍 3.1 什么是OpenTelemetry 3.2 OpenTelemetry架构和组件…

SMART PLC绝对值定位往复运动控制(脉冲绝对定位+状态机编程)

三菱FX3GA系列绝对定位指令DDRVA实现往复运动控制详细内容介绍请参考下面文章链接&#xff1a; https://rxxw-control.blog.csdn.net/article/details/135570157https://rxxw-control.blog.csdn.net/article/details/135570157这篇博客我们介绍SMART PLC里如何开启绝对值定位指…

隧道自动化监测系统的主要产品和监测内容

一、背景 随着交通行业的不断发展&#xff0c;隧道作为交通基础设施的重要组成部分&#xff0c;其安全和稳定性对于保障人们的生命财产安全具有重要意义。隧道自动化监测系统作为一种先进的安全监测手段&#xff0c;能够实时监测隧道内部的各项参数&#xff0c;为隧道的安全运…

CentOS 7.6的HTTP隧道代理如何支持移动设备和远程用户

在CentOS 7.6上配置HTTP隧道代理以支持移动设备和远程用户&#xff0c;需要考虑到移动网络的特点以及远程用户的需求。以下是一些关键步骤和策略&#xff0c;可以帮助你实现这一目标。 1. 优化移动设备体验 压缩数据&#xff1a;HTTP隧道代理可以用于压缩进出移动网络的数据&…

Fluent 动网格应用:2.5D 网格重构

1 概述 2.5D 网格重构是一种快速网格重构方法&#xff0c;主要应用于涡旋压缩机等存在复杂平面运动且无法简化为二维计算的问题。 涡旋压缩机工作原理&#xff08;视频源&#xff1a;维基百科&#xff09; 适用于 2.5D 动网格的问题特点&#xff1a; 计算域几何形状为柱体类形…

(菜鸟自学)搭建虚拟渗透实验室——安装Windows 7 靶机

安装Windows 7 靶机 新建一台虚拟机&#xff0c;并选择Windows 7系统 虚拟机基本配置如下 为虚拟机挂载Windows7的镜像 点击开启虚拟机&#xff0c;将进入安装程序&#xff0c;按如下步骤进行操作&#xff1a; 点击“下一步”》勾选“我接受许可条款”&#xff0c;点击“下…

【读书笔记】《重构_改善既有代码的设计》重构的方法论

重构的方法论 标题&#xff1a;【读书笔记】【读书笔记】《重构_改善既有代码的设计》重构的方法论 时间&#xff1a;2024.01.14 作者&#xff1a;耿鬼不会笑 重构是什么? 什么是重构&#xff1a; “重构”这个词既可以用作名词也可以用作动词。 重构&#xff08;名词&…

八. 实战:CUDA-BEVFusion部署分析-导出带有spconv的SCN网络的onnx

目录 前言0. 简述1. 使用spconv进行SCN的推理测试2. 导出onnx3. 补充-装饰器钩子函数总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第八章——实战&#x…

如何简单的使用文心一言(高级版)(中国版ChatGPT)

文心一言API高级版使用 一、百度文心一言API(高级版)二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例5、智能生成API代码 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API(高级版) 基于百度文心一言语言大模型的…

寄快递有没有什么省钱的小妙招? 怎样寄快递才能省钱呢?

快递物流行业的快速崛起刺激了人们的消费欲望&#xff0c;其中典型的是每每到重大节日尤其是双十一或者双十二&#xff0c;消费市场异常火爆&#xff0c;这也使得快递行业加班加点的干也不追不上人们下单的速度。如今&#xff0c;互联网时代崛起&#xff0c;网购成为了大家最寻…

数据库与SQL

数据库与SQL 学习链接数据库关系型数据库管理系统&#xff08;RDBMS&#xff09; SQLSQL介绍SQL类型SQL 基础语言学习创建表&#xff08;create table&#xff09;语法 数据类型SQL最常用的数据类型 学习链接 基础篇&#xff1a;数据库 SQL 入门教程 数据库 用于存储数据 存放…

2024年《一个项目征服Java中高级体系》博客计划

终于下决心来写一套大型的Java 笔记&#xff0c;不为别的&#xff0c;就是为了强迫自己将整个Java体系梳理清楚&#xff0c;让自己成为内功扎实的Java高级架构师。牛已经吹出来了&#xff0c;不做对不起网友&#xff01; 经过一个多月的持续规划&#xff0c;现在终于定好了整体…

Repo命令与git的关系

Repo命令与git的关系是很密切的。 我们都知道&#xff0c;git是一个开源的版本控制系统&#xff0c;常用在大型项目的管理上。 我们对repo的使用和了解就比较少了。Repo是一个基于Git构建出来的工具&#xff0c;它的出现不是为了取代Git&#xff0c;而是为了更方便开发者使用Gi…