llc1991

小白一个,记录下自己学习过程

zynq知识模块-中断

1
阅读(1842)


中断:

任何一个嵌入式系统级的设计都离不开中断,对于拥有双cotex-A9的Zynq来说也一样。Zynq的中断设计由ARM与GIC pl390中断控制器组成,用于接收IOP(I/O peripherals)与PL的信号。如下图所示,CPU中的中断分为PPIs(private peripheral interrupts),SGIs(software generated interrupts)与SPIs(shared peripheral interrupts)其中,通过写GIC(generic interrupt controller)的寄存器来产生SGIs。从Xilinx给出的ug585手册中可以清晰的看出GIC与PPIs,SCIs,SPIs的关系。GIC可以管理从PS与PL部分产生的中断,并且对其使能,优先级等作出设置,与普通ARM相同,所有的中断都会赋予一个中断ID,用作CPU的相应。


对于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部分的配合,使用非常灵活。

转载自:http://xilinx.eetrend.com/article/5087