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

一、 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、在配置某个功能的建立中断系统函数前需要对某几种功能进行配置。这些功能配置也有相同的部分:


   
   
  1. //就是查询当前设备(如串口)的ID。
  2. DeviceConfig = XScuGic_LookupConfig(DEVICE_ID);
  3. //对DeviceConfig的初始化。第一个参数:Device的实例
  4. //第二个参数IntcConfig是查找器件后获得的配置信息。
  5. //第三个参数是这个Device配置信息的CPU基地址(我TM都不知道我在说些什么了,哈哈哈哈~)。
  6. XScuGic_CfgInitialize(DeviceInstancePtr, DeviceConfig, DeviceConfig->CpuBaseAddress);
  7. //然后配置这个Device的模式,功能等等参数。如串口的波特率,GPIO的方向等等吧~这写模式或者功能都能在相应的头文件中找到。

 

   

2、在建立中断系统函数时(也就是在XxxSetupInterSystem函数中)总有以下语句是重复的:


   
   
  1. //入口参数:中断设备的ID,但貌似最终都是宏定义到了0U(我也不知道什么时候能定义到其他数值)
  2. //返回值:IntcConfig的类型是结构体指针。XScuGicConfig * IntcConfig;C语言能力欠缺的表示不要去深究这里边的信息究竟是什么了。
  3. //只要按照这个步骤会配置就行了。
  4. IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
  5. //对SCU GIC配置的初始化。第一个参数:SCU GIC的实例
  6. //第二个参数IntcConfig是查找器件后获得的配置信息。
  7. //第三个参数是这个设备配置信息的CPU基地址(我TM都不知道我在说些什么了,哈哈哈哈~)。综合可知,GIC就是一个Device!
  8. XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig, IntcConfig->CpuBaseAddress);
  9. Xil_ExceptionInit(); //中断异常的初始化,这句话可以不要,因为函数里边没什么内容
  10. //建立中断异常处理。第一个参数是不变的:可以查找得到,无论这个数值有几层宏定义,最终结果总是等于5
  11. //第二个参数总是不变的,它恒对应中断处理函数——XScuGic_InterruptHandler
  12. //第三个参数也是不可变的,总是SCU GIC的实例
  13. Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
  14. (Xil_ExceptionHandler)XScuGic_InterruptHandler,
  15. GicInstancePtr);
  16. //使能中断异常,这个函数也是更古不变的!
  17. Xil_ExceptionEnable();
  18. //中断服务函数的注册。那么这里的后两个入口参数需要注意一点了!
  19. //第一个入口参数:是更古不变的,无论怎么查找,无论经过了多少层宏定义,那么它的最终形式是GIC的实例,类型是XScuGic。
  20. //第二个参数:中断ID
  21. //第三个参数:Xxx功能正常发生中断时候,所定义的中断服务函数的名称(有的人称之为句柄,都一个道理)。
  22. //第四个参数:Xxx功能的实例。如UART的实例(含波特率,校验位等数值),又比如私有定时器的实例等。
  23. XScuGic_Connect(IntcInstancePtr, Int_Id,
  24.               (Xil_ExceptionHandler)XxxHandler,
  25.               ( void *)XxxInstancePtr);
  26. XScuGic_Enable(IntcInstancePtr, Int_Id); //第一个参数不用说了,第二个参数是中断ID

 

这些中断配置的相同点终于完成了!!!!!

 

3、相同点配置完之后:我们就该配置与功能模块相关的东西了。

例如设置串口接收中断的触发方式(RxFIFO的出发等级1)!例如使能定时器中断的开启!例如配置引脚输入触发中断的方式!使能引脚下降沿中断等等!这时候再去看UG585!

 

4、配置XxxHandler函数。有关XxxHandler函数的编写还没总结,应该是参考UG585和例程吧。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Zynq中,中断是一种处理器暂停正在执行的当前任务,转而执行与中断相关的任务的机制。Zynq中断具有优先级的概念,优先级决定了中断被响应的顺序。 每个中断都有一个特定的优先级,优先级数值越小表示优先级越高。当多个中断同时发生时,Zynq会根据中断的优先级来决定哪个中断优先被处理。 Zynq中,有两种类型的中断优先级:硬件优先级和软件优先级。硬件优先级由Zynq硬件定义,软件优先级由软件编写者进行定义。 硬件优先级在中断控制器内部实现,是通过对中断请求信号进行优先级编码来实现的。每个中断请求都有一个对应的优先级。当多个中断请求同时到达中断控制器时,硬件会根据这些优先级进行比较,并选择优先级最高的中断请求来处理。硬件优先级在编程过程中无法修改,由硬件设计决定。 软件优先级由编程者在中断处理程序中定义。在Zynq中,可以通过配置寄存器来设置每个中断的软件优先级。软件优先级与硬件优先级相互独立,但软件优先级必须小于硬件优先级。软件优先级的设置允许开发者自定义中断的响应顺序,以满足特定需求。 总的来说,Zynq中断的优先级是通过硬件优先级和软件优先级来确定的。硬件优先级由硬件设计决定,而软件优先级由编程者在中断处理程序中进行设置。根据这些优先级,Zynq选择性地处理中断请求,以确保高优先级的中断可以及时响应和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值