免责声明:
本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。
读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证。
本文所涉及的任何商标、版权或其他知识产权均属于其各自的所有者。若本文中引用了第三方的资料或信息,引用仅为学术交流目的,不构成对第三方内容的认可或保证。
若有任何疑问或需进一步信息,请联系本文作者或相关专业人士。
目录
前言
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.中断响应处理
总结
关于中断处理部分的工作:
-
设置了 PL 到 PS 的中断连接:
- 使用 VIO(Virtual Input/Output)连接 GIC(Generic Interrupt Controller),从 PL 触发中断信号到 PS。
-
在 Vitis 中编写了中断处理程序:
- 初始化了平台和中断控制器。
- 注册了一个中断处理程序
MyInterruptHandler
。 - 设置了中断触发方式为上升沿触发。
- 启用了中断和 CPU 中断。
-
代码实现及注释:
- 初始化中断控制器。
- 配置中断处理程序。
- 配置中断触发方式。
- 启用中断并等待中断触发。