zynq中断:共享外设中断(SPI)

本文介绍了如何在Zynq上编程实现共享外设中断,特别是通过逻辑产生中断信号并接入ZYNQ中断输入。内容包括上升沿和高电平触发方式的解释,以及在Vivado中创建Block Design的步骤,同时提供了SDK中C代码的编写流程,强调了高电平触发时的时钟周期要求,以及按键抖动可能导致的中断问题。

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

摘要:
关于zynq的中断说明网上有很多的帖子,比如说一下的帖子就写的很不错。
https://blog.youkuaiyun.com/shangguanyunlan/article/details/53147587

关于中断的说明不想在多说,详细的可以看上面的博客。我这里主要将如何编程实现。关于中断的说明将会分两篇来说明,第一篇是直接在PL端通过逻辑来产生中断,第二篇是通过按键来产生中断。

本篇通过逻辑来产生中断信号,并将其接入ZYNQ的中断输入。产生的中断信号是一个周期方波,周期为2秒。
在这里插入图片描述
共享外设中断的触发方式有上升沿和高电平两种方式。上升沿触发,顾名思义就是在上升沿的时候触发中断。高电平触发就是在高电平期间触发中断,但并不是说在高电平期间的每一个时刻都会触发中断。比如说高电平的占空比是1秒的话,并不是在1秒内都会产生中断。为什么呢?我想主要的原因就是,当中断相应进入中断处理函数后,会关闭中断,然后再进行处理,处理完后才再次打开中断,因此并不是每一个时刻都会响应中断。

高电平触发的应用场景主要用于类似于报警系统,当报警没有接触的时候就一直给高电平,产生警报。当警报解除之后就可以拉低信号。

一、在vivado 中创建一个Block Design

Block Design的完整配置如下
在这里插入图片描述
1、配置ZYNQ
a、中断设置
在这里插入图片描述
b、时钟设置
在这里插入图片描述
2、创建三个端口
分别创建PL_intr、CLK_100M和FCLK_RESET_N端口,并把这两个端口分别连接到IRQ_F2P、FCLK_CLK0和FCLK_RESET_N。
3、选中中断信号线, 并debug。
3、按照第一张图完成连接,如下图。
在这里插入图片描述
4、Generate output product

<think>嗯,用户现在问的是ZYNQ中断配置。之前他们问过中断的作用,现在可能是在实际项目中遇到了需要配置中断的情况,比如使用ZYNQ做嵌入式开发。 首先,我需要确定用户对ZYNQ的了解程度。ZYNQ是Xilinx的SoC,结合了ARM处理器和FPGA,中断配置可能涉及PS(处理系统)和PL(可编程逻辑)两部分。用户可能是在做硬件和软件的协同设计,需要配置中断来处理PL部分的事件或者外设的输入。 接下来,要回忆ZYNQ中断结构。ZYNQ中断控制器是GIC(通用中断控制器),支持多种中断源,包括PS端的外设(如GPIO、SPI)和PL部分的中断。用户可能需要知道如何配置GIC,设置中断优先级、类型,以及如何在软件中编写ISR(中断服务程序)。 用户可能遇到的问题包括:如何连接PL的中断信号到PS,如何配置中断触发方式(边沿或电平),如何注册中断处理函数,以及如何确保中断的优先级和嵌套正确处理。此外,可能还需要了解使用Xilinx的工具链,如Vivado和SDK,进行硬件和软件的配置步骤。 需要分步骤解释,从硬件配置到软件设置,可能还要提到使用Xilinx提供的库函数,比如XScuGic。同时,应该强调关键点,比如中断号的确定、中断控制器的初始化、中断处理函数的注册,以及可能的常见错误,比如未正确连接中断信号或忘记启用中断。 还要考虑用户是否有FPGA设计经验,可能需要简要说明如何在PL部分生成中断信号,比如通过AXI接口或者自定义逻辑。最后,提供一个简单的示例流程,帮助用户理解整个配置过程,并提醒注意事项,如中断延迟和资源冲突。</think>ZYNQ是Xilinx推出的**ARM+FPGA异构SoC**,其中断系统分为**PS(处理系统)端**和**PL(可编程逻辑)端**两部分。以下是ZYNQ中断配置的核心要点: --- ### 一、ZYNQ中断架构 1. **中断控制器**: - PS端使用**通用中断控制器(GIC)**,支持**SPI共享外设中断)**和**PPI(私有外设中断)** - PL端中断通过**IRQ_F2P(Fabric到PS中断)**或**IRQ_P2F(PS到Fabric中断)**传递 2. **中断类型**: - **硬件中断**:来自GPIO、定时器、DMA等外设 - **软件中断**:通过写入**ICDSGIR寄存器**触发 - **PL Fabric中断**:来自FPGA逻辑自定义的中断源 --- ### 二、硬件配置步骤(Vivado环境) #### 1. **PL端中断生成** ```tcl # 例:在Block Design中添加AXI GPIO并启用中断 create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio axi_gpio_0 set_property -dict [list CONFIG.C_INTERRUPT_PRESENT {1}] [get_bd_cells axi_gpio_0] ``` - 通过**Concat IP核**合并多个PL中断信号 - 连接至ZYNQ的**IRQ_F2P**端口 #### 2. **PS端中断连接** - 在ZYNQ配置中启用**IRQ_F2P**接口 - 设置中断触发类型:边沿(Edge)或电平(Level) --- ### 三、软件配置流程(SDK/Vitis环境) #### 1. **初始化GIC控制器** ```c #include "xscugic.h" XScuGic IntcInstance; // 中断控制器实例 XScuGic_Config *IntcConfig; // 查找GIC配置 IntcConfig = XScuGic_LookupConfig(XPAR_PS7_SCUGIC_0_DEVICE_ID); XScuGic_CfgInitialize(&IntcInstance, IntcConfig, IntcConfig->CpuBaseAddress); ``` #### 2. **注册中断服务程序(ISR)** ```c // 定义中断处理函数 void GPIO_Handler(void *CallbackRef) { // 清除中断标志 XGpio_InterruptClear(&GPIOInst, 1); // 业务逻辑... } // 连接中断 XScuGic_Connect(&IntcInstance, XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR, (Xil_ExceptionHandler)GPIO_Handler, &GPIOInst); ``` #### 3. **启用中断** ```c // 使能GIC XScuGic_Enable(&IntcInstance, XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR); // 启用处理器中断 Xil_ExceptionInit(); Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, &IntcInstance); Xil_ExceptionEnable(); ``` --- ### 四、关键注意事项 1. **中断ID匹配**: - 在`xparameters.h`中确认**中断ID**(如`XPAR_FABRIC_..._INTR`) - 需与Vivado中的IP核配置一致 2. **优先级设置**: ```c XScuGic_SetPriorityTriggerType(&IntcInstance, IntrId, 0xA0, 0x3); // 0xA0: 优先级(数值越小优先级越高) // 0x3: 触发类型(0x1=上升沿,0x3=高电平) ``` 3. **PL-PS同步**: - 使用**AXI Interrupt Controller**处理多个PL中断源 - 注意**时钟域交叉**问题,建议使用**同步电路** --- ### 五、调试技巧 1. 通过**Xilinx SDK Debugger**查看**ICCICR**(控制寄存器)和**ICCIAR**(响应寄存器) 2. 若中断未触发: - 检查GIC是否启用 - 确认中断信号在PL端是否正确传递 - 验证ISR中是否清除了中断标志 --- ### 六、典型应用场景 1. **PL数据采集**:FPGA完成数据缓存后触发PS中断 2. **实时控制**:通过GPIO中断响应外部传感器信号 3. **DMA传输完成通知**:DMA引擎传输结束后触发中断 通过合理配置ZYNQ中断,可实现**硬件加速**与**软件控制**的高效协同。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值