第十二章 ZYNQ-MIZ701 PL中断请求
本篇文章主要介绍外设(PL)产生的中断请求,在PS端进行处理。
在PL端通过按键产生中断,PS接受到之后点亮相应的LED.
本文所使用的开发板是Miz701 PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4
12.0本章难度系数★★☆☆☆☆☆
12.1 ZYNQ 中断介绍
12.1.1 ZYNQ中断框图
可以看到本例子中PL到PS部分的中断经过ICD控制器分发后后同时进入CPU1 和CPU0。从下面的表格中可以看到中断向量的具体值。PL到PS部分一共有20个中断可以使用。其中4个是快速中断。剩余的16个是本章中涉及了,可以任意定义。如下表所示。
12.1.2 ZYNQ CPU软件中断 (SGI)
ZYNQ 2个CPU 都具备各自16个软件中断。
12.1.3 ZYNQ CPU 私有端口中断
这些中断都是固定死的,不能修改。这里有2个PL到CPU的快速中断nFIQ
11.1.4 ZYNQ PS和PL共享中断
12.2 搭建硬件工程
Step1:新建一个名为为Miz701_sys的工程
Step2:选择RTL Project 勾选Do not specify source at this time
Step3:选择xc7z010clg400-1作为开发器件。
Step4:单击Finish
12.3使用IP Integrator创建硬件系统
Step1:单击Create Block Design
Step2:输入system
Step3:单击下图中添加IP按钮
Step4:搜素单词z选择ZYNQ7 Processing System,然后双击
Step5:添加进来了ZYNQ CPU IP,然后双击对其进行配置。
Step6:修改输入时钟频率为50MHZ,PL端频率FCLK_CLK0频率为100MHZ。
Step7:修改内存类型为MT41K256M16 RE-125。
Step8:在MIO configuration选项中,勾选添加UART1接口。
Step9:在Interrupt选项中,使能IRQ_F2P,单击OK完成修改。
Step10:单击Run Block Automation进行智能布线。
Step11:直接单击OK
Step12:在你点击了OK后,你会发现DDR以及FICED_IO自动的延伸出来。
Step13:连线的作用就是把PS的时钟可以接入PL部分,当然这里我们暂时用不到PL部分的资源。在Block文件中,我们迚行连线,将鼠标放在引脚处,鼠标变成铅笔后迚行拖拽,连线如下图所示:
Step14:添加一个GPIO IP,添加1个输入,按照如图所示配置,使能中断
Step15:再添加一个GPIO IP,添加4个输出,按照如图所示配置。
Step16:单击Run Connection Automation,将GPIO进行自动连线
Step17:把axi_gpio_0的ip2intc_irpt和ZYNQ PS的 IRQ_F2P[0:0]连在一起,并且修改GPIO的名字如图所示:搭建好的硬件系统连接,如图所示
Step18: 右击 system.bd, 单击Generate Output Products
Step19:支部操作会产生执行、仿真、综合的文件
Step20:右击system.bd 选择 Create HDL Wrapper 这步的作用是产生顶层的HDL文件
Step21:选择Leave Let Vivado manager wrapper and auto-update 然后单击OK
Step22:添加xdc约束文件
set_property IOSTANDARD LVCMOS33 [get_ports {leds_4bits_tri_o[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {leds_4bits_tri_o[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {leds_4bits_tri_o[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {leds_4bits_tri_o[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {button_tri_i[0]}] set_property PACKAGE_PIN T17 [get_ports {button_tri_i[0]}] set_property PACKAGE_PIN F17 [get_ports {leds_4bits_tri_o[0]}] set_property PACKAGE_PIN J15 [get_ports {leds_4bits_tri_o[1]}] set_property PACKAGE_PIN G14 [get_ports {leds_4bits_tri_o[2]}] set_property PACKAGE_PIN D18 [get_ports {leds_4bits_tri_o[3]}] |
Step23:执行->产生bit文件
12.4导出SOC硬件到SDK
Step1:File->Export->Export Hardware
Step2:勾选Include bitstream 直接单击OK
Step3:File->Launch SDK加载到SDK
Step4:单击OK
12.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; } |
12.6结果
下载好之后,按键按下可以看到相应的LED移位一次。
12.7 本章小结
本章学习了外部中断,通过PL传递开发板按键的中断,然后在PS接受处理中断。
官网论坛:www.osrc.cn
源码链接:http://pan.baidu.com/s/1kV0MLbp 密码:k9jl
第十二章 ZYNQ-MIZ701 PL中断请求的更多相关文章
- PRML读书会第十二章 Continuous Latent Variables(PCA,Principal Component Analysis,PPCA,核PCA,Autoencoder,非线性流形)
主讲人 戴玮 (新浪微博: @戴玮_CASIA) Wilbur_中博(1954123) 20:00:49 我今天讲PRML的第十二章,连续隐变量.既然有连续隐变量,一定也有离散隐变量,那么离散隐变量是 ...
- <构建之法>第十一章、十二章有感
十一章:软件设计与实现 工作时要懂得平衡进度和质量.我一直有一个困扰:像我们团队这次做 男神女神配 社区交友网,我负责主页的设计及内容模块,有个队友负责网站的注册和登录模块,有个队友负责搜索模块,有个 ...
- sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)
第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的 DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...
- 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记
第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...
- 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高
第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...
- [CSAPP笔记][第十二章并发编程]
第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟 ...
- perl5 第十二章 Perl5中的引用/指针
第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用 子程序模板七.数组与子程序八.文件句 ...
- 第十二章——SQLServer统计信息(4)——在过滤索引上的统计信息
原文:第十二章--SQLServer统计信息(4)--在过滤索引上的统计信息 前言: 从2008开始,引入了一个增强非聚集索引的新功能--过滤索引(filter index),可以使用带有where条 ...
- 第十二章——SQLServer统计信息(3)——发现过期统计信息并处理
原文:第十二章--SQLServer统计信息(3)--发现过期统计信息并处理 前言: 统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要 ...
- 第十二章——SQLServer统计信息(1)——创建和更新统计信息
原文:第十二章--SQLServer统计信息(1)--创建和更新统计信息 简介: 查询的统计信息: 目前为止,已经介绍了选择索引.维护索引.如果有合适的索引并实时更新统计信息,那么优化器会选择有用的索 ...
随机推荐
- Hadoop Shell命令字典
转载自:https://www.aboutyun.com//forum.php/?mod=viewthread&tid=6983&extra=page%3D1&page=1&a ...
- AcWing:241. 楼兰图腾(树状数组逆序对)
在完成了分配任务之后,西部314来到了楼兰古城的西部. 相传很久以前这片土地上(比楼兰古城还早)生活着两个部落,一个部落崇拜尖刀(‘V’),一个部落崇拜铁锹(‘∧’),他们分别用V和∧的形状来代表各自 ...
- 求ascii 然后做运算
介绍 ABC 返回每个字符的ascii A->65 B->66 C->77 组成656667 把所有的7替换成1 然后变成 656667 和 656661 每个数值做加法 然后做减法 ...
- 5.4.2 mapFile读写和索引
5.4.2 mapFile (1)定义 MapFile即为排序后的SequeneceFile,将sequenceFile文件按照键值进行排序,并且提供索引实现快速检索. (2)索引 索 ...
- 一文教你读懂Python中的异常信息
正文共:11813 字 2 图 预计阅读时间: 30 分钟 原文:https://realpython.com/python-traceback/ 译者:陈祥安 原文有所改动. 在写 Python 代 ...
- pwn学习日记Day8 基础知识积累
知识杂项 aslr:是一种针对缓冲区溢出的安全保护技术,通过对堆.栈.共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术 ...
- 如何单独编译Linux内核的某个模块?
1. 配置该模块为[M] 2. 编译 make modules SUBDIRS=./drivers/rtc (5.3的内核为make modules M=./drivers/rtc) 3. 安装 ma ...
- <JavaScript> 稳妥构造函数模式与工厂模式的区别
稳妥构造函数模式的代码应该是这样的: function Person(name, age, job) { var o = new Object(); // private members var na ...
- windows下使用eclipse远程编写hadoop配置
1.按照一般方法配置好hadoop伪分布式,注意core-site.xml和mapred-site.xml用IP,不要用localhost 2.格式化hdfs文件系统hadoop namenode - ...
- 图解 HTTP 笔记(五)——Web 服务器
该章的主要内容是讲解与 HTTP 协作的 Web 服务器 一.用单台虚拟主机实现多个域名 基于虚拟主机的功能,可以只使用一台物理机实现多个域名的网站部署. 在互联网上,域名通过 DNS 域名解析系统可 ...