说明:
开发软件: vivado 和 sdk
开发平台:黑金ZYNQ的7010
翻开 UG585 中断部分,Zynq 中断大致可分为三个部分,
中断详细分为
SGI(Software Generated Interrupts)软件中断,
PPI(Private Peripheral Interrupts)私有外设中断,
SPI(Shared Peripheral Interrupts)共享外设中断。
1 为 SGI,软件生成的中断,共 16个端口;
2 为 PPI,CPU 私有外设中断,有 5 个;
3 为 SPI,共享外设中断,来自于 44 个 PS 端的IO 外设以及 16 个 PL 端的中断。
中间部分为 GIC,也即中断控制器,用于对中断进行使能、关闭、掩码、设置优先等
下面为中断控制器框图,主要的控制器部分为ICC和ICD,其中ICC连接的SGI和PPI,ICD连接SPI
下面是中断各项分布:
-
SGI软件中断(16个)
存在16个软件产生的中断,通过向ICDSGIR寄存器写入SGI中断号,以及指定目标CPU,来
产生一个软件中断,通过读ICCIAR寄存器或者向ICDICPR寄存器相应的比特位写1,可以清
楚中断。所有的SGI为边沿触发。
2、CPU内部的私有中断-(在单CPU角度看具有5中断)
每个CPU连接一个私有的共享5个外设中断,素有中断的敏感类型是固定的,不能改变,UPI全
局定时器,nFIQ,CPU私有定时器,AWDT,nIRQ
3、SPI里面设计的中断(60个)
由PS和PL上的各种I/O控制器和存储器控制器产生,这些中断信号会被路由到CPU。PS的外
设产生的SPI中断也会路由到PL上。默认地,所有共享外设中断类型在复位时是高电平,然
后软件使用的ICDICFR2和ICDICFR5寄存器编程中断32,33和92为上升沿敏感。
下面是中断寄存器的介绍:详细介绍的是SPI的寄存器
1、ICDISER: 中断使能寄存器,3 个寄存器,每 1 位代表一个中断号,共 96 个(每个寄存器32位)
2、ICDICER: 中断关闭寄存器,3 个寄存器,每 1 位代表一个中断号,共 96 个(每个寄存器32位)
3、ICDIPR: 中断优先级寄存器,设置优先级,共 24 个寄存器,每 8 位代表一个中断号,共 96 个
中断号
4、ICDIRTR: CPU 选择寄存器,24 个寄存器,每 8 位代表一个中断号,共 96 个
0bxxxxxxx1: CPU interface 0
0bxxxxxx1x: CPU interface 1
5、ICDICFR: 配置寄存器,用于配置触发方式,电平触发或边沿触发,共有 6 个,每个寄存器 32 位,
每两位表示一个中断,32*6/2=96 个中断号,能覆盖所有中断。
(参数具体来源网络--仅作为笔记参考作用)
配置中断主要用到的函数:
(不包含其中一些经过拓展或者整合的配置函数)
XScuGic_LookupConfig 中断设置查找
XScuGic_CfgInitialize GIC初始化
XScuGic_SetPriorityTriggerType 设置中断优先级及中断触发方式
XScuGic_Connect 设置中断服务程序入口地址
XScuGic_Enable GIC允许
XGpio_InterruptGlobalEnable GPIO全局中断允许
XGpio_InterruptEnable 相应GPIO中断允许
Xil_ExceptionInit 异常处理函数
Xil_ExceptionRegisterHandler 当处理器遇到指定的异常时,将调用此处理程序
Xil_ExceptionEnable 异常使能
为特定的异常注册一个处理程序。当处理器遇到指定的异常时,将调用此处理程序。异常id包含异常源的id,应该在到XIL异常id的范围内。进一步信息参见xil exception.h。处理程序到该异常的处理程序。数据是对数据的引用,在调用处理程序时将传递给处理程序。