Vivado SDK 中 XScuGic(ARM Cortex-A9 SCU GIC 中断控制器)相关函数

发布于:2025-09-15 ⋅ 阅读:(17) ⋅ 点赞:(0)

1. XScuGic_CfgInitialize

  • 函数原型s32 XScuGic_CfgInitialize(XScuGic *InstancePtr, XScuGic_Config *ConfigPtr, u32 EffectiveAddr)
  • 功能:初始化中断控制器实例,将硬件配置与驱动程序关联。
  • 参数
    • InstancePtr:XScuGic 结构体指针(中断控制器实例)。
    • ConfigPtr:XScuGic_Config 结构体指针(包含硬件配置信息,如基地址)。
    • EffectiveAddr:中断控制器的有效基地址(通常从 ConfigPtr 中获取)。
  • 返回值XST_SUCCESS(初始化成功)或XST_FAILURE(失败)。
  • 说明:必须在使用其他中断控制器函数前调用,完成驱动与硬件的绑定。

2. XScuGic_Connect

  • 函数原型s32 XScuGic_Connect(XScuGic *InstancePtr, u32 Int_Id, Xil_InterruptHandler Handler, void *CallBackRef)
  • 功能:将中断 ID 与对应的中断处理函数绑定,建立中断源与处理逻辑的关联。
  • 参数
    • InstancePtr:中断控制器实例指针。
    • Int_Id:中断源 ID(由硬件定义,如 GPIO 中断 ID)。
    • Handler:中断处理函数指针(中断触发时执行的函数)。
    • CallBackRef:传递给中断处理函数的参数(通常为外设实例指针)。
  • 返回值XST_SUCCESS(绑定成功)或错误码(失败)。
  • 说明:每个中断源需单独绑定,多次调用可绑定不同中断。

3. XScuGic_Disconnect

  • 函数原型void XScuGic_Disconnect(XScuGic *InstancePtr, u32 Int_Id)
  • 功能:解除中断 ID 与处理函数的绑定,将该中断的处理函数设为默认空函数。
  • 参数
    • InstancePtr:中断控制器实例指针。
    • Int_Id:需解除绑定的中断 ID。
  • 说明:用于移除中断处理逻辑,避免中断触发时执行无效操作。

4. XScuGic_Enable

  • 函数原型void XScuGic_Enable(XScuGic *InstancePtr, u32 Int_Id)
  • 功能:使能指定的中断源,允许该中断触发 CPU 中断。
  • 参数
    • InstancePtr:中断控制器实例指针。
    • Int_Id:需使能的中断 ID。
  • 说明:中断默认是禁用的,需显式调用此函数开启。

5. XScuGic_Disable

  • 函数原型void XScuGic_Disable(XScuGic *InstancePtr, u32 Int_Id)
  • 功能:禁用指定的中断源,阻止该中断触发 CPU 中断(但不清除已产生的中断标志)。
  • 参数
    • InstancePtr:中断控制器实例指针。
    • Int_Id:需禁用的中断 ID。
  • 说明:常用于中断处理过程中临时关闭中断,避免嵌套或重复触发。

6. XScuGic_SoftwareIntr

  • 函数原型s32 XScuGic_SoftwareIntr(XScuGic *InstancePtr, u32 Int_Id, u32 Cpu_Id)
  • 功能:软件触发指定的中断,模拟硬件中断信号。
  • 参数
    • InstancePtr:中断控制器实例指针。
    • Int_Id:需软件触发的中断 ID。
    • Cpu_Id:目标 CPU 核心 ID(多核系统中指定触发哪个核心的中断)。
  • 返回值XST_SUCCESS(触发成功)或错误码(失败)。
  • 说明:用于软件调试或模拟硬件事件触发中断。

7. XScuGic_SetPriorityTriggerType

  • 函数原型void XScuGic_SetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id, u8 Priority, u8 Trigger)
  • 功能:设置中断的优先级和触发类型(电平触发 / 边沿触发)。
  • 参数
    • InstancePtr:中断控制器实例指针。
    • Int_Id:目标中断 ID。
    • Priority:优先级(0~255,值越小优先级越高)。
    • Trigger:触发类型(如XGPIOPS_IRQ_TYPE_EDGE_FALLING表示下降沿触发)。
  • 说明:需在使能中断前配置,确保中断触发方式符合硬件需求。

8. XScuGic_GetPriorityTriggerType

  • 函数原型void XScuGic_GetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id, u8 *Priority, u8 *Trigger)
  • 功能:获取指定中断当前的优先级和触发类型。
  • 参数
    • InstancePtr:中断控制器实例指针。
    • Int_Id:目标中断 ID。
    • Priority:输出参数,用于存储获取的优先级。
    • Trigger:输出参数,用于存储获取的触发类型。
  • 说明:用于调试或动态调整中断配置前读取当前状态。

9. XScuGic_InterruptMaptoCpu

  • 函数原型void XScuGic_InterruptMaptoCpu(XScuGic *InstancePtr, u8 Cpu_Id, u32 Int_Id)
  • 功能:将指定中断映射到目标 CPU 核心(多核系统中使用)。
  • 参数
    • InstancePtr:中断控制器实例指针。
    • Cpu_Id:目标 CPU 核心 ID(如 0 或 1)。
    • Int_Id:需映射的中断 ID。
  • 说明:在多核 FPGA 设计中,用于分配中断到特定 CPU 处理。

10. XScuGic_InterruptUnmapFromCpu

  • 函数原型void XScuGic_InterruptUnmapFromCpu(XScuGic *InstancePtr, u8 Cpu_Id, u32 Int_Id)
  • 功能:解除中断与目标 CPU 核心的映射关系。
  • 参数
    • InstancePtr:中断控制器实例指针。
    • Cpu_Id:需解除映射的 CPU 核心 ID。
    • Int_Id:目标中断 ID。
  • 说明:与XScuGic_InterruptMaptoCpu配合使用,用于动态调整中断分配。

11. XScuGic_UnmapAllInterruptsFromCpu

  • 函数原型void XScuGic_UnmapAllInterruptsFromCpu(XScuGic *InstancePtr, u8 Cpu_Id)
  • 功能:解除所有中断与目标 CPU 核心的映射关系。
  • 参数
    • InstancePtr:中断控制器实例指针。
    • Cpu_Id:目标 CPU 核心 ID。
  • 说明:用于多核系统中快速清除某 CPU 的所有中断映射。

12. XScuGic_Stop

  • 函数原型void XScuGic_Stop(XScuGic *InstancePtr)
  • 功能:停止中断控制器,检查并处理当前 CPU 的中断目标寄存器。
  • 参数InstancePtr:中断控制器实例指针。
  • 说明:通常用于系统关闭或复位前的清理操作。

13. XScuGic_SetCpuID

  • 函数原型void XScuGic_SetCpuID(u32 CpuCoreId)
  • 功能:设置全局变量CpuId,指定当前操作的 CPU 核心 ID。
  • 参数CpuCoreId:CPU 核心 ID(如 0 或 1)。
  • 说明:在多核系统中,用于标识当前代码运行的 CPU 核心。

14. XScuGic_GetCpuID

  • 函数原型u32 XScuGic_GetCpuID(void)
  • 功能:获取当前设置的 CPU 核心 ID(通过XScuGic_SetCpuID配置)。
  • 返回值:当前 CPU 核心 ID。
  • 说明:用于多核系统中判断代码运行在哪个核心上。

  • 通用中断控制器(GIC)的初始化确实相当于 “总开关”,它是整个中断系统的核心枢纽,负责管理所有中断源(包括 GPIO、UART、定时器等)的注册、优先级、分发等全局控制。没有初始化 GIC,整个系统的中断功能都无法工作,就像总开关没打开,所有设备都无法通电。

  • PS 端 GPIO 中断 ID 的配置则相当于 “子开关”,它是 GIC 管理下的一个具体中断源。GIC 初始化后,需要针对每个具体设备(如 GPIO)的中断 ID 进行单独配置(绑定处理函数、使能等),就像总开关打开后,需要打开某个房间的分开关才能使用该房间的电器。

更具体的补充:

  1. GIC(总开关)的核心作用

    • 接收所有硬件外设(GPIO、定时器等)的中断请求;
    • 根据优先级决定中断的响应顺序;
    • 将中断信号分发到 CPU 核心;
    • 提供全局的中断使能 / 屏蔽控制。
  2. GPIO 中断 ID(子开关)的作用

    • 是 GPIO 外设向 GIC 发起中断请求的 “身份标识”;
    • GIC 通过这个 ID 识别是哪个外设产生的中断,进而调用对应的处理函数;
    • 每个外设(甚至外设的不同功能)都有唯一的中断 ID,就像每个房间的分开关都有独立的线路标识。
  3. 两者的依赖关系

    • 必须先初始化 GIC(打开总开关),否则即使配置了 GPIO 中断 ID(子开关),中断也无法被 CPU 响应;
    • 初始化 GIC 后,若不配置具体的 GPIO 中断 ID(不开子开关),该 GPIO 的中断也无法工作。