参考:手把手课堂:如何在Zynq SoC上使用中断 - 爱码网 (likecs.com)
ZYNQ基础----串口中断_black_pigeon的博客-CSDN博客_zynq串口中断
在嵌入式处理中,中断表示暂时停止处理器的当前活动。处理器会保存当前的状态并执行中断服务例程,以便对引起中断的原因进行寻址。中断可能来自下列三个地方之一:
硬件 – 直接连接处理器的电子信号
软件 – 处理器加载的软件说明
异常情况 – 发生错误或异常事件时处理器出现的异常情况
无论中断的来源在何处,都可将中断的类别归为可屏蔽中断可屏蔽中断( Maskable Interrupts, IRQ)和不可屏蔽中断可屏蔽中断( Maskable Interrupts, IRQ)
两种。可通过在中断掩码寄存器中设置相应的位来安全地忽略可屏蔽中断。但不能忽略不可屏蔽中断,因为这类中断通常用于定时器和看门狗监控器。
ZYNQ可使用通用中断控制器(GIC)来处理中断。GIC可处理源自以下方面的中断:
软件生成的中断 ( software generated interrupts, SGI)
– 每个处理器有16个此类中断,能够中断一个或两个Zynq SoC的ARM®CortexTM-A9处理器内核;
共享外设中断 shared peripheral interrupts、 SPI)
– 共计60个,这些中断来自I/O外围设备,或往返于设备的可编程逻辑(PL)侧。Zynq SoC的两个CPU共享这些中断;共享外设中断非常有趣,因为它们非常灵活。可将它们从I/O外设(共44个中断)或FPGA逻辑(共16个中断)路由至两个CPU中的一个,但也可以将中断从I/O外设路由至设备的可编程逻辑侧
私有外设中断 ( private peripheral interrupts, PPI)
– 这种类型中包含的5个中断对每个CPU都属于专用中断,比如CPU定时器、CPU看门狗监视器定时器以及专属PL至CPU中断。
在Zynq SoC上处理中断
在Zynq SoC中发生中断时,处理器会采取以下措施:
1. 将中断显示为挂起;
2. 处理器停止执行当前线程;
3. 处理器在协议栈中保存线程状态,以便在中断处理后继续进行处理;
4. 处理器执行中断服务例程,其中定义了如何处理中断;
5. 在处理器从协议栈恢复之前,被中断的线程继续运行;
中断属于异步事件,因此可能同时发生多个中断。为了解决这一问题,处理器会对中断进行优先级排序,从而首先服务于优先级别最高的中断挂起。
为了正确实现这一中断结构,需要编写两个函数:一是中断服务例程,用于定义中断发生时的应对措施;二是用于配置中断的中断设置。中断设置例程可重复使用,允许构建不同的中断。该例程适用于系统中的所有中断,将针对通用I/O(GPIO)设置和使能中断。
如何在SDK中使用中断
可使用赛灵思软件开发套件(SDK)中的独立板支持包(BSP)在物理硬件上支持并实现中断。BSP具备众多功能,可显著降低创建中断驱动系统的任务难度。它们位于带有以下报头的文件中:
Xparameters.h – 该文件包含处理器的地址空间和设备ID;
Xscugic.h – 该文件包含配置驱动程序以及GIC的使用范围;
Xil_exception.h – 该文件包含Cortex-A9的异常函数。
为了对硬件外设进行寻址,我们需要知道想要使用的设备(也就是GIC)的地址范围和设备ID,这些信息大多位于BSP报头文件xparameters下。但是xparameters_ps.h(无需在您的源代码中申报该报头文件,因为它包含在xparameters.h文件中)提供了中断ID。我们可在源文件中使用这个标记有中断的“ID”(GPIO_Interrupt_ID),使用方式如下:
//以下常量映射到xparameters.h文件
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID //PS端GPIO器件ID
#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID //通用中断控制器ID
#define GPIO_INTERRUPT_ID XPAR_XGPIOPS_0_INTR //PS端GPIO中断ID
在这个简单的例子中,我们将配置Zynq SoC的GPIO,以便在按下按钮后生成中断。为了设置中断,我们需要两个静态全局变量以及上述定义的中断ID来执行以下操作:
static XGpioPs gpio; //PS端GPIO驱动实例
static XScuGic intc; //通用中断控制器驱动实例
GPIO 中断系统初始化流程:
第一步: 初始化 cpu 的异常处理功能
第二步: 初始化中断控制器
第三步: 向 CPU 注册异常处理回调函数;
第四步: 将中断控制器中的对应中断 ID 的中断与中断控制器相连接
第五步: 设置 GPIO 的中断类型, 比如高电平中断、低电平中断、上升沿中断、下降沿中断等
第六步: 设置 GPIO 中断回调函数, 这里设置的回调函数是用于用户使用的。
第七步: 使能 GPIO 的对应 PIN 的中断
第八步: 使能中断控制器
第九步: 使能异常处理功能
int status;
//初始化异常处理
Xil_ExceptionInit();
//初始化中断控制器
GicPsPtr = XScuGic_LookupConfig(GIC_DEV_ID);
status = XScuGic_CfgInitialize(&GicPs,GicPsPtr,GicPsPtr->CpuBaseAddress);
if(status != XST_SUCCESS){
return status;
}
//cpu exception register 注册异常处理回调函数到CPU
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&GicPs);
//connect gpio handler连接GPIO中断信号并注册GPIO回调函数
status = XScuGic_Connect(&GicPs,GPIO_INTR_ID,(Xil_InterruptHandler)XGpioPs_IntrHandler,&GpioPs);
if(status != XST_SUCCESS){
return status;
}
//interrupt type edge trigger negedge设置GPIO中断类型
XGpioPs_SetIntrType(&GpioPs,SW_BANK_ID,0xffffffff,0x00,0x00);
//set callback func设置GPIO的回调函数
XGpioPs_SetCallbackHandler(&GpioPs,(void *) &GpioPs,intrHandler);
//使能对应PIN的中断
XGpioPs_IntrEnable(&GpioPs,SW_BANK_ID,1<<(SW0-54));
//使能中断控制器中的GPIO中断
XScuGic_Enable(&GicPs,GPIO_INTR_ID);
//使能异常处理
Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
return XST_SUCCESS;

下面是中断函数的示例:
1 void intrHandler(void * CallBackRef,u32 Bank,u32 status){ 2 XGpioPs *GpioPtr; 3 GpioPtr = (XGpioPs *)CallBackRef; 4 double DataBuf[2]; 5 u32 intrstatus; 6 intrstatus = XGpioPs_IntrGetStatusPin(GpioPtr,SW0); 7 if(intrstatus == 1){ 8 XGpioPs_IntrClearPin(GpioPtr,SW0); 9 XGpioPs_IntrDisablePin(GpioPtr,SW0); 10 u32 readSW=0; 11 int cnt; 12 while(cnt <100){ 13 readSW= XGpioPs_ReadPin(GpioPtr,SW0); 14 if(readSW == 1){ 15 cnt ++; 16 } 17 else{ 18 cnt =0; 19 } 20 usleep(1000); 21 } 22 printf("readSW = %d \n",(int)readSW); 23 readDev(DataBuf); 24 printf("Humidity = %.1f; temperature = %.1f \n",DataBuf[1],DataBuf[0]); 25 if(readSW == 0){ 26 XGpioPs_WritePin(GpioPtr,LED1,0x01); 27 } 28 XGpioPs_IntrEnablePin(GpioPtr,SW0); 29 } 30 }
ctrl + ?快捷注释
备注:关于整个流程的系统解释可以参考百度云FPGA盘的net4_GPIO_IRQ3(自用提醒,读者无需关注)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期