北京网站搭建方案,上海公司记账,化州网站开发公司,设计模板图文章目录 前言一、PL-PS的中断是啥#xff1f;二、PL-PS端中断详细步骤1.ZYNQ核配置2.PS端中断函数配置3.需要拓展多个中断函数 总结 前言
本设计跟我的ZYNQ实战合集专栏中的脉冲触发电路有关系#xff0c;也正好趁这个机会讲述一下PL-PS的中断系统#xff0c;如何去触发中… 文章目录 前言一、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函数即可。 总结
今天吃了苗家菜酸汤鱼感觉味道不错值得下次再去一次。特别是有一个酸汤丸子很新奇的东西。