009-Zynq基操之如何去玩转PL向PS的中断(对新手友好,走过路过千万不要错过)

文章目录

  • 前言
  • 一、PL-PS的中断是啥?
  • 二、PL-PS端中断详细步骤
    • 1.ZYNQ核配置
    • 2.PS端中断函数配置
    • 3.需要拓展多个中断函数
  • 总结


前言

本设计跟我的ZYNQ实战合集专栏中的脉冲触发电路有关系,也正好趁这个机会讲述一下PL-PS的中断系统,如何去触发中断,使其能够做一些响应工作。本文所提及的中断只涉及到PL向PS触发的中断,并不涉及到PS端双核的中断,做这个主要目的也就是为了让大家更加熟悉这个中断系统,并且能够用到自己的实际工程项目之中去。他的应用领域主要是,比如你用脉冲驱动电机运行,当这个电机停止运动了以后,根据我所给出的脉冲触发代码,会在停止脉冲输出后反馈一个中断信号,那么通过检测这个中断信号就可以执行一些特定的功能,比如电机停止以后你需要采集图像的某些特征,这个中断信号就是你可以开始采集图像特征的起始点。


一、PL-PS的中断是啥?

直接上图,我们也不说什么较为复杂的中断理论知识,我们直接将目光移到左下方Programmable Logic模块那里,可以看到它有一根显示16的线连接到了SPI那里,这个就是PL向PS可以触发的中断,约16个,中断号分别是61-68,和84-91。一旦PL这边有触发信号产生,就能够进入PS端设置的中断函数内,在中断函数中我们执行这条中断线上对应的任务。
在这里插入图片描述
下面这张图也说明的比较详细,PL到PS总共有16个中断号,其中触发方式也说得比较清楚,高电平或者上升沿触发。之前我在文章中做的脉冲触发模块,中断信号就是拉高一段时期,因此可以对应的触发PS上的中断。
在这里插入图片描述

二、PL-PS端中断详细步骤

1.ZYNQ核配置

interrupt_one是引出来的中断信号,如果我们有多个中断信号的话,只需要调用concat的ip核,输入接多个中断信号,输出一条线接到IRQ_F2P上,编译以后就会自动拓展IRQ的位宽,不需要我们自己设计。按照我的脉冲触发代码为例,只需要把motor_exti例化到interrupt_one这个信号处即可。
在这里插入图片描述
在这里插入图片描述

2.PS端中断函数配置

首先是两个初始化函数,这种你只需要学会去配就行了。你需要做更改的就是我注释PL中断下的三行代码,status=开始那个,如果你有两个PL中断,一个中断号为61,一个中断号为62,那么只需要复制粘贴三行代码,然后把里面的0改成1即可,在define里面注释一下。

#include "math.h"
#include "stdlib.h"
#include "interrupt.h"
int initIntr()
{int status;Xil_ExceptionInit();ScuGicCfgPtr = XScuGic_LookupConfig(GIC_ID);status = XScuGic_CfgInitialize(&ScuGic,ScuGicCfgPtr,ScuGicCfgPtr->CpuBaseAddress);if(status != XST_SUCCESS){return status;}Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&ScuGic);//pl中断status = XScuGic_Connect(&ScuGic,F2P_INTR0_ID,(Xil_ExceptionHandler)f2pIntr0Handler,&ScuGic);IntcTypeSetup(&ScuGic, F2P_INTR0_ID, INT_TYPE_RISING_EDGE);XScuGic_Enable(&ScuGic, F2P_INTR0_ID);Xil_ExceptionEnable();return XST_SUCCESS;
}void IntcTypeSetup(XScuGic *InstancePtr, int intId, int intType)
{int mask;intType &= INT_TYPE_MASK;mask = XScuGic_DistReadReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4);mask &= ~(INT_TYPE_MASK << (intId%16)*2);mask |= intType << ((intId%16)*2);XScuGic_DistWriteReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4, mask);
}

对应的中断函数,这里面可以放你想要进行中断操作的函数,我这里是用来计数。

void f2pIntr0Handler(void * callbackref)
{static u8 count;count++;printf("count=%d",count);
}

h文件,需要更改的就是F2P_INTR0_ID 61,这个是对应的中断号

/** interrupt.h**  Created on: 2023年12月27日*      Author: 16799*/#ifndef SRC_INTERRUPT_H_
#define SRC_INTERRUPT_H_
#endif /* SRC_INTERRUPT_H_ *//** interrupt.h**  Created on: 2020年6月22日*      Author: hewei*/#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_
#include <stdio.h>
#include "xscugic.h"
#include "xparameters.h"
#include "xil_mmu.h"
#include "xil_types.h"
#include "xscutimer.h"
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "xil_cache.h"
#include "xil_printf.h"
#include "xil_cache.h"
#define INT_CFG0_OFFSET 0x00000C00#define F2P_INTR0_ID 61#define GIC_ID XPAR_PS7_SCUGIC_0_DEVICE_ID
#define INT_TYPE_RISING_EDGE    0x03
#define INT_TYPE_HIGHLEVEL      0x01
#define INT_TYPE_MASK           0x03
XScuGic ScuGic;
XScuGic_Config * ScuGicCfgPtr;
int initIntr();
void IntcTypeSetup(XScuGic *InstancePtr, int intId, int intType);
void f2pIntr0Handler(void * callbackref);//行中断
#endif /* _INTERRUPT_H_ */

3.需要拓展多个中断函数

c文件中,initIntr函数里面在第一条中断,也就是中断0的下方加入

	status = XScuGic_Connect(&ScuGic,F2P_INTR1_ID,(Xil_ExceptionHandler)f2pIntr1Handler,&ScuGic);IntcTypeSetup(&ScuGic, F2P_INTR1_ID, INT_TYPE_RISING_EDGE);XScuGic_Enable(&ScuGic, F2P_INTR1_ID);

h文件里面加入中断号以及中断函数1

#define F2P_INTR1_ID 62
void f2pIntr1Handler(void * callbackref);//行中断

在你的主函数里面只需要初始化initIntr函数即可。


总结

今天吃了苗家菜酸汤鱼,感觉味道不错,值得下次再去一次。特别是有一个酸汤丸子,很新奇的东西。

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

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

相关文章

Java 设计模式

1.单例设计模式 对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法。 1.1 饿汉式 构造器私有化 --> 防止直接new类的内部创建对象提供一个static的public方法 getInstance class GirlFriend {private String name;private static GirlFri…

MySQL第二次

作业要求&#xff1a; 作业代码实现&#xff1a; create database db_04 default charsetutf8mb4;use db_04;create table if not exists t_hero(id int primary key auto_increment,name varchar(20) not null unique,nickname varchar(50) not null unique,address varchar…

【Python机器学习系列】建立KNN模型预测心脏疾病(完整实现过程)

这是Python程序开发系列原创文章&#xff0c;我的第198篇原创文章。 一、问题 对于表格数据&#xff0c;一套完整的机器学习建模流程如下&#xff1a; 针对不同的数据集&#xff0c;有些步骤不适用即不需要做&#xff0c;其中橘红色框为必要步骤&#xff0c;由于数据质量较高&…

4点优势,昂首资本使用浮动差价不使用固定差价的原因

在交易中&#xff0c;很多投资者和昂首资本一样&#xff0c;会使用浮动点差而不使用固定点差&#xff0c;那是因为投资者和昂首资本一样认为&#xff0c;使用浮动差价交易会比使用固定价差交易更有优势。 首先在大部分交易时段&#xff0c;价差缩小。正如投资者和昂首资本所知…

6. 逻辑删除

逻辑删除对应的是物理删除&#xff0c;分别介绍一下这两个概念&#xff1a; 物理删除 &#xff1a;指的是真正的删除&#xff0c;即&#xff1a;当执行删除操作时&#xff0c;将数据表中的数据进行删除&#xff0c;之后将无法再查询到该数据逻辑删除 &#xff1a;并不是真正意…

JavaScript常用事件详解

一、用于form&#xff08;表单&#xff09;的事件 在网页中经常会遇到一些表单的验证&#xff0c;是通过事件进行处理的&#xff0c;比如用户输入用户名之后&#xff0c;及时显示用户是否被注册 用于form&#xff08;表单&#xff09;的事件 事件名功能 onblur 当元素失…

数据挖掘实战-基于机器学习的电商文本分类模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

数据结构学习之顺序栈应用的案例(有效的括号)

实例要求&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效&#xff1b; 有效字符串需满足的条件&#xff1a; 1、左括号必须用相同类型的右括号闭合&#xff1b; 2、左括号必须…

【面试合集】1.说说你对微信小程序的理解?优缺点?

面试官&#xff1a;说说你对微信小程序的理解&#xff1f;优缺点&#xff1f; 一、是什么 2017年&#xff0c;微信正式推出了小程序&#xff0c;允许外部开发者在微信内部运行自己的代码&#xff0c;开展业务 截至目前&#xff0c;小程序已经成为国内前端的一个重要业务&…

从传统到智能:机器视觉检测赋能PCB行业数字化转型!

PCB板在现代电子设备中是一个重要的组成部分&#xff0c;它是用来集成各种电子元器件的信息载体。在电子领域中&#xff0c;PCB板有着广泛的应用&#xff0c;而它的质量直接影响到产品的性能。随着电子科技技术和电子制造业的发展&#xff0c;贴片元器件的体积 变小&#xff0c…

亚马逊怎么防止店铺关联?

亚马逊&#xff08;Amazon&#xff09;为了确保公平竞争和防止不当行为&#xff0c;采取了一些措施来防止店铺关联&#xff0c;即通过不同的方式将多个店铺相关联&#xff0c;以获取不正当的竞争优势。以下是一些亚马逊防止店铺关联的主要措施&#xff1a; 同一经营者规定&…

VMware workstation搭建与安装AlmaLinux-9.2虚拟机

VMware workstation搭建与安装AlmaLinux-9.2虚拟机 适用于需要在VMware workstation平台安装AlmaLinux-9.2&#xff08;最小化安装、无图形化界面&#xff09;虚拟机。 1. 安装准备 1.1 安装平台 Windows 11 1.2. 软件信息 软件名称软件版本安装路径VMware-workstation 1…

类和对象---C++

类和对象目录 类和对象1.封装1.1 封装的意义1.2 struct和class区别1.3 成员属性设置为私有1.3.1 联系---判断圆和点的位置关系 2.对象的初始化和清理2.1 构造函数和析构函数2.2 构造函数的分类及调用2.2.1无参构造函数调用2.2.2有参构造函数调用2.2.2.1括号法2.2.2.2显式法2.2.…

微信小程序快速入门02(含案例)

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、页面导航1.…

互联网资讯精选:科技爱好者周刊 | 开源日报 No.145

ruanyf/weekly Stars: 37.4k License: NOASSERTION 记录每周值得分享的科技内容&#xff0c;提供大量就业信息。欢迎投稿、推荐或自荐文章/软件/资源&#xff0c;并可通过多种方式进行搜索。 提供丰富的科技内容每周更新可以提交工作/实习岗位支持投稿和推荐功能 GyulyVGC/…

bootloader学习笔记及SD卡启动盘制作

Bootloader介绍 在操作系统运行之前运行的一小段代码&#xff0c;用于将软硬件环境初始化到一个合适的状态&#xff0c;为操作系统的加载和运行做准备&#xff08;其本身不是操作系统&#xff09; Bootloader基本功能 1、初始化软硬件环境 2、引导加载linux内核 3、给linux…

旅游数据可视化大屏:一屏掌控,畅游数据之海

随着旅游业的蓬勃发展&#xff0c;如何有效地管理和分析旅游数据成为行业关注的焦点。旅游数据可视化大屏作为一种新兴的技术手段&#xff0c;为旅游业带来了前所未有的机遇和挑战。 旅游数据可视化大屏集成了丰富的数据资源&#xff0c;通过直观的图表、图像和交互界面&#x…

慢 SQL 的优化思路

分析慢 SQL 如何定位慢 SQL 呢&#xff1f; 可以通过 slow log 来查看慢SQL&#xff0c;默认的情况下&#xff0c;MySQL 数据库是不开启慢查询日志&#xff08;slow query log&#xff09;。所以我们需要手动把它打开。 查看下慢查询日志配置&#xff0c;我们可以使用 show …

C++力扣题目654--最大二叉树

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 最大二叉树…

7、防写一个shell 命令解释器

1、代码部分 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX_INPUT_LENGTH 100void parse_command(char *command) {// 用于存储解析后的命令和参数char cmd[MAX_INPUT_LENGTH];char args[MAX_INPUT_LENGTH];// 将输入的命令拷贝到…