本篇文章主要介绍外设(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接受处理中断。

淘宝店铺:https://osrc.taobao.com

官网论坛:www.osrc.cn

源码链接:http://pan.baidu.com/s/1kV0MLbp 密码:k9jl

第十二章 ZYNQ-MIZ701 PL中断请求的更多相关文章

  1. PRML读书会第十二章 Continuous Latent Variables(PCA,Principal Component Analysis,PPCA,核PCA,Autoencoder,非线性流形)

    主讲人 戴玮 (新浪微博: @戴玮_CASIA) Wilbur_中博(1954123) 20:00:49 我今天讲PRML的第十二章,连续隐变量.既然有连续隐变量,一定也有离散隐变量,那么离散隐变量是 ...

  2. <构建之法>第十一章、十二章有感

    十一章:软件设计与实现 工作时要懂得平衡进度和质量.我一直有一个困扰:像我们团队这次做 男神女神配 社区交友网,我负责主页的设计及内容模块,有个队友负责网站的注册和登录模块,有个队友负责搜索模块,有个 ...

  3. sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)

    第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的  DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...

  4. 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记

    第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...

  5. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  6. [CSAPP笔记][第十二章并发编程]

    第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟 ...

  7. perl5 第十二章 Perl5中的引用/指针

    第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用  子程序模板七.数组与子程序八.文件句 ...

  8. 第十二章——SQLServer统计信息(4)——在过滤索引上的统计信息

    原文:第十二章--SQLServer统计信息(4)--在过滤索引上的统计信息 前言: 从2008开始,引入了一个增强非聚集索引的新功能--过滤索引(filter index),可以使用带有where条 ...

  9. 第十二章——SQLServer统计信息(3)——发现过期统计信息并处理

    原文:第十二章--SQLServer统计信息(3)--发现过期统计信息并处理 前言: 统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要 ...

  10. 第十二章——SQLServer统计信息(1)——创建和更新统计信息

    原文:第十二章--SQLServer统计信息(1)--创建和更新统计信息 简介: 查询的统计信息: 目前为止,已经介绍了选择索引.维护索引.如果有合适的索引并实时更新统计信息,那么优化器会选择有用的索 ...

随机推荐

  1. Apache Flink - 基本API概念

    Flink程序是实现分布式集合转换的常规程序.集合最初是从源创建的.通过接收器(slink)返回结果,接收器可以将数据写到某个文件或stdout.Flink可以在各种环境(context)中运行,本地 ...

  2. Java并发指南3:并发三大问题与volatile关键字,CAS操作

    本文转载自互联网,侵删   序言 先来看如下这个简单的Java类,该类中并没有使用任何的同步. 01 final class SetCheck { 02 private int  a = 0; 03 ...

  3. tcpdump抓包文件分段保存-指定时间或者指定大小

    2018年09月06日 15:36:11 天已青色等烟雨来 阅读数:3628    版权声明:博客地址:blog.csdn.net/x356982611,未经允许不得转载,不得转载,不得转载 http ...

  4. error:Cannot pull with rebase

    原文文链接:https://blog.csdn.net/u012385190/article/details/70670213git 执行git pull –rebase报错误如下: error: C ...

  5. mudos源码分析

    错误捕捉相关的代码在simulate.c void throw_error() { )->framekind & FRAME_MASK) == FRAME_CATCH) { LONGJM ...

  6. IDEA配置虚拟机内存

    修改idea64.exe.vmoptions(64位电脑选择此文件) 一个例子,电脑内存8G,设置如下: -Xms1024m -Xmx4096m -XX:MaxPermSize=1024m -XX:R ...

  7. 【SQL】在数据库中发起http请求的小改进

    市面上常见的是用MSXML2.ServerXMLHTTP这个类,但这个类在发起异步请求时并不可靠,就是当send后并不一定会发出这个请求.这里推荐改用Microsoft.XMLHTTP,如果只是简单的 ...

  8. 让SNIPER-MXNet从标准的COCO格式数据集中直接使用file_name作为图片路径

    告别项目中“依index生成路径”的方法,直接使用我们在生成.json标签时就已经写入的图片路径(这里我写入的是绝对路径 full path)来获取图片. 需要做的,用以下代码替换SNIPER/lib ...

  9. OPC Utgard的数据访问方式

    1.同步读取某个点位的值 Item项的read()方法 Server server = new Server(BaseConfiguration.getCLSIDConnectionInfomatio ...

  10. 【Unsolved】线性时间选择算法的复杂度证明

    线性时间选择算法中,最坏情况仍然可以保持O(n). 原因是通过对中位数的中位数的寻找,保证每次分组后,任意一组包含元素的数量不会大于某个值. 普通的Partition最坏情况下,每次只能排除一个元素, ...