zynq mpsoc裸机多中断运行

本文介绍Zynq MPSoC中axigpio与dma双中断的硬件连接及软件处理方法,包括中断配置、使能及处理函数设置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​ zynq mpsoc裸机开发中,经常会使用中断,如果只使用一个中断,比较好处理。如果遇到使用多个中断的情况该如何处理中断函数呢?下面以dma和axi gpio为例进行说明。

单中断时

axi gpio输入信号电平发生翻转时,产生中断。

硬件连接

在axi gpio中配置中使能中断,将中断信号与PS中断pl_ps_irq连接。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ts7t5mle-1661675088232)(./pic/1.png)]

中断处理步骤1

以下函数依次进行处理。

  • XScuGic_LookupConfig()
  • XScuGic_CfgInitialize()
  • Xil_ExceptionRegisterHandler()
  • Xil_ExceptionEnable()

中断处理步骤2

处理XScuGic_Connect函数。

  • XScuGic_Connect()
  • XScuGic_Enable()

XScuGic_Connect函数。该函数需要输出参数如下:

XScuGic_Connect(XScuGic *InstancePtr, u32 Int_Id,
				Xil_InterruptHandler Handler, void *CallBackRef)

其中InstancePtr为定义的XScuGic对象。

针对axigpio时,Int_Id为:

#define XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR 123U

Handler为中断处理函数。

CallBackRef为axigpi对象。

中断处理步骤3

使能axigpio中断。

  • XGpio_InterruptEnable()
  • XGpio_InterruptGlobalEnable()

以上3个步骤完成中断函数设置。

多中断时

硬件工程中在axigpio中断之外,再加入DMA中断后,中断相关函数该如何设置呢。

硬件连接

将dma输出中断信号和axigpio输出中断信号接入Concat,Concat输出与PS中断连接。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ITXj1a9-1661675088233)(./pic/2.png)]

中断处理

在代码中加入与dma相关的中断处理函数。

1、中断处理步骤1不变,dma与axigpio共用。

2、在代码中再加入中断处理步骤2中断处理步骤3中的函数,将之前axigpio相关对象换成与dma相关对象。

axigpio与dma中断处理函数

加入axigpio与dma相关中断函数后,代码结构如下:

//公共部分
XScuGic_LookupConfig()
XScuGic_CfgInitialize()
Xil_ExceptionRegisterHandler()
Xil_ExceptionEnable()
//
XScuGic_Connect() //axigpio相关
XScuGic_Enable()
XScuGic_Connect() //dma相关
XScuGic_Enable()
XGpio_InterruptEnable()
XGpio_InterruptGlobalEnable()
XAxiDma_IntrEnable()

总结

​ 本文介绍了axigpio与dma双中断时,代码中如何加入中断处理函数,如果再加入更多中断,处理方法类似。

<think>嗯,用户想了解Zynq MPSoC使用中断的例程。我需要先回忆一下Zynq MPSoC中断结构。Zynq UltraScale+ MPSoC中断控制器是GIC-400吧,负责处理来自PSPL部分的中断。 首先,应该从硬件架构讲起,说明PSPL的中断连接方式。然后,软件配置方面,可能需要提到Xilinx提供的库函数,比如XScuGic。用户可能需要知道如何初始化中断控制器、注册中断处理函数,以及启用中断。 还要考虑AXI中断控制器(如果PL部分有自定义中断的话)。这时候可能需要配置PL到PS中断路径,比如通过IRQ_F2P接口。需要分步骤说明,比如硬件配置、软件初始化、中断服务例程编写等。 用户可能是嵌入式开发者,刚开始接触Zynq MPSoC,所以步骤要详细,代码示例会有帮助。同时要注意PSPL的区别,比如PS中断GPIO、定时器,而PL可能需要自己生成中断信号。 可能还需要提到设备树配置,如果使用的是Linux的话,但用户可能问的是裸机例程,所以重点放在裸机或FreeRTOS的中断设置。另外,安全考虑,比如区分安全非安全中断,但可能属于进阶内容,先不深入。 检查是否有常见错误,比如忘记启用中断全局使能,或者中断处理函数没有清除中断标志。这些点需要提醒用户注意。最后,确保代码语法正确,比如使用XScuGic_Connect函数绑定中断处理函数,然后启用中断。 总结下来,应该分步骤讲解,从硬件到软件,给出代码示例,并指出关键点。这样用户能逐步理解实现中断例程。</think>在Zynq UltraScale+ MPSoC使用中断的例程可分为以下几个关键步骤: --- ### 一、硬件架构概述 1. **中断控制器** ZynqMP采用`GIC-400`中断控制器,支持: - 共享外设中断(SPI) - 私有外设中断(PPI) - 软件生成中断(SGI) 2. **中断路径** PL逻辑通过`IRQ_F2P`或`IRQ_0`引脚向PS发送中断信号,PS外设(如GPIO/UART)直接触发中断。 --- ### 二、裸机开发流程(以GPIO中断为例) #### 步骤1:硬件配置(Vivado) 1. 在Block Design中启用`PS-PL Configuration -> Interrupts -> PL-PS Interrupts -> IRQ0[0-7]` 2. 连接PL逻辑(如AXI GPIO)到IRQ0口 #### 步骤2:软件初始化(SDK/Vitis) ```c #include "xscugic.h" #include "xgpiops.h" // 定义全局变量 XScuGic InterruptController; XGpioPs gpio; // 中断服务程序 void GPIO_Handler(void *CallbackRef) { // 1. 清除中断标志 XGpioPs_IntrClearPin(&gpio, GPIO_PIN); // 2. 处理中断事件... } ``` #### 步骤3:配置中断控制器 ```c // 初始化GIC XScuGic_Config *IntcConfig = XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID); XScuGic_CfgInitialize(&InterruptController, IntcConfig, IntcConfig->CpuBaseAddress); // 设置异常处理 Xil_ExceptionInit(); Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, &InterruptController); // 连接中断处理程序 XScuGic_Connect(&InterruptController, GPIO_INTERRUPT_ID, (Xil_ExceptionHandler)GPIO_Handler, &gpio); // 启用中断 XGpioPs_SetIntrTypePin(&gpio, GPIO_PIN, XGPIOPS_IRQ_TYPE_EDGE_RISING); XGpioPs_IntrEnablePin(&gpio, GPIO_PIN); XScuGic_Enable(&InterruptController, GPIO_INTERRUPT_ID); // 全局中断使能 Xil_ExceptionEnable(); ``` --- ### 三、Linux驱动开发要点 1. **设备树配置** 添加中断描述: ```dts pl_gpio: pl_gpio@a0000000 { compatible = "generic-uio"; reg = <0x0 0xa0000000 0x0 0x1000>; interrupt-parent = <&gic>; interrupts = <0 89 4>; // SPI中断号89,高电平触发 }; ``` 2. **驱动代码** 使用`request_irq`注册中断: ```c irqreturn_t handler(int irq, void *dev_id) { // 中断处理... return IRQ_HANDLED; } request_irq(irq_num, handler, IRQF_TRIGGER_RISING, "pl_irq", NULL); ``` --- ### 四、关键注意事项 1. **中断优先级** 通过`XScuGic_SetPriorityTriggerType()`设置优先级触发类型 2. **中断嵌套** 默认关闭,需手动配置GIC的优先级掩码 3. **PL-PS同步** PL侧中断信号需满足PS时钟域的建立/保持时间 --- ### 五、调试建议 1. 使用`XScuGic_InterruptMaptool`查看中断映射 2. 通过`REGISTER DUMP`验证GIC寄存器配置 3. 检查PL逻辑是否生成正确的脉冲信号(建议使用ILA核抓取波形) 完整例程可参考Xilinx官方文档:[UG1085 - Zynq UltraScale+ MPSoC Technical Reference Manual](https://docs.xilinx.com/r/en-US/ug1085-zynq-ultrascale-trm)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硬码农二毛哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值