77.PS接收来自PL的按键中断

本篇文章主要介绍外设(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工程,把以下代码添加进去

  1 #include <stdio.h>
  2 #include "platform.h"
  3 #include "xparameters.h"
  4 #include "xscugic.h"
  5 #include "xil_exception.h"
  6 #include "xgpio.h"
  7
  8 //parameter definitions
  9 #define INTC_DEVICE_ID    XPAR_PS7_SCUGIC_0_DEVICE_ID  //DEVICE_ID用来初始化函数,索引数组元素
 10 #define LED_DEVICE_ID     XPAR_AXI_GPIO_1_DEVICE_ID
 11 #define BTNS_DEVICE_ID    XPAR_AXI_GPIO_0_DEVICE_ID
 12 #define INTC_GPIO_INTERRUPT_ID    XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR
 13 #define BTN_INT    XGPIO_IR_CH1_MASK
 14 #define DELAY 100000000
 15
 16 XGpio LED;
 17 XGpio BTNInst;
 18 XScuGic    INTCInst;
 19 static int btn_value;
 20
 21 //Function protype
 22 static void BTN_Intr_Handler(void *baseaddr_p);
 23 static int InterruptSystemSetup(XScuGic *XScuGicInstancePtr);
 24 static int IntcInitFunction(u16 DeviceId,XGpio *GpioInstancePtr);
 25
 26 void BTN_Intr_Handler(void *InstancePtr)
 27 {
 28     unsigned char led_val=0;
 29     //Ignore additional button presses
 30     if((XGpio_InterruptGetStatus(&BTNInst) & BTN_INT) != BTN_INT)
 31     {
 32         return;
 33         //Disable GPIO interrupts
 34         XGpio_InterruptDisable(&BTNInst,BTN_INT);
 35     }
 36     btn_value = XGpio_DiscreteRead(&BTNInst,1);
 37     switch(btn_value)
 38     {
 39     case 1: led_val = 0x01;break;  //led[7:0]=0x01
 40     case 2:    led_val = 0x02;break;
 41     case 4:    led_val = 0x03;break; //亮1和2
 42     case 8:    led_val = 0x04;break;
 43     case 16:   led_val = 0x05;break; //亮0和2
 44     default:break;
 45     }
 46
 47     XGpio_DiscreteWrite(&LED,1,led_val);
 48     //Acknowledge GPIO interrupts
 49     (void)XGpio_InterruptClear(&BTNInst,BTN_INT);
 50     //Enable GPIO interrupts
 51     XGpio_InterruptEnable(&BTNInst,BTN_INT);
 52 }
 53
 54 int main(void)
 55 {
 56     int status;
 57
 58     //按键初始化
 59     status = XGpio_Initialize(&BTNInst,BTNS_DEVICE_ID);
 60     if(status != XST_SUCCESS) return XST_FAILURE;
 61
 62     //初始化LED
 63     status = XGpio_Initialize(&LED,LED_DEVICE_ID);
 64     if(status != XST_SUCCESS) return XST_FAILURE;
 65
 66     //设置按键IO的方向为输入
 67     XGpio_SetDataDirection(&BTNInst,1,0xff);
 68     //设置LED IO 的方向为输出
 69     XGpio_SetDataDirection(&LED,1,0X00);
 70
 71     //初始化中断控制器
 72     status = IntcInitFunction(INTC_DEVICE_ID,&BTNInst);
 73     if(status != XST_SUCCESS) return XST_FAILURE;
 74
 75     while(1){}
 76
 77     return 0;
 78 }
 79
 80 int IntcInitFunction(u16 DeviceId,XGpio *GpioInstancePtr)
 81 {
 82     XScuGic_Config *IntcConfig;
 83     int status;
 84
 85     //Interrupt controller initialization
 86     IntcConfig = XScuGic_LookupConfig(DeviceId);
 87     status = XScuGic_CfgInitialize(&INTCInst,IntcConfig,IntcConfig->CpuBaseAddress);
 88     if(status != XST_SUCCESS) return XST_FAILURE;
 89
 90     //Call interrupt setup function
 91     status = InterruptSystemSetup(&INTCInst);
 92     if(status != XST_SUCCESS) return XST_FAILURE;
 93
 94     //Register GPIO interrupt handler
 95     status = XScuGic_Connect(&INTCInst,INTC_GPIO_INTERRUPT_ID,(Xil_ExceptionHandler)BTN_Intr_Handler,(void *)GpioInstancePtr);
 96     if(status != XST_SUCCESS) return XST_FAILURE;
 97
 98     //Enable GPIO interrupts
 99     XGpio_InterruptEnable(GpioInstancePtr,1);
100     XGpio_InterruptGlobalEnable(GpioInstancePtr);
101
102     //Enable GPIO interrupts in the controller
103     XScuGic_Enable(&INTCInst,INTC_GPIO_INTERRUPT_ID);
104
105     return XST_SUCCESS;
106 }
107
108 int InterruptSystemSetup(XScuGic *XScuGicInstancePtr)
109 {
110     //Register GIC interrupt handler
111     Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,XScuGicInstancePtr);
112     Xil_ExceptionEnable();
113
114     return XST_SUCCESS;
115 }

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

时间: 2024-10-17 11:09:15

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

ZYNQ随笔——PL端按键中断之裸机设计

1. ZYNQ中断简述ZYNQ中断类型:普通中断请求(IRQ, Interrupt Request)和快速中断请求(FIQ, Fast Interrupt Request).ZYNQ中断源:软件中断(SGI, Software Generated Interrupt).CPU私有设备中断(PPI, Private Peripheral Interrupt)和共享设备中断(SPI, Shared Peripheral Interrupt).而PL端的按键中断属于共享设备中断.2. 硬件平台搭建在B

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

按键中断 硬件开发 新建原理图 1.打开Quartus II 11.0,新建一个工程,File -> New Project Wizard-,忽略Introduction,之间单击?Next>?进入下一步.分别设置工程工作目录.工程名称.这里需要注意的是工程工作目录中请使用英文,不要含有空格等,否则在后面使用Nios II IDE的时候会出现问题.设置好后如图1所示.然后进行下一步.这里工程命名为lab3_bnt 2.添加已经存在的文件,这里没有需要添加的文件,直接单击?Next>?进入

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

本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 中级教程-OSAL操作系统(OSAL系统解基本套路) 中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~ 中级教程-OSAL操作系统(ADC-光敏电阻) OSAL操作系统-实验16 串口波特率扩展 OSAL操作系统-实验1

STM32学习之路-按键中断测试(外部中断)

终于有时间再来学习STM32了~ 这几天都在忙着该死的考试.直接进入正题 开发板:奋斗V5 这个按键中断测试的要求是:按键2(K2)按下,LED2(V7)亮, 再一次按下就灭,循环.. 好,先看看按键和LED的原理图 好吧~ 虽然图截得不是很好看,但是能看到K2接的是PC2, LED2接的是PD6 ok,剩下的就是配置工作了.. 先来理一理思路: (1)初始化系统时钟 (2)初始化外部时钟(你所用到的东西) (3)配置LED (4)配置中断优先级 (5)配置外部中断线 (6)中断处理函数 恩,差

6.6410和210的按键中断编程

6.6410和210的按键中断编程 首先是打开6410底板原理图: 可以看到OK6410有六个按键: 可以看到OK6410的六个按键对应的引脚是KEYINT1.KEYINT2.KEYINT3.KEYINT4.KEYINT5和KEYINT6.接着在核心板的原理图里搜索这个词: 可以看到按键中断与GPN系列寄存器的引脚是互用的,接着就是在芯片手册里查看有关GPN系列寄存器的信息,重点是关注GPN控制寄存器:GPNCON: 这里我们使用到的按键对应的中断,需要配置成中断的方式,对应的GPN位设置为10

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

key_int按键中断实验 实验内容: 通过开发板上的按键中断控制led灯并打印信息. 通过简单事例说明猎户座4412处理器的GIC中断处理的应用,设置key2按键连接的引脚为中断模式,当识别按键被按下时进入相应的中断处理函数 实验目的: 熟悉开发环境的使用 掌握猎户座4412处理器的中断过程及编程. 实验平台: fs4412开发板,eclipse,secureCRT. 实验步骤: 1.查看key2在开发板的位置: 2.查看UART_RING在核心板的位置: 3.查看GPX1在芯片手册的位置:

【黑金ZYNQ7000系列原创视频教程】06.ZYNQ来自FPGA的中断&mdash;&mdash;按键中断实验

黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36640&extra=page%3D1 爱奇艺地址: http://www.iqiyi.com/w_19rugglzn1.html?source=

按键中断

原理 /* 按键          对应的IO寄存器     对应的中断引脚*/ /* K1             GPG0                 EINT8      */ /* K2             GPG3                 EINT11     */ /* K3             GPG5                 EINT13     */ /* K4             GPG6                 EINT14    

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

软件开发 首先,在硬件工程文件夹里面新建一个software的文件夹用于放置软件部分:打开toolsàNios II 11.0 Software Build Tools for Eclipse,需要进行Workspace Launcher(工作空间)路径的设置,需要注意的是路径中不要含有空格等,然后单击OK即可. ? 新建工程.单击File -> New ->?Nios II Application and BSP from Template,弹出Nios II Application and