Zynq UltraScale+ 系列---PL中断教程

免责声明:

本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。

读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证。

本文所涉及的任何商标、版权或其他知识产权均属于其各自的所有者。若本文中引用了第三方的资料或信息,引用仅为学术交流目的,不构成对第三方内容的认可或保证。

若有任何疑问或需进一步信息,请联系本文作者或相关专业人士。

目录

前言

一、系统架构

二、PL 中断资源简介

三、搭建 SOC 系统工程

四、编译并导出平台文件

五、搭建 Vitis-sdk 工程

六、案例程序

七、实验结果

 

总结



前言

PL 到 PS 的中断是 ARM 和 FPGA 交互比较重要的一项。PS 的中断控制器及时响应 PL 的中断,以通知 CPU 及时处理。本文通过VIO虚拟输入,模拟中断的信号,PS响应中断并处理执行函数通过UART打印显示。


一、系统架构

DDR + ZYNQ + UART + VIO

二、PL 中断资源简介

共有 16 个 PL 到 PS 中断通过GIC接入到 CPU.

PL-PS 的中断资源分 2 组,第 1 组的中断号为 121-128;第 2 组的中断号为 136-143

注:如果是ZYNQ-7系列,请查阅相应的手册。

三、搭建 SOC 系统工程

四、编译并导出平台文件

有不清楚的看以往的文章。

五、搭建 Vitis-sdk 工程

创建 soc_base sdk platform 和 APP 工程的过程不再重复,有不清楚请看以往的文章。

六、案例程序

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "xscugic.h"

// 定义中断控制器设备 ID 和
#define INTC_DEVICE_ID XPAR_SCUGIC_0_DEVICE_ID
// 定义中断 ID
#define INTR_ID 121

// 声明中断控制器实例
XScuGic IntcInstance;

// 中断处理程序
void MyInterruptHandler(void *CallbackRef) {
    xil_printf("Interrupt received!\n");
    // 当 VIO 产生上升沿中断时,打印 "Interrupt received"
}

int main() {
    int Status;
    XScuGic_Config *IntcConfig;

    // 初始化中断控制器配置
    IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
    if (IntcConfig == NULL) {
        return XST_FAILURE; // 如果初始化失败,返回错误
    }

    // 初始化中断控制器实例
    Status = XScuGic_CfgInitialize(&IntcInstance, IntcConfig, IntcConfig->CpuBaseAddress);
    if (Status != XST_SUCCESS) {
        return XST_FAILURE; // 如果初始化失败,返回错误
    }

    // 注册中断处理程序
    Status = XScuGic_Connect(&IntcInstance, INTR_ID,
                             (Xil_ExceptionHandler)MyInterruptHandler,
                             (void *)NULL);
    if (Status != XST_SUCCESS) {
        return XST_FAILURE; // 如果注册中断处理程序失败,返回错误
    }

    // 配置中断优先级和触发类型(0x3 表示上升沿触发)
    XScuGic_SetPriorityTriggerType(&IntcInstance, INTR_ID, 0x00, 0x3); // 0x00 表示优先级,0x3 表示上升沿触发

    // 启用指定的中断
    XScuGic_Enable(&IntcInstance, INTR_ID);

    // 初始化 CPU 中断系统
    Xil_ExceptionInit();
    // 注册 GIC 中断处理程序
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
                                 (Xil_ExceptionHandler)XScuGic_InterruptHandler,
                                 &IntcInstance);
    // 启用 CPU 中断
    Xil_ExceptionEnable();

    xil_printf("Waiting for interrupt...\n");

    while (1) {
        // 主循环等待中断发生
    }

    return 0;
}

七、实验结果

1.烧录程序

2.等待VIO触发

3.改变VIO输出

4.中断响应处理

总结

关于中断处理部分的工作:

  1. 设置了 PL 到 PS 的中断连接

    • 使用 VIO(Virtual Input/Output)连接 GIC(Generic Interrupt Controller),从 PL 触发中断信号到 PS。
  2. 在 Vitis 中编写了中断处理程序

    • 初始化了平台和中断控制器。
    • 注册了一个中断处理程序 MyInterruptHandler
    • 设置了中断触发方式为上升沿触发。
    • 启用了中断和 CPU 中断。
  3. 代码实现及注释

    • 初始化中断控制器。
    • 配置中断处理程序。
    • 配置中断触发方式。
    • 启用中断并等待中断触发。
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值