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

目录

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设备、设置中断系统和定义中断处理函数。

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

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

相关文章

Python学习笔记15:进阶篇(四)文件的读写。

文件操作 学习编程操作中,我觉得文件操作是必不可少的一部分。不管是读书的时候学习的c,c,工作的前学的java,现在学的Python,没学过的php和go,都有文件操作的模块以及库的支持,重要性毫无疑问。…

【因果推断python】45_估计量1

目录 问题设置 目标转换 到目前为止,我们已经了解了如何在干预不是随机分配的情况下对我们的数据进行纠偏,这会导致混淆偏差。这有助于我们解决因果推理中的识别问题。换句话说,一旦单位是可交换的,或者 ,就可以学习…

AI绘画ComfyUI-插件-面部修复,快速入门安装使用!

这期给大家分享一个插件AI绘画 ComfyUI的——Impact Pack ComfyUI也是隶属于Stable Diffusion的工作流形式的AI绘画工具。 这是一个综合节点,这期先介绍下这个插件中的面部修复功能 Impact Pack插件 1、下载插件 在ComfyUI管理器中安装节点,搜索Imp…

[信号与系统]傅里叶变换、卷积定理、和为什么时域的卷积等于频域相乘。

前言 最近学习以下IIR滤波器和FIR滤波器 前置 1. 时域和频域 时域和频域代表着频率和时间与振幅的一一对应关系 2. 卷积运算 关于卷积的定义,详情请看 这篇文章能让你明白卷积 卷积运算是一种数学运算,广泛应用于信号处理、图像处理、控制系统和概…

Unity和UE免费领恐怖书本头怪兽角色模型恐怖或奇幻游戏monster适合FPS类型PBR202406202143

Unity和UE免费领恐怖书本头怪兽角色模型恐怖或奇幻游戏monster适合FPS类型PBR202406202143 Unity恐怖书本头怪兽角色模型:https://prf.hn/l/zpBqgVl UE恐怖书本头怪兽角色模型:https://prf.hn/l/4PzY1Qy 作者其他资产:https://prf.hn/l/0…

RX8025/INS5T8025实时时钟-国产兼容RS4TC8025

该模块是一个符合I2C总线接口的实时时钟,包括一个32.768 kHz的DTCXO。 除了提供日历(年、月、日、日、时、分、秒)功能和时钟计数器功能外,该模块还提供了大量其他功能,包括报警功能、唤醒定时器功能、时间更新中断功能…

深入理解和实现Windows进程间通信(管道)

进程间通信(IPC,Inter-Process Communication)是指在不同进程之间的数据传输。进程是操作系统分配资源和调度的独立单位,每个进程都有自己独立的地址空间,一个进程无法直接访问另一个进程的数据。因此,当需…

深度解析RocketMq源码-持久化组件(四) CommitLog

1.绪论 commitLog是rocketmq存储的核心,前面我们介绍了mappedfile、mappedfilequeue、刷盘策略,其实commitlog的核心组件我们基本上已经介绍完成。 2.commitLog的组成 commitLog的核心其实就是MqppedFilequeue,它本质上就是多个mappedFile…

SCI一区TOP|局部强化优化算法(PRO)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年,A Taheri受到部分强化效应(PRE)理论启发,提出了局部强化优化算法(Partial Reinforcement Optimizer, PRO)。 2.算法原理 2.1算法思…

Python数据科学 | 是时候跟Conda说再见了

本文来源公众号“Python数据科学”,仅用于学术分享,侵权删,干货满满。 原文链接:是时候跟Conda说再见了 1 简介 conda作为Python数据科学领域的常用软件,是对Python环境及相关依赖进行管理的经典工具,通…

【漏洞复现】红帆iOffice.net wssRtSyn接口处存在SQL注入

【产品&&漏洞简述】 红帆iOffice.net从最早满足医院行政办公需求(传统OA),到目前融合了卫生主管部门的管理规范和众多行业特色应用,是目前唯一定位于解决医院综合业务管理的软件,是最符合医院行业特点的医院综…

SVN学习(001 svn安装)

尚硅谷SVN高级教程(svn操作详解) 总时长 4:53:00 共72P 此文章包含第1p-第p19的内容 介绍 为什么使用版本控制工具 版本控制工具的功能 版本控制简介 客户端服务器结构 c/s结构 服务端的结构: 服务程序 、版本库(存放我们上传的文件) 客户端的三个基本操作&#…

记录一次递归查询导致的 java.lang.StackOverflowError: null

问题截图: 由于作者使用递归统计信息,刚开始这个接口运行得正常,但是上线运行一段时间后接口就出现了,如图的栈溢出错误。可以看出确实是堆栈溢出了,解决栈溢出目前只有两种方式: 第一种调大栈的大小&…

小程序开发的技术难点

小程序开发是一项技术难度较高的工作,需要开发者具备多方面的知识和技能,小程序开发的技术难点主要体现在以下几个方面。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 多端兼容 小程序需要在微信、支付宝…

Flow Matching For Generative Modeling

Flow Matching For Generative Modeling 一、基于流的(Flow based)生成模型 生成模型 我们先回顾一下所谓的生成任务,究竟是想要做什么事情。我们认为,世界上所有的图片,是符合某种分布 p d a t a ( x ) p_{data}(…

MES管理系统如何设计生产质量管理功能

在现代制造业中,MES管理系统作为连接企业计划层与车间操作层的关键桥梁,其生产者计量管理功能的设计显得尤为重要。一个完善的MES管理系统生产质量管理模块,不仅要求能够实时、准确地采集和分析生产过程中的质量数据,还需要能够与…

Unity3d 游戏暂停(timeScale=0)引起的deltaTime关联的系列问题解决

问题描述 游戏暂停的功能是通过设置timeScale0实现的,不过在暂停游戏的时候,需要对角色进行预览和设置,为了实现这个功能,是通过鼠标控制相机的操作,为了使相机的操作丝滑,获取鼠标操作系数乘以Time.delta…

如何在React中使用CSS模块,并解释为什么使用它们比传统CSS更有益?

在React中使用CSS模块是一种将CSS类名局部化到单个组件的方法,从而避免了全局作用域中的类名冲突。CSS模块允许你为组件编写样式,并确保这些样式只应用于该组件,而不会影响到其他组件。 以下是在React中使用CSS模块的步骤: 安装C…

Excel 识别数据层次后转换成表格

某列数据可分为 3 层,第 1 层是字符串,第 2 层是日期,第 3 层是时间: A1NAME122024-06-03304:06:12404:09:23508:09:23612:09:23717:02:2382024-06-02904:06:121004:09:231108:09:2312NAME2132024-06-031404:06:121504:09:231620…

FreeBSD在zfs挂接第二块ssd 硬盘

为FreeBSD机器新增加了一块ssd硬盘:骑尘 256G 先格式化分区硬盘 进入bsdconfig 选Disk Management 选择ada1 ,也就是新增加的硬盘 选择auto 然后选择Entire Disk 提示信息 The existing partition scheme on this disk (MBR) │ …