对于SPIs来说,其中断源也可以从任意子系统PS中的IOP或者PL部分的信号产生。下图为中断控制器的框图,更能够体现出PPIs,SPIs,SGIs的关系,中断响应后会从与之对应的CPU接口进行处理。
下面就分别来说说这三种中断,对于SGIs来说,每一个CPU核可以通过SGIs来响应自己的,其他的或者两个CPU核的中断,通过写ICDSGIR控制器来控制SGIs,ICDICFR0是控制SGIs优先级及触发条件的寄存器,这是一个只读寄存器,由此我们可以看出SGIs的触发条件是上升沿,不可以进行更改。
对于PPIs来说,每一个CPU都连接到5个PPI,同样的,ICDICFR1为PPIs的优先级及触发条件控制寄存器,是只读的,因而PPIs的触发条件也不可更改。需要注意到的是,PL部分的快速响应中断FIQ(fast interrupt)信号与普通中断IRQ(interrupt)需要被送往中断控制器中,所以即便ICDICFR1规定IRQ与FIQ的响应等级为low level,但是他们的在PS与PL接口的响应等级仍是high。
最后是SPIs,有多达60种中断类型可以由任一CPU或者PL部分产生,为了响应这么多的中断,我们必须对GIC进行编写,但是Zynq启动的过程中并没有对GIC进行编写,因此我们需要在SDK中对其进行编辑。同样的,这些中断的触发条件也已经被规定了,不能够进行更改。SPI的中断太多了,不一一列举,大家可以去ug585中查看这些中断。但是让笔者比较疑惑的是,既然中断的触发类型不能够被更改,为什么SDK的库中会有更改中断触发形式的函数呢。GIC是Zynq中断的大脑,这些中断远不能达到GIC pl39所能控制的极限。
我们以一个简单地中断响应程序来作为例子,了解如何使用Zynq的中断,同样的使用XPS+SDK来进行设计。
首先我们使用BSB新建工程;
同样的选择ZC702,删除所有的外设;
添加两个个GPIO外设的IP核,一个外设作为LED显示,另一个外设作为中端IO,这里记得在中端IO的设置中勾选interruput使能,不需要对GPIO做其他设置;
下一步要将GPIO外设加入中断中,可以看到IRQ_F2P没有任何连接;
我们将中断IO加入IRQ,单击L to H : no connecTIon,添加中断源;
XPS部分就设计完毕了,生成比特流之后导入SDK中,进行软件设计。SDK为我们提供了使用中断的库文件 xscugic.h(system control unit generic interrupt controller),没有查到scu的缩写,姑且认为是系统控制单元的缩写,比较好理解。
中断设置很简单,跟其他的单片机程序一样,主要有以下几部分
首先进行GPIO初始化,这个就不需要多说了。
其次进行中断的设置,如中断控制,全局中断允许等等,主要用了以下函数
XScuGic_LookupConfig 中断设置查找
XScuGic_CfgIniTIalize GIC初始化
XScuGic_SetPriorityTriggerType 设置中断优先级及中断触发方式,笔者在这里
有些疑问,手册上面说中断触发方式不可以更改这里为何有这个函数呢,还需要研究一下
XScuGic_Connect 设置中断服务程序入口地址
XScuGic_Enable GIC允许
XGpio_InterruptGlobalEnable GPIO全局中断允许
XGpio_InterruptEnable 相应GPIO中断允许
Xil_ExcepTIonInit 异常处理函数
Xil_ExcepTIonRegisterHandler
Xil_ExceptionEnable
最后编写中断服务程序,在中断服务程序中需要先禁止中断使能,完成服务程序后再打开。
总结来看,由于SDK提供的库文件使得Zynq中断使用很方便简单,并且中断源很多,加上PS部分与PL部分的配合,使用非常灵活。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)