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 进行单独配置(绑定处理函数、使能等),就像总开关打开后,需要打开某个房间的分开关才能使用该房间的电器。
更具体的补充:
GIC(总开关)的核心作用:
- 接收所有硬件外设(GPIO、定时器等)的中断请求;
- 根据优先级决定中断的响应顺序;
- 将中断信号分发到 CPU 核心;
- 提供全局的中断使能 / 屏蔽控制。
GPIO 中断 ID(子开关)的作用:
- 是 GPIO 外设向 GIC 发起中断请求的 “身份标识”;
- GIC 通过这个 ID 识别是哪个外设产生的中断,进而调用对应的处理函数;
- 每个外设(甚至外设的不同功能)都有唯一的中断 ID,就像每个房间的分开关都有独立的线路标识。
两者的依赖关系:
- 必须先初始化 GIC(打开总开关),否则即使配置了 GPIO 中断 ID(子开关),中断也无法被 CPU 响应;
- 初始化 GIC 后,若不配置具体的 GPIO 中断 ID(不开子开关),该 GPIO 的中断也无法工作。