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			36static 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 - OutputXGpioPs_SetDirectionPin(&Gpio, MIO7_LED, 1);XGpioPs_SetDirectionPin(&Gpio, MIO36_KEY, 0);//PS 端设置输出使能,0 - Disable, 1 - EnableXGpioPs_SetOutputEnablePin(&Gpio, MIO7_LED, 1);//由 ID 查找 PL 端器件,并初始化XGpio_Initialize(&AXI_Gpio, AXI_GPIO_DEVICE_ID);//PL 端 GPIO 方向设置, 0 - Output, 1 - InputXGpio_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.mzph.cn/diannao/31155.shtml

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

相关文章

NXP RT1060学习总结 - fsl_flexcan CAN FD 函数说明 -2

概要 CAN测试源码: https://download.csdn.net/download/qq_35671135/89425377 根据fsl_flexcan.h文件从文件末尾往前面梳理,总共CAN FD处理函数; 使用的是RT1064开发板进行测试。 11、设置FlexCAN FD帧的比特率 函 数 :statu…

C++数据格式化6 - uint转换成二六进制字符串

1. 关键词2. strfmt.h3. strfmt.cpp4. 测试代码5. 运行结果6. 源码地址 1. 关键词 C 数据格式化 字符串处理 std::string int bin 跨平台 2. strfmt.h #pragma once#include <string> #include <cstdint> #include <sstream> #include <iomanip>na…

游戏心理学Day20

扩展的8种玩家 完成主义者 此类玩家关心的是成就和进展&#xff0c;其主要目的是完成游戏的主要目标&#xff0c;其次是完成游戏的次要目标之后才是游戏中的其他内容&#xff0c;在多人游戏中完成主义者会致力于炫耀自己的状态和财富。如果游戏以胜负为目标&#xff0c;那么此…

Day 46 Redis缓存集群

Redis缓存集群 redis缓存服务 缓存数据库 缓存 ​ 读取数据 cpu ​ L1 L2 L3 L4 ​ 一级缓存 二级缓存 ​ cs context switch 上下文交换 free -m ​ buffer cache mysql服务器 ​ 缓存 表缓存 数据缓存 nginx ​ expire 1d ​ 304响应码 ​ 200 ​ 301 ​ 30…

RS485中继器的作用你还不知道?

RS485是一种串行通信协议&#xff0c;支持设备间长距离通信。RS485中继器则像“传声筒”&#xff0c;能放大衰减信号&#xff0c;延长通信距离&#xff0c;隔离噪声&#xff0c;扩展分支。在实际场景中&#xff0c;如工厂内&#xff0c;通过中继器可确保控制室与远距离机器间通…

嵌入式实验---实验三 定时器实验

一、实验目的 1、掌握STM32F103定时器程序设计流程&#xff1b; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、使用SysTick定时方式控制LED闪烁&#xff1b; 2、使用通用定时器产生PWM脉冲&#xff0c;通过调整占空比实现两个目标&#xff1a; &#xff08;1&#xf…

前端导出excel xlsx 代码复制即用

确保安装了最新版本的 xlsx 库&#xff1a; npm install xlsx 2.在需要使用的文件中进行命名导入&#xff08;Named Import&#xff09;&#xff1a; import { utils, writeFile } from xlsx; 3.使用 utils 和 writeFile 替代默认导入的 XLSX 对象&#xff1a; const data [[…

RPM命令和YUM命令

目录 一、RPM软件包 1.1、RPM概述 1.2、查询已安装的rpm软件信息 1.3、查询未安装的 RPM 软件包文件中信息 1.4、安装、升级、卸载 RPM 软件包 二、YUM常规命令 三、手动配置Apache&#xff08;http&#xff09;服务 3.1、前提条件 3.2、开始配置 3.3、开启验证服务 …

迁移Docker容器

将 Docker 容器从一台服务器迁移到另一台服务器&#xff0c;主要包括以下步骤&#xff1a;保存容器的镜像&#xff0c;导出数据卷&#xff0c;传输文件到新服务器&#xff0c;然后在新服务器上重新运行容器。以下是具体的步骤和相应的命令&#xff1a; 1. 保存容器的镜像 首先…

GitHub爆赞!终于有大佬把《Python学习手册》学习笔记分享出来了

这份笔记的目标是为了给出一份比较精炼&#xff0c;但是又要浅显易懂的Python教程。《Python学习手册》中文第四版虽然比较简单&#xff0c;但是措辞比较罗嗦&#xff0c;而且一个语法点往往散落在多个章节&#xff0c;不方便读者总结。 我在做笔记时&#xff0c;将一个知识点…

PFC 离散元数值模拟仿真技术与应用

近几年&#xff0c;随着计算能力的提高和算法的优化&#xff0c;离散元仿真技术得到了快速发展&#xff0c;并在学术界产生了大量研究成果。在 PFC 离散元计算中无需给定材料的宏观本构关系和对应的参数&#xff0c;这些传统的参数和力学特性在程序中可以自动得到。据调查&…

深入了解常用负载均衡软件

在构建高性能、高可用的分布式系统时&#xff0c;负载均衡技术扮演着至关重要的角色。它通过合理分发网络请求到后端服务器集群&#xff0c;从而有效提升系统吞吐量、减少响应延迟、并保障系统的稳定运行。本文将介绍几种常用的负载均衡软件&#xff0c;包括它们的优缺点、应用…

Gartner发布2024年人工智能技术成熟度曲线:29项决定人工智能领域发展方向的前沿和趋势性技术

人工智能投资已达到新高&#xff0c;重点是生成式人工智能&#xff0c;但在大多数情况下&#xff0c;该技术尚未实现预期的商业价值。这项研究通过分析各种人工智能创新&#xff08;其中许多创新正在快速发展&#xff09;&#xff0c;帮助人工智能领导者确定其他值得投资的技术…

VScode开发ARM环境搭建

1. vscode安装 直接访问官网: Visual Studio Code - Code Editing. Redefined 2. 安装插件 2.1. 安装Embedded IDE 2.2. 安装Cortex-debug 3. 工程初始化 3.1. 导入现有工程&#xff08;推荐&#xff09; 3.2. 或可创建新的工程 3.2.1. 选择Cortex-M项目 指定项目名称&…

Qemu虚拟机在线迁移到VMware

libvirt版本&#xff1a;libvirt-10.0.0qemu版本&#xff1a;qemu-8.2.0 在生产环境中&#xff0c;大多数的场景是 vmware 虚拟机迁移到 qemu 环境&#xff0c;一般是通过关机然后导出、导入磁盘镜像来实现。 如果要将 qemu 环境虚拟机迁移到 vmware 怎么办呢&#xff1f;要求…

使用 Python 进行测试(5)测试的类型

总结 和我一起唱&#xff01; 冒烟测试&#xff0c;让你快速失败&#xff1b; 回归测试&#xff0c;不打破过去&#xff1b; 健全性检查&#xff0c;保留所拥有&#xff1b; 集成测试&#xff0c;处理副作用&#xff1b; 端到端&#xff0c;永无尽头&#xff01; 回测&#xf…

Django使用django-apscheduler实现定时任务

定时任务可以在后台定时执行指定的代码&#xff0c;避免了很多人为操作。下面是在Django项目中如何使用定时任务的具体操作流程。 我在这里使用的 django-apscheduler库来实现定时任务。 一、安装 django-apscheduler pip install django-apscheduler二、在项目的setting.py…

仿真模拟--telnet服务两种认证模式(自作)

自己做的笔记,有问题或看不懂请见解一下~ 目录 两个路由器间实现telnet服务(password认证模式) server client 两个路由器间实现telnet服务(aaa认证模式) server client 改名 tab键补齐 不会就扣问号 ? save 两个路由器间实现telnet服务…

有哪些去手写免费的软件?软件介绍

有哪些去手写免费的软件&#xff1f;在数字化时代&#xff0c;高效处理文字信息已成为学习和工作中不可或缺的一环。对于需要频繁处理手写试卷、笔记的用户来说&#xff0c;一款好的去手写软件无疑能大大提升效率。今天&#xff0c;我们就来推荐三款免费的去手写软件&#xff0…

持续总结中!2024年面试必问 20 道设计模式面试题(七)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道设计模式面试题&#xff08;六&#xff09;-CSDN博客 十三、状态模式&#xff08;State Pattern&#xff09;和策略模式&#xff08;Strategy Pattern&#xff09;有何区别&#xff1f; 状态模式&#xff0…