第十三章 ZYNQ-MIZ702 PL中断请求
本篇文章主要介绍外设(PL)产生的中断请求,在PS端进行处理。
在PL端通过按键产生中断,PS接受到之后点亮相应的LED.
本文所使用的开发板是Miz702 PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4
13.0本章难度系数★★☆☆☆☆☆
13.1 ZYNQ 中断介绍
13.1.1 ZYNQ中断框图


可以看到本例子中PL到PS部分的中断经过ICD控制器分发后后同时进入CPU1 和CPU0。从下面的表格中可以看到中断向量的具体值。PL到PS部分一共有20个中断可以使用。其中4个是快速中断。剩余的16个是本章中涉及了,可以任意定义。如下表所示。

13.1.2 ZYNQ CPU软件中断 (SGI)
ZYNQ 2个CPU 都具备各自16个软件中断。

13.1.3 ZYNQ CPU 私有端口中断
这些中断都是固定死的,不能修改。这里有2个PL到CPU的快速中断nFIQ
11.1.4 ZYNQ PS和PL共享中断


13.2 搭建硬件工程
Step1:新建一个名为为Miz702_sys的工程

Step2:选择RTL Project 勾选Do not specify source at this time

Step3:由于Miz702兼容zedboard 因此选择zedboard开发包

Step4:单击Finish

13.3使用IP Integrator创建硬件系统
Step1:单击Create Block Design
Step2:输入system

Step3:单击下图中
添加IP按钮

Step4:搜素单词z选择ZYNQ7 Processing System,然后双击

Step5:添加进来了ZYNQ CPU IP,然后单击Run Block Automation

Step6:直接单击OK

Step7:在你点击了OK后,你会发现DDR以及FICED_IO自劢的延伸出来。

Step8:连线的作用就是把PS的时钟可以接入PL部分,当然这里我们暂时用不到PL部分的资源。在Block文件中,我们迚行连线,将鼠标放在引脚处,鼠标变成铅笔后迚行拖拽,连线如下图所示:

Step9:双击 ZYNQ,打开Re-customize IP对话框,使能IRQ_F2P

Step10:使能UART1点击Run Connection Automation,按照如图所示配置后单击OK

Step11:添加一个GPIO IP,添加5个输入,按照如图所示配置,使能中断


Step12:再添加一个GPIO IP,添加8个输出按照如图所示配置,点击OK


Step13:单击Run Connection Automation,将2个GPIO进行自动连线

Step14:把axi_gpio_0的ip2intc_irpt和ZYNQ PS的 IRQ_F2P[0:0]连在一起,并且修改GPIO的名字如图所示:搭建好的硬件系统连接,如图所示

Step15: 右击 system.bd, 单击Generate Output Products

Step16:支部操作会产生执行、仿真、综合的文件

Step17:右击system.bd 选择 Create HDL Wrapper 这步的作用是产生顶层的HDL文件

Step18:选择Leave Let Vivado manager wrapper and auto-update 然后单击OK

Step19:添加xdc约束文件
|
set_property IOSTANDARD LVCMOS33 [get_ports {btns_5bits_tri_i[4]}] set_property IOSTANDARD LVCMOS33 [get_ports {btns_5bits_tri_i[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {btns_5bits_tri_i[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {btns_5bits_tri_i[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {btns_5bits_tri_i[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {leds_8bits_tri_o[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {leds_8bits_tri_o[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {leds_8bits_tri_o[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {leds_8bits_tri_o[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {leds_8bits_tri_o[4]}] set_property IOSTANDARD LVCMOS33 [get_ports {leds_8bits_tri_o[5]}] set_property IOSTANDARD LVCMOS33 [get_ports {leds_8bits_tri_o[6]}] set_property IOSTANDARD LVCMOS33 [get_ports {leds_8bits_tri_o[7]}] set_property PACKAGE_PIN T18 [get_ports {btns_5bits_tri_i[0]}] set_property PACKAGE_PIN R18 [get_ports {btns_5bits_tri_i[1]}] set_property PACKAGE_PIN R16 [get_ports {btns_5bits_tri_i[2]}] set_property PACKAGE_PIN P16 [get_ports {btns_5bits_tri_i[3]}] set_property PACKAGE_PIN N15 [get_ports {btns_5bits_tri_i[4]}] set_property PACKAGE_PIN T22 [get_ports {leds_8bits_tri_o[0]}] set_property PACKAGE_PIN T21 [get_ports {leds_8bits_tri_o[1]}] set_property PACKAGE_PIN U22 [get_ports {leds_8bits_tri_o[2]}] set_property PACKAGE_PIN U21 [get_ports {leds_8bits_tri_o[3]}] set_property PACKAGE_PIN V22 [get_ports {leds_8bits_tri_o[4]}] set_property PACKAGE_PIN W22 [get_ports {leds_8bits_tri_o[5]}] set_property PACKAGE_PIN U19 [get_ports {leds_8bits_tri_o[6]}] set_property PACKAGE_PIN U14 [get_ports {leds_8bits_tri_o[7]}] |
Step19:执行->产生bit文件
13.4导出SOC硬件到SDK
Step1:File->Export->Export Hardware

Step2:勾选Include bitstream 直接单击OK

Step3:File->Launch SDK加载到SDK

Step4:单击OK

13.5软件工程
新建一个PL_PS_INTC空的工程,并且添加main.c把以下代码添加进去
|
#include "xparameters.h" #include "xscugic.h" #include "xil_exception.h" #include "xgpio.h" // Parameter definitions #define INTC_DEVICE_ID XPAR_PS7_SCUGIC_0_DEVICE_ID #define LED_DEVICE_ID XPAR_AXI_GPIO_1_DEVICE_ID #define BTNS_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID #define INTC_GPIO_INTERRUPT_ID XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR #define BTN_INT XGPIO_IR_CH1_MASK // This is the interrupt mask for channel one #define DELAY 100000000 XGpio LED; XGpio BTNInst; XScuGic INTCInst; static u8 btn_value; //---------------------------------------------------- // PROTOTYPE FUNCTIONS //---------------------------------------------------- static void BTN_Intr_Handler(void *baseaddr_p); static int InterruptSystemSetup(XScuGic *XScuGicInstancePtr); static int IntcInitFunction(u16 DeviceId, XGpio *GpioInstancePtr); //---------------------------------------------------- // INTERRUPT SERVICE ROUTINE(ISR) //also know as : INTERRUPT HANDLER FUNCTION // - called by the buttons interrupt, performs push buttons read //---------------------------------------------------- void BTN_Intr_Handler(void *InstancePtr) { unsigned char led_val = 0; // Ignore additional button presses if ((XGpio_InterruptGetStatus(&BTNInst) & BTN_INT) != BTN_INT) { return; // Disable GPIO interrupts XGpio_InterruptDisable(&BTNInst, BTN_INT); } btn_value = ~XGpio_DiscreteRead(&BTNInst, 1)&0x1f; switch (btn_value){ case 0x01: led_val = 0x01; break; case 0x02: led_val = 0x02; break; case 0x04: led_val = 0x04; break; case 0x08: led_val = 0x08; break; case 0x10: led_val = 0x10; break; default:break; } XGpio_DiscreteWrite(&LED,1,led_val); // Acknowledge GPIO interrupts (void)XGpio_InterruptClear(&BTNInst, BTN_INT); // Enable GPIO interrupts XGpio_InterruptEnable(&BTNInst, BTN_INT); } //---------------------------------------------------- // MAIN FUNCTION //---------------------------------------------------- int main (void) { int status; // 初始化按键 status = XGpio_Initialize(&BTNInst, BTNS_DEVICE_ID); if(status != XST_SUCCESS) return XST_FAILURE; //初始化LED status = XGpio_Initialize(&LED, LED_DEVICE_ID); if(status != XST_SUCCESS) return XST_FAILURE; // 设置按键IO的方向为输入 XGpio_SetDataDirection(&BTNInst, 1, 0xFF); //设置LED IO的方向为输出 XGpio_SetDataDirection(&LED, 1, 0x00); // 初始化中断控制器 status = IntcInitFunction(INTC_DEVICE_ID, &BTNInst); if(status != XST_SUCCESS) return XST_FAILURE; while(1){ } return (0); } //---------------------------------------------------- // INTERRUPT SETUP FUNCTIONS //---------------------------------------------------- int IntcInitFunction(u16 DeviceId, XGpio *GpioInstancePtr) { XScuGic_Config *IntcConfig; int status; // Interrupt controller initialization IntcConfig = XScuGic_LookupConfig(DeviceId); status = XScuGic_CfgInitialize(&INTCInst, IntcConfig, IntcConfig->CpuBaseAddress); if(status != XST_SUCCESS) return XST_FAILURE; // Call interrupt setup function status = InterruptSystemSetup(&INTCInst); if(status != XST_SUCCESS) return XST_FAILURE; // Register GPIO interrupt handler status = XScuGic_Connect(&INTCInst, INTC_GPIO_INTERRUPT_ID, (Xil_ExceptionHandler)BTN_Intr_Handler, (void *)GpioInstancePtr); if(status != XST_SUCCESS) return XST_FAILURE; // Enable GPIO interrupts XGpio_InterruptEnable(GpioInstancePtr, 1); XGpio_InterruptGlobalEnable(GpioInstancePtr); // Enable GPIO interrupts in the controller XScuGic_Enable(&INTCInst, INTC_GPIO_INTERRUPT_ID); return XST_SUCCESS; } int InterruptSystemSetup(XScuGic *XScuGicInstancePtr) { // Register GIC interrupt handler Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, XScuGicInstancePtr); Xil_ExceptionEnable(); return XST_SUCCESS; } |
13.6结果
下载好之后,按键按下可以看到相应的LED被点亮
13.7 本章小结
本章学习了外部中断,通过PL传递开发板按键的中断,然后在PS接受处理中断。
官网论坛:www.osrc.cn
视频链接:http://www.osrc.cn/forum.php?mod=viewthread&tid=1103
源码链接:http://pan.baidu.com/s/1jHCdRds 密码:zvtu
第十三章 ZYNQ-MIZ702 PL中断请求的更多相关文章
- S02_CH07_ ZYNQ PL中断请求
S02_CH07_ ZYNQ PL中断请求 7.1 ZYNQ 中断介绍 7.1.1 ZYNQ中断框图 可以看到本例子中PL到PS部分的中断经过ICD控制器分发器后同时进入CPU1 和CPU0.从下面的 ...
- PRML读书会第十三章 Sequential Data(Hidden Markov Models,HMM)
主讲人 张巍 (新浪微博: @张巍_ISCAS) 软件所-张巍<zh3f@qq.com> 19:01:27 我们开始吧,十三章是关于序列数据,现实中很多数据是有前后关系的,例如语音或者DN ...
- <构建之法>第十三章到十七章有感以及这个项目读后感
<构建之法>第十三章到十七章有感 第13章:软件测试方法有哪些? 主要讲了软件测试方法:要说有什么问题就是哪种效率最高? 第14章:质量保障 软件的质量指标是什么?怎么样能够提升软件的质量 ...
- 《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记
第二十三章:使用数据库 MySQL数据库 MySQL客户端界面 mysql命令行参数 参数 描述 -A 禁用自动重新生成哈希表 -b 禁用 出错后的beep声 -B 不使用历史文件 -C 压缩客户端和 ...
- 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高
第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...
- Gradle 1.12 翻译——第十三章 编写构建脚本
有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...
- [汇编学习笔记][第十三章int指令]
第十三章int指令 13.1 int指令 格式: int n, n 为中断类型码 可以用int指令调用任何一个中断的中断处理程序(简称中断例程). 13.4 BIOS和DOS 所提供的中断例程 BIO ...
- perl5 第十三章 Perl的面向对象编程
第十三章 Perl的面向对象编程 by flamephoenix 一.模块简介二.Perl中的类三.创建类四.构造函数 实例变量 五.方法六.方法的输出七.方法的调用八.重载九.析构函数十.继承十一. ...
- 第十三章——表和索引分区(1)——使用Range Left进行表分区
原文:第十三章--表和索引分区(1)--使用Range Left进行表分区 前言: 如果数据表的数据持续增长,并且表中的数据量已经达到数十亿甚至更多,数据的查询和操作将非常困难,面对非常庞大的表,几时 ...
- CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章
第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮 ...
随机推荐
- python爬虫-爬坑之路
背景简介 爬取外国的某两个网站的数据,网站都没有被墙,爬取三种数据. A: 爬取页面并存储到数据库 B: 爬取页面内的表格内数据并存储到数据库 C: 爬取页面,分析页面并将页面的所有数据分类存入数据库 ...
- 调皮捣蛋的Linux下有趣终端的合集
*本文作者:国光,转载自 FreeBuf.COM,原文地址:https://www.freebuf.com/news/144050.html 前言 刚开始接触Linux的我们,肯定认为Linux系统就 ...
- 跨域方案JSONP与CORS的各自优缺点以及应用场景
转自 https://www.zhihu.com/question/41992168/answer/217903179 首先明确:JSONP与CORS的使用目的相同,并且都需要服务端和客户端同时支持, ...
- asp.net core spa应用(angular) 部署同一网站下
需求:现在一个应用是前后端开发分离,前端使用angular,后端使用 asp.net core 提供api ,开发完成后,现在需要把两个程序部署在同一个网站下,应该怎么处理? 首先可以参考微软的官方文 ...
- 如何构建自己的docker镜像
需求情况:springboot项目想要部署到docker里面,如何部署? 步骤如下: 1.将jar包上传linux服务器 /usr/local/dockerapp 目录,在jar包所在目录创建名为 D ...
- Flutter移动电商实战 --(32)列表页_小类高亮交互效果制作
点击大类右侧的横向的小类红色显示当前的小类别 解决之前溢出的问题: 先解决一个bug,之前右侧的这里设置的高度是1000,但是有不同的虚拟机和手机设别的问题造成了溢出的问题 Expaned是有伸缩能力 ...
- 解决阿里云轻量级服务器mysql无法用数据库操作软件连接
第一步:去阿里云购买一台轻量应用服务器Lamp然后登录到控制台点击应用详情 点击后你可以看到一些服务器的数据 首先是访问服务器的首页地址,默认会放一个html文件在网站根目录下(即/home/www/ ...
- 配置nginx支持path_info
默认情况下,nginx是不支持path_info的,我们需要做些配置让它支持. location ~ \.php(.*)$ { root /var/www/nginx/html; fastcgi_pa ...
- java中的异步处理和Feature接口(一)
背景介绍想象这样一个场景:你可能希望为你的法国客户提供指定主题的热点报道.为实现这一功能,你需要向 谷歌或者Twitter的API请求所有语言中针对该主题最热门的评论,可能还需要依据你的内部算法 对它 ...
- hadoop2.7.7+habse2.0.5+zookeeper3.4.14+hive2.3.5单机安装
环境 腾讯云centos7 1.hadoop下载 http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar ...