在2023.2版本中AMD取消了DEVICE ID的概念,并且全面转向了BASEADDR,之前的例程可能就不能用了。
新的UnifiedIDE中,对于GPIO中断的开启是以下的步骤。
1.配置GPIO并初始化
static XGpioPs Gpio;
XGpioPs_Config *ConfigPtr;
ConfigPtr = XGpioPs_LookupConfig(BaseAddress);
XGpioPs_CfgInitialize(Gpio,ConfigPtr,ConfigPtr->BaseAddr);
2.配置中断
XGpioPs_SetIntrType(Gpio,GPIO_BANK,IntrType,IntrPolarity,IntrOnAny);
//其中第一个参数Gpio就是我们上面配置的GPIO外设
//第二个参数GPIO_BANK是我们所用的GPIO所在的BANK
//第三个参数IntrType是中断类型 0的话中断就是检测电平 1的话就是检测边沿
//第四个参数IntrPolarity是中断极性,0为检测低电平或下降沿,1为检测高电平或上升沿,注意这里检测电平或边沿是靠IntrType来设置好的
//第五个参数是设置单边沿触发还是两个边沿都触发中断
XGpioPs_SetCallbackHandler(Gpio,(void *)Gpio,IntrHandler);
//这一步设置中断回调函数IntrHandler
XGpioPs_IntrEnable(Gpio,GPIO_BANK,(1 << 11));
//这一步设置开启哪个引脚的中断,像我这里就是开启了GPIO11,最后的这个参数是二进制的哪个位是1,就开启哪里的GPIO,如果是0,就保持之前的状态不动
XSetupInterruptSystem(Gpio,&XGpioPs_IntrHandler,
ConfigPtr->IntrId,
ConfigPtr->IntrParent,
XINTERRUPT_DEFAULT_PRIORITY);
//这一步开启整个的中断系统
//下面需要对应配置中断回调函数
static void IntrHandler(void *CallBackRef, u32 Bank, u32 Status)
{
}
这样GPIO中断的配置就完成了,但是要注意Zynq的ARM核中所有的GPIO只有一个中断线,所以无论是哪一路GPIO进来的中断都会触发这个中断回调,需要在内部写引脚判断。