首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
FPGA/CPLD可编程逻辑
» ZYNQ入门 中断使用
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
ZYNQ入门 中断使用
发短消息
加为好友
pengpengpang
(pengpengpang)
当前离线
UID
1023229
帖子
6106
精华
0
积分
3055
阅读权限
90
来自
中国
在线时间
156 小时
注册时间
2013-12-20
最后登录
2016-7-3
论坛元老
UID
1023229
来自
中国
1
#
打印
字体大小:
t
T
pengpengpang
发表于 2014-7-5 20:36
|
只看该作者
ZYNQ入门 中断使用
generated
,
software
,
private
,
shared
,
控制器
任何一个嵌入式系统级的设计都离不开中断,对于拥有双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部分的配合,使用非常灵活。
来源:转载自中国嵌入式系统网
收藏
分享
评分
记录学习中的点点滴滴,让每一天过的更加有意义!
回复
引用
订阅
TOP
返回列表
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议