Zynq学习笔记--了解中断配置方式

news2024/10/6 22:26:38

目录

1. 简介

2. 工程与代码解析

2.1 Vivado 工程

2.2 Vitis 裸机代码

2.3 关键代码解析

3. 总结


1. 简介

Zynq 中的中断可以分为以下几种类型:

软件中断(Software Generated Interrupt, SGI):由软件触发,通常用于CPU之间的通信。
私有外设中断(Private Peripheral Interrupt, PPI):与每个CPU相关的中断,如定时器和看门狗。
共享外设中断(Shared Peripheral Interrupt, SPI):由多个设备共享,可以被路由到任何一个CPU。

中断控制器(GIC)是Zynq中管理中断的核心组件,负责中断的使能、屏蔽、优先级设置以及将中断信号发送到CPU1。

本文展示是一个中断处理示例,记录如何在PS(处理系统)和PL(可编程逻辑)之间使用GPIO(通用输入输出)和中断。

2. 工程与代码解析

2.1 Vivado 工程

系统中断由多个系统元素生成,并通过GIC代理(GICPx_IRQ 寄存器)广播到GICs、PMU以及PL中的输出信号。

我们重点关注PL中的输出信号:

 UG1085: System Interrupts

Datasheet 中的描述的两组中断寄存器,对于到 Zynq 配置页面示意图如下:

如果查看 "xparameters.h" 文件,可以看到 IRQ 对应的中断号:

//AXI GPIO 中断号 121

#define AXI_GPIO_INTERRUPT_ID  XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR

 

2.2 Vitis 裸机代码

代码的主要功能包括:

  • 初始化:配置PS端和PL端的GPIO设备,包括设置方向和输出使能。
  • 中断系统设置:初始化GIC(通用中断控制器),注册中断处理函数,并设置中断优先级和触发类型。
  • 中断处理:定义了一个中断处理函数IntrHandler,当检测到AXI GPIO中断时,会打印一条消息。
#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "xgpio.h"
#include "sleep.h"
#include "xil_exception.h"
#include "xscugic.h"

#define GPIO_DEVICE_ID		XPAR_XGPIOPS_0_DEVICE_ID
#define INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID
#define AXI_GPIO_DEVICE_ID	XPAR_GPIO_0_DEVICE_ID

//AXI GPIO 中断号 121
#define AXI_GPIO_INTERRUPT_ID	XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR
//AXI GPIO 通道
#define GPIO_CHANNEL1		1

#define MIO7_LED			7
#define MIO36_KEY			36

static void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpio *AXI_Gpio,
				u16 AXI_GpioIntrId);
static void IntrHandler();

XGpioPs Gpio; /* The driver instance for GPIO Device. */
XScuGic Intc; /* The Instance of the Interrupt Controller Driver */
XGpio AXI_Gpio; /* The Instance of the GPIO Driver */

static XGpioPs_Config *ConfigPtr;
static XScuGic_Config *IntcConfig; /* Instance of the interrupt controller */

int main() {

	u32 keyval;

	printf("AXI GPIO INTERRUPT TEST!\n\r");

	//由 ID 查找 PS 端器件,并初始化
	ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
	XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
	//PS 端  GPIO 方向设置, 0 - Input, 1 - Output
	XGpioPs_SetDirectionPin(&Gpio, MIO7_LED, 1);
	XGpioPs_SetDirectionPin(&Gpio, MIO36_KEY, 0);
	//PS 端设置输出使能,0 - Disable, 1 - Enable
	XGpioPs_SetOutputEnablePin(&Gpio, MIO7_LED, 1);

	//由 ID 查找 PL 端器件,并初始化
	XGpio_Initialize(&AXI_Gpio, AXI_GPIO_DEVICE_ID);
	//PL 端 GPIO 方向设置, 0 - Output, 1 - Input
	XGpio_SetDataDirection(&AXI_Gpio, GPIO_CHANNEL1, 0x00000001);

	//设置中断系统
	SetupInterruptSystem(&Intc, &AXI_Gpio, AXI_GPIO_INTERRUPT_ID);

	while(1){
		keyval = XGpioPs_ReadPin(&Gpio, MIO36_KEY);
		XGpioPs_WritePin(&Gpio, MIO7_LED, ~keyval);
	}

	return 0;
}

static void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpio *AXI_Gpio,
				u16 AXI_GpioIntrId)
{
	//根据GIC器件ID,查找器件的配置信息,并初始化
	IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
	XScuGic_CfgInitialize(GicInstancePtr, IntcConfig, IntcConfig->CpuBaseAddress);

	//初始化ARM处理器异常句柄
	Xil_ExceptionInit();
	//注册IRQ异常处理程序
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
				(Xil_ExceptionHandler)XScuGic_InterruptHandler,
				GicInstancePtr);
	//使能处理器中断
	Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);

	//关联中断处理函数
	XScuGic_Connect(GicInstancePtr, AXI_GpioIntrId,
				(Xil_ExceptionHandler)IntrHandler,
				(void *)AXI_Gpio);
	//使能GIC器件中断
	XScuGic_Enable(GicInstancePtr, AXI_GpioIntrId);

	//0xA0:中断源的优先级, 0x01:中断类型为高电平有效,电平敏感类型
	XScuGic_SetPriorityTriggerType(GicInstancePtr, AXI_GpioIntrId, 0xA0, 0x01);

	//全局中断使能
	XGpio_InterruptGlobalEnable(AXI_Gpio);
	//通道中的信号对应的中断使能
	XGpio_InterruptEnable(AXI_Gpio, 0x00000001);
}

void IntrHandler() {
	if (XGpio_DiscreteRead(&AXI_Gpio, GPIO_CHANNEL1) == 0x00000000){
		printf("AXI interrupt detected!\n\r");
	}
	XGpio_InterruptClear(&AXI_Gpio, 0x00000001);
}

2.3 关键代码解析

为了直观地理解代码的结构和功能,参照图片进行理解:

  • 步骤划分和流程图:图片将代码分为几个关键步骤,并以流程图形式展示每个步骤的调用顺序和逻辑关系,帮助读者更好地理解代码的整体流程和各个部分之间的关系。
  • 关键代码高亮:图片中标注了关键代码行,例如初始化、GPIO方向设置和中断处理,帮助读者快速定位和理解代码中的重要部分。
  • 代码与注释结合:图片将代码与相应的注释结合展示,详细解释了每一行代码的作用和意义,帮助读者更深入地理解代码的实现细节。

3. 总结

在本文中,我们探讨了Zynq平台上中断的概念和分类,包括软件中断、私有外设中断和共享外设中断。我们还介绍了中断控制器(GIC)的作用,它是中断管理的核心。通过一个实际的示例,我们展示了如何在处理系统(PS)和可编程逻辑(PL)之间使用通用输入输出(GPIO)来处理中断。示例代码包括初始化GPIO设备、设置中断系统和定义中断处理函数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CTF-pwn-虚拟化-【d3ctf-2021-d3dev】

文章目录 参考流程附件检查启动信息逆向分析漏洞查看设备配置信息exp 参考 https://x1ng.top/2021/11/26/qemu-pwn/ https://bbs.kanxue.com/thread-275216.htm#msg_header_h1_0 https://xz.aliyun.com/t/6562?time__1311n4%2BxnD0DRDBAi%3DGkDgiDlhjmYh2xuCllx7whD&alic…

[Linux] Shell

chsh不是一种sh,而是一个命令行使用程序,用于更改默认shell CentOS是个开源软件,没有sh,sh是商业版的, 按ls /bin/*sh显示的sh实际上是个链接文件,连接的bash 在命令行输入新的sh名,会启动一个新的进程, 输…

计算机网络知识点汇总

计算机网络知识点汇总 第1章计算机网络体系结构 1.1 计算机网络概述 1.1.1 计算机网络的概念 ​ 计算机网络是由若干个结点(node)和连接这些结点的链路(link)组成。网络中的结点可以是就三级、集线器、交换机、或者路由器等,网络之间通过路由器进行互联&#xf…

【Java】已解决java.sql.SQLException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.sql.SQLException异常 在Java中,java.sql.SQLException是一个通用的异常类,用于表示在数据库操作中发生的错误。无论是类型错误、数据类型不匹配…

IF=9.3!MIMIC-IV数据库发文,手到擒来!| MIMIC-IV数据库周报(6.5~6.11)

重症医学数据库(MIMIC)是由计算生理学实验室开发的公开数据集,其中包括与数千个重症监护病房入院相关的去识别化健康数据,致力于推动临床信息学、流行病学和机器学习的研究。 MIMIC数据库于2003年在美国国立卫生研究院的资助下&am…

Springboot开发Webservice服务端和客户端

环境说明 Java JDK 1.8、Spring boot 2.1.6、Apache CXF 3.1.6 POM依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.1.6</version&…

MySQL limit子句用法及优化(Limit Clause Optimization)

在MySQL中&#xff0c;如果只想获取select查询结果的一部分&#xff0c;可以使用limit子句来限制返回记录的数量&#xff0c;limit在获取到满足条件的数据量时即会立刻终止SQL的执行。相比于返回所有数据然后丢弃一部分&#xff0c;执行效率会更高。 文章目录 一、limit子句用…

嵌入式Linux:Linux系统中文件类型

目录 1、普通文件 2、目录文件 3、字符设备文件 4、块设备文件 5、符号链接文件 6、套接字文件 7、管道文件 8、stat命令和ls命令 8.1、stat命令 8.2、ls命令 9、stat、fstat、lstat函数 9.1、stat函数 9.2、fstat函数 9.3、lstat函数 在Windows系统中&#xff0…

【JS重点18】原型链(面试重点)

一&#xff1a;原型链底层原理 以下面一段代码为例&#xff0c;基于原型对象&#xff08;Star构造函数的原型对象&#xff09;的继承使得不同构造函数的原型对象关联在一起&#xff08;此处是最大的构造函数Object原型对象&#xff09;&#xff0c;并且这种关联的关系是一种链…

Java 集合框架:Vector、Stack 的介绍、使用、原理与源码解析

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 015 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

哈喽GPT-4o——对GPT-4o 编程的思考与看法

GPT-4o&#xff08;“o”代表“全能”&#xff09;它可以接受任意组合的文本、音频和图像作为输入&#xff0c;并生成任意组合的文本、音频和图像输出。 &#x1f449; GPT功能&#xff1a; GPT-4o知识问答&#xff1a;支持1000token上下文记忆功能最强代码大模型Code Copilo…

多线程(总结黑马程序员)

一、什么是线程&#xff1f; 是一个程序内部的一条执行流程 多线程是什么&#xff1f; 多条线程由CPU负责调度执行 多线程的创建方式一&#xff1a;继承Thread类 //1.继承Thread类 public class MyThread extends Thread {//2.必须重写run方法Overridepublic void run() {…

AI 音乐大模型:创新的曙光还是创意产业的阴影?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

课程品牌推广与传播秘籍:让你的课程火爆全网!

如今在线教育平台的竞争愈发激烈&#xff0c;如何让你的课程在茫茫网海中脱颖而出&#xff0c;吸引更多学员的关注和报名&#xff1f; 作为一名手工酸奶品牌的创始人&#xff0c;目前全国复制了100多家门店&#xff0c;很多都是线上授课。而且我自己还有一家传媒公司&#xff…

【C++题解】1670 - 象棋大赛

问题&#xff1a;1670 - 象棋大赛 类型&#xff1a;分支问题 题目描述&#xff1a; 市里要组织象棋大赛&#xff0c;年龄在 8∼30 周岁之间的选手可以报名参赛。为了公平起见&#xff0c;大赛组委会将选手们分了青年组、少年组和儿童组&#xff0c;大赛组委会规定&#xff1a…

heygen的前世今生

heygen 关于徐卓&梁望国内创业&诗云科技成立heygen为什么原班人马在国内做和国外做产品&#xff0c;造成的结果如此迥异&#xff1f;技术原理 关于徐卓&梁望 徐卓本科毕业于同济大学&#xff0c;硕士毕业于卡内基梅隆大学计算机专业&#xff0c;之后在 Snap 工作了…

ITSS案例分享 — 强化网络安全保障水平

某科技有限公司成立于2001年&#xff0c;是中国网络安全产业领跑者&#xff0c;于2000年发力安全业务&#xff0c;在云安全、身份安全、终端安全、态势感知、高级威胁治理&#xff0c;以及威胁情报领域等拥有多项全球领先技术&#xff0c;在核心技术领域持续领跑&#xff1b;同…

【每日刷题】Day70

【每日刷题】Day70 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 922. 按奇偶排序数组 II - 力扣&#xff08;LeetCode&#xff09; 2. 905. 按奇偶排序数组 - 力扣&…

【会议征稿,CPS出版】第四届管理科学和软件工程国际学术会议(ICMSSE 2024,7月19-21)

第四届管理科学和软件工程国际学术会议(ICMSSE 2024)由ACM珠海分会&#xff0c;广州番禺职业技术学院主办&#xff1b;全国区块链行业产教融合共同体&#xff0c;AEIC学术交流中心承办&#xff0c;将于2024年7月19-21日于广州召开。 会议旨在为从事管理与软件工程领域的专家学…

瑞尼克RNK聚四氟乙烯注射器刻度清晰纯净

四氟注射器用于抽取或者注入气体或者液体&#xff0c;四氟注射器由前端带有小孔的针筒以及与之匹配的活塞芯杆组成&#xff0c;用来将少量的液体或其注入到其它方法无法接近的区域或者从那些地方抽出&#xff0c;在芯杆拔出的时候液体或者气体从针筒前端小孔吸入&#xff0c;在…