ZYNQ 中断函数配置——个人笔记

1 篇文章 0 订阅
1 篇文章 0 订阅

一、 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实例,中断IDCPUID

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);

 

//设置CPUID

void XScuGic_SetCpuID(u32 CpuCoreId);

 

//获取CPUID

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和例程吧。

  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值