本篇文章主要介绍外设(PL)产生的中断请求,在PS端进行处理。 
在PL端通过按键产生中断,PS接受到之后点亮相应的LED.

本文所使用的开发板是zedboard
PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4

搭建硬件工程

建好工程后,添加ZYNQ IP

双击 ZYNQ,打开Re-customize IP对话框,使能IRQ_P2P

使能UART1

点击Run Connection Automation,按照如图所示配置,点击OK

添加一个GPIO IP,按照如图所示配置,使能中断。点击Run Connection Automation

再添加一个GPIO IP,按照如图所示配置,点击OK

把axi_gpio_0的ip2intc_irpt和ZYNQ PS的 IRQ_F2P[0:0]连在一起

搭建好的硬件系统连接,如图所示

生成顶层文件,点击Generate BitStream

软件工程

新建一个Hello World工程,把以下代码添加进去

 #include <stdio.h>
#include "platform.h"
#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 //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
#define DELAY 100000000 XGpio LED;
XGpio BTNInst;
XScuGic INTCInst;
static int btn_value; //Function protype
static void BTN_Intr_Handler(void *baseaddr_p);
static int InterruptSystemSetup(XScuGic *XScuGicInstancePtr);
static int IntcInitFunction(u16 DeviceId,XGpio *GpioInstancePtr); void BTN_Intr_Handler(void *InstancePtr)
{
unsigned char led_val=;
//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,);
switch(btn_value)
{
case : led_val = 0x01;break; //led[7:0]=0x01
case : led_val = 0x02;break;
case : led_val = 0x03;break; //亮1和2
case : led_val = 0x04;break;
case : led_val = 0x05;break; //亮0和2
default:break;
} XGpio_DiscreteWrite(&LED,,led_val);
//Acknowledge GPIO interrupts
(void)XGpio_InterruptClear(&BTNInst,BTN_INT);
//Enable GPIO interrupts
XGpio_InterruptEnable(&BTNInst,BTN_INT);
} 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,,0xff);
//设置LED IO 的方向为输出
XGpio_SetDataDirection(&LED,,0X00); //初始化中断控制器
status = IntcInitFunction(INTC_DEVICE_ID,&BTNInst);
if(status != XST_SUCCESS) return XST_FAILURE; while(){} return ;
} 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,);
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;
}

下载好之后,按键按下可以看到相应的LED被点亮

77.PS接收来自PL的按键中断的更多相关文章

  1. qt 实现的电视遥控系统,如何让qt响应来自遥控器的按键信息?

    结帖率 60% 如题:目前在做一个项目,使用qt实现一个类似于机顶盒的遥控系统,那么关键的问题来了,如何让qt响应遥控器的按键信息呢? 应该分两步吧:1.搭载qt的终端接收来自遥控器的按键信息,并解析 ...

  2. u-boot中断功能初步分析之---------按键中断

    作者:彭东林 邮箱:pengdonglin137@163.com QQ: 405728433 以前一直有个疑问,在U-boot下到底能不能使用中断,为了验证这个问题,于是乎,昨天晚上我在自己的 TQ2 ...

  3. 2、CC2541芯片中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~

    本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...

  4. nios II--实验4——按键中断硬件部分

    按键中断 硬件开发 新建原理图 1.打开Quartus II 11.0,新建一个工程,File -> New Project Wizard…,忽略Introduction,之间单击 Next&g ...

  5. ok6410按键中断编程,linux按键裸机

    6410按键中断编程 一.流程分析 外部中断控制寄存器(s3c6410x  359页) 1.EINTxCONy: 外部中断组x的第y个控制器.这个就是设置中断的触发方式.有5种触发方式. 2.EINT ...

  6. 【Android Developers Training】 33. 接收来自其它应用的简单数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. 在ZYNQ-7000平台上利用PS点亮PL上的LED灯

    在ZYNQ-7000平台上利用PS点亮PL上的LED灯 1.实验方案 图1    实验方案系统框图 2.具体步骤 2.1.vivado工程建立 ①打开vivado集成开发环境,点击“Create Pr ...

  8. ARM实验5 —— 按键中断实验

    key_int按键中断实验 实验内容: 通过开发板上的按键中断控制led灯进行跑马灯并打印信息. 通过简单事例说明猎户座4412处理器的GIC中断处理的应用,设置key2按键连接的引脚为中断模式,当识 ...

  9. ZigBee按键中断

    何为按键中断? 在了解按键中断之前,我们先来了解一下什么是中断?中断就是程序执行当前代码,当前任务的时候: 突然有自身函数或外部的影响,而使程序执行到别的任务再回来. 举个栗子: 当你在做饭的时候,电 ...

随机推荐

  1. Delphi ADOQuery多个参数重复 改编技巧

    今天看了多年前的一个帖子,发现回答不合理,有些还将其归为delphi的bug.其实主要是没有灵活应用参数. ADOQUERY查询时,这样不行,结果不正确. WITH ADOQUERY1 DO BEGI ...

  2. Java对象空间分配流程

    对象空间分配流程如下:   针对这个流程,分别解释一下每一个选项的使用场景. 栈上分配: 栈上分配的基础在于逃逸分析,逃逸分析可以得到三种对象的逃逸状态. 全局逃逸:一个对象的引用逃出了方法或者线程. ...

  3. 洛谷 P1560 蜗牛的旅行

    明显这是一道搜索题,其他题解写的有点复杂,我有更简便的写法 既然题目说走到不能再走,那我们就干脆一点,一条路走到黑,不到南墙不回头,一下把要走的路都走完,不但效率高,也好写,关键是大大节省了系统栈 一 ...

  4. C++解析(28):异常处理

    0.目录 1.C语言异常处理 2.C++中的异常处理 3.小结 1.C语言异常处理 异常的概念: 程序在运行过程中可能产生异常 异常(Exception)与 Bug 的区别 异常是程序运行时可预料的执 ...

  5. Stream My Contest UVA - 11865(带权最小树形图+二分最小值最大化)

    #include <iostream> #include <cstdio> #include <sstream> #include <cstring> ...

  6. [SCOI2016]幸运数字 线性基

    题面 题面 题解 题面意思非常明确:求树上一条链的最大异或和. 我们用倍增的思想. 将这条链分成2部分:x ---> lca , lca ---> y 分别求出这2个部分的线性基,然后合并 ...

  7. 洛谷 P1171 售货员的难题 【状压dp】

    题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率 ...

  8. kerberos中的spn详解

    0x01 SPN定义    服务主体名称(SPN)是Kerberos客户端用于唯一标识给特定Kerberos目标计算机的服务实例名称.Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联. ...

  9. 解题:HNOI 2012 永无乡

    题面 并查集维护连通性,然后暴力启发式合并就完了,记得合并时边DFS边清空数组 #include<cstdio> #include<cstring> #include<a ...

  10. 【bzoj3173】最长上升子序列

    Portal --> bzoj3173 Solution 感觉自己需要智力康复qwq 首先题目给的这个序列肯定是一个\(1-n\)的排列,并且插入的顺序是从小到大 仔细思考一下会发现如果知道了最 ...