1、硬件配置,IRQ0、1分别来自PL端,PL端本文略。
2、ZYNQ中断源配置,本次使用0-1中断,对应中断源为61、62。
3、SDK代码(vivado版本为2019.1)
XScuGic InterruptController;
static XScuGic_Config *GicConfig;
#define INTC_DEVICE_ID XPAR_SCUGIC_0_DEVICE_ID
#define INTC_DEVICE_INT_ID 61
#define INT_TYPE_RISING_EDGE 0x03
#define INT_TYPE_MASK 0x03
#define INT_CFG0_OFFSET 0x00000C00
//中断初始化函数
int ScuGic_Init(void)
{
// 初始化中断控制器
GicConfig = XScuGic_LookupConfig(XPAR_PS7_SCUGIC_0_DEVICE_ID);
XScuGic_CfgInitialize(&InterruptController, GicConfig, GicConfig->CpuBaseAddress);
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&InterruptController);
Xil_ExceptionEnable();
XScuGic_Connect(&InterruptController, INTC_DEVICE_INT_ID, DeviceDriverHandler, NULL);
IntcTypeSetup(&InterruptController, INTC_DEVICE_INT_ID, INT_TYPE_RISING_EDGE);
// 使能中断
XScuGic_Enable(&InterruptController, INTC_DEVICE_INT_ID);
return 0;
}
//上升沿设置函数
void IntcTypeSetup(XScuGic *InstancePtr, int intId, int intType)
{
int mask;
intType &= INT_TYPE_MASK;
mask = XScuGic_DistReadReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4);
mask &= ~(INT_TYPE_MASK << (intId%16)*2);
mask |= intType << ((intId%16)*2);
XScuGic_DistWriteReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4, mask);
}
//中断处理函数
void DeviceDriverHandler(void *CallbackRef)
{
}