一、 GIC头文件中的那些函数
xscugic.h文件中定义了以下多个函数。
//连接:设置中断服务函数注册
//入口参数:SCU GIC实例,中断ID,定义中断处理函数,中断
s32 XScuGic_Connect (XScuGic *InstancePtr, u32 Int_Id, Xil_InterruptHandler Handler, void *CallBackRef);
//断开连接:中断服务程序不再连接//暂时这么理解吧,反正对于我这种垃圾来说也用不上
void XScuGic_Disconnect(XScuGic *InstancePtr, u32 Int_Id);
//SCU GIC使能和禁用,入口参数是SCU GIC实例,中断ID
void XScuGic_Enable(XScuGic *InstancePtr, u32 Int_Id);
void XScuGic_Disable(XScuGic *InstancePtr, u32 Int_Id);
//SCU GIC配置初始化函数
s32 XScuGic_CfgInitialize(XScuGic *InstancePtr, XScuGic_Config *ConfigPtr, u32 EffectiveAddr);
//软件中断,入口参数:SCU GIC实例,中断ID,CPU的ID
s32 XScuGic_SoftwareIntr(XScuGic *InstancePtr, u32 Int_Id, u32 Cpu_Id);
//获取中断优先级触发类型。入口参数:SCU GIC实例,中断ID,优先级,触发类型?
void XScuGic_GetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id,u8 *Priority, u8 *Trigger);
//设置中断优先级触发类型。入口参数:SCU GIC实例, 中断ID,优先级,触发类型?
void XScuGic_SetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id, u8 Priority, u8 Trigger);
//中断映射到CPU中。入口:SCU GIC实例,CPU ID,中断ID
void XScuGic_InterruptMaptoCpu(XScuGic *InstancePtr, u8 Cpu_Id, u32 Int_Id);
//来自于CPU的中断不映射,入口参数:SCU GIC实例,CPU ID,中断ID
void XScuGic_InterruptUnmapFromCpu(XScuGic *InstancePtr, u8 Cpu_Id, u32 Int_Id);
//来自于CPU的中断全都不映射,入口参数:SCU GIC实例,CPU ID
void XScuGic_UnmapAllInterruptsFromCpu(XScuGic *InstancePtr, u8 Cpu_Id);
//暂停GIC,入口参数:SCU GIC实例
void XScuGic_Stop(XScuGic *InstancePtr);
//设置CPU的ID。
void XScuGic_SetCpuID(u32 CpuCoreId);
//获取CPU的ID
u32 XScuGic_GetCpuID(void);
//查询配置。入口参数:设备ID,返回值:GIC配置结构体指针
XScuGic_Config *XScuGic_LookupConfig(u16 DeviceId);
//中断处理函数
void XScuGic_InterruptHandler(XScuGic *InstancePtr);
//自测函数,入口参数:SCU GIC实例
s32 XScuGic_SelfTest(XScuGic *InstancePtr);
二 、ZYNQ中配置函数的步骤过程
下边对比一下初始化中断函数的共同点:
1、在配置某个功能的建立中断系统函数前需要对某几种功能进行配置。这些功能配置也有相同的部分:
//就是查询当前设备(如串口)的ID。
DeviceConfig = XScuGic_LookupConfig(DEVICE_ID);
//对DeviceConfig的初始化。第一个参数:Device的实例
//第二个参数IntcConfig是查找器件后获得的配置信息。
//第三个参数是这个Device配置信息的CPU基地址(我TM都不知道我在说些什么了,哈哈哈哈~)。
XScuGic_CfgInitialize(DeviceInstancePtr, DeviceConfig, DeviceConfig->CpuBaseAddress);
//然后配置这个Device的模式,功能等等参数。如串口的波特率,GPIO的方向等等吧~这写模式或者功能都能在相应的头文件中找到。
2、在建立中断系统函数时(也就是在XxxSetupInterSystem函数中)总有以下语句是重复的:
//入口参数:中断设备的ID,但貌似最终都是宏定义到了0U(我也不知道什么时候能定义到其他数值)
//返回值:IntcConfig的类型是结构体指针。XScuGicConfig * IntcConfig;C语言能力欠缺的表示不要去深究这里边的信息究竟是什么了。
//只要按照这个步骤会配置就行了。
IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
//对SCU GIC配置的初始化。第一个参数:SCU GIC的实例
//第二个参数IntcConfig是查找器件后获得的配置信息。
//第三个参数是这个设备配置信息的CPU基地址(我TM都不知道我在说些什么了,哈哈哈哈~)。综合可知,GIC就是一个Device!
XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig, IntcConfig->CpuBaseAddress);
Xil_ExceptionInit();//中断异常的初始化,这句话可以不要,因为函数里边没什么内容
//建立中断异常处理。第一个参数是不变的:可以查找得到,无论这个数值有几层宏定义,最终结果总是等于5
//第二个参数总是不变的,它恒对应中断处理函数——XScuGic_InterruptHandler
//第三个参数也是不可变的,总是SCU GIC的实例
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler)XScuGic_InterruptHandler,
GicInstancePtr);
//使能中断异常,这个函数也是更古不变的!
Xil_ExceptionEnable();
//中断服务函数的注册。那么这里的后两个入口参数需要注意一点了!
//第一个入口参数:是更古不变的,无论怎么查找,无论经过了多少层宏定义,那么它的最终形式是GIC的实例,类型是XScuGic。
//第二个参数:中断ID
//第三个参数:Xxx功能正常发生中断时候,所定义的中断服务函数的名称(有的人称之为句柄,都一个道理)。
//第四个参数:Xxx功能的实例。如UART的实例(含波特率,校验位等数值),又比如私有定时器的实例等。
XScuGic_Connect(IntcInstancePtr, Int_Id,
(Xil_ExceptionHandler)XxxHandler,
(void *)XxxInstancePtr);
XScuGic_Enable(IntcInstancePtr, Int_Id);//第一个参数不用说了,第二个参数是中断ID
这些中断配置的相同点终于完成了!!!!!
3、相同点配置完之后:我们就该配置与功能模块相关的东西了。
例如设置串口接收中断的触发方式(RxFIFO的出发等级1)!例如使能定时器中断的开启!例如配置引脚输入触发中断的方式!使能引脚下降沿中断等等!这时候再去看UG585!
4、配置XxxHandler函数。有关XxxHandler函数的编写还没总结,应该是参考UG585和例程吧。