• 与实验三类似 zynq开发系列3:GPIO连接MIO通过按键控制LED灯亮起 ,PS部分设置为与实验一helloword相同的最小系统,但按键控制LED的方式设置为中断,即通过按下按键为中断这一方式从GPIO引脚上读数据。原理可以看这两篇文章 zynq文档阅读之GPIO的中断 和 zynq阅读文档之通过中断读GPIO输入的编程指导。可以直接把代码粘贴进SDK的main.c里,具体编写部分可以继续往下看。感谢正点原子B站发布的视频【第二期】手把手教你学ZYNQ之嵌入式开发篇。
#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID
// GPIO的中断号 52
#define GPIO_INTERRUPT_ID XPAR_XGPIOPS_0_INTR// 核心板上PS端LED
#define MIO0_LED 7
// PS端按键 KEY
#define MIO12_KEY 50XGpioPs_Config * ConfigPtr;
XScuGic_Config * IntcConfig;XGpioPs Gpio;
XScuGic Intc;void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio, u16 GpioIntrId);
void IntrHandler();u32 key_press = 0;int main() {u32 led_value = 0;printf("GPIO INTERRUPT TEST.\n\r");// 根据器件的ID,查找器件的配置信息ConfigPtr= XGpioPs_LookupConfig(GPIO_DEVICE_ID);// 初始化GPIO驱动XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);// 把GPIO的方向设置为输出(0:输入 / 1:输出)XGpioPs_SetDirectionPin(&Gpio, MIO0_LED, 1);// 把GPIO的方向设置为输入(0:输入 / 1:输出)XGpioPs_SetDirectionPin(&Gpio, MIO12_KEY, 0);// 设置输出使能(0:关闭 / 1:打开)XGpioPs_SetOutputEnablePin(&Gpio, MIO0_LED, 1);// 设置中断系统SetupInterruptSystem(&Intc, &Gpio, GPIO_INTERRUPT_ID);XGpioPs_WritePin(&Gpio, MIO0_LED, led_value);while(1){if(key_press) {led_value = ~led_value;key_press = 0;// 清除之前的中断状态 (写1时清除)XGpioPs_IntrClearPin(&Gpio, MIO12_KEY);// 将led_value的值写入LEDXGpioPs_WritePin(&Gpio, MIO0_LED, led_value);// 延时消抖usleep(200000);XGpioPs_IntrEnablePin(&Gpio, MIO12_KEY);}
//        else
//          printf("led_value = %0x.\n\r", led_value);}return 0;
}void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio,u16 GpioIntrId)
{// 查找GIC器件配置信息,并进行初始化IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);XScuGic_CfgInitialize(GicInstancePtr, IntcConfig, IntcConfig->CpuBaseAddress);// 初始化ARM处理器异常句柄Xil_ExceptionInit();// 来给 IRQ 异常注册处理程序Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler) IntrHandler,(void *)Gpio);// 使能处理器的中断Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);// 关联中断处理函数XScuGic_Connect(GicInstancePtr, GpioIntrId,(Xil_ExceptionHandler)IntrHandler,(void *)Gpio);// 为GPIO器件使能中断XScuGic_Enable(GicInstancePtr, GpioIntrId);// 设置MIO引脚中断触发类型:下降沿 修改为上升沿XGpioPs_SetIntrTypePin(Gpio, MIO12_KEY, XGPIOPS_IRQ_TYPE_EDGE_RISING);// 打开MIO引脚中断使能信号XGpioPs_IntrEnablePin(Gpio, MIO12_KEY);
}void IntrHandler(){printf("interrupt detected!\n\r");key_press = 1;XGpioPs_IntrDisablePin(&Gpio, MIO12_KEY);
}

  • 打开 GpioIntrExample() 可以看到核心语句 SetupInterruptSystem(Intc, Gpio, GPIO_INTERRUPT_ID);

  • xgpiops_intr_example.c 里自定义的 SetupInterruptSystem() 函数,GIC是通用中断控制器,GpioIntrId是中断ID

/*****************************************************************************/
/**
*
* This function sets up the interrupt system for the example. It enables falling
* edge interrupts for all the pins of bank 0 in the GPIO device.
*
* @param   GicInstancePtr is a pointer to the XScuGic driver Instance.
* @param   GpioInstancePtr contains a pointer to the instance of the GPIO
*       component which is going to be connected to the interrupt
*       controller.
* @param   GpioIntrId is the interrupt Id and is typically
*       XPAR_<GICPS>_<GPIOPS_instance>_VEC_ID value from
*       xparameters.h.
*
* @return  XST_SUCCESS if successful, otherwise XST_FAILURE.
*
* @note        None.
*
****************************************************************************/
static int SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio,u16 GpioIntrId)
{int Status;XScuGic_Config *IntcConfig; /* Instance of the interrupt controller */Xil_ExceptionInit();/** Initialize the interrupt controller driver so that it is ready to* use.*/IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);if (NULL == IntcConfig) {return XST_FAILURE;}Status = XScuGic_CfgInitialize(GicInstancePtr, IntcConfig,IntcConfig->CpuBaseAddress);if (Status != XST_SUCCESS) {return XST_FAILURE;}/** Connect the interrupt controller interrupt handler to the hardware* interrupt handling logic in the processor.*/Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,GicInstancePtr);/** Connect the device driver handler that will be called when an* interrupt for the device occurs, the handler defined above performs* the specific interrupt processing for the device.*/Status = XScuGic_Connect(GicInstancePtr, GpioIntrId,(Xil_ExceptionHandler)XGpioPs_IntrHandler,(void *)Gpio);if (Status != XST_SUCCESS) {return Status;}/* Enable falling edge interrupts for all the pins in bank 0. */XGpioPs_SetIntrType(Gpio, GPIO_BANK, 0x00, 0xFFFFFFFF, 0x00);/* Set the handler for gpio interrupts. */XGpioPs_SetCallbackHandler(Gpio, (void *)Gpio, IntrHandler);/* Enable the GPIO interrupts of Bank 0. */XGpioPs_IntrEnable(Gpio, GPIO_BANK, (1 << Input_Pin));/* Enable the interrupt for the GPIO device. */XScuGic_Enable(GicInstancePtr, GpioIntrId);/* Enable interrupts in the Processor. */Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);return XST_SUCCESS;
}
  • 先解决 SetupInterruptSystem(Intc, Gpio, GPIO_INTERRUPT_ID);GPIO_INTERRUPT_ID 这个参数,可以知道这是中断ID

  • 打开GPIO_INTERRUPT_ID这个常数定义可以知道值为52,这是GPIO的中断号52

  • SetupInterruptSystem(Intc, Gpio, GPIO_INTERRUPT_ID);Intc 这个参数,在xgpiops_intr_example.c里main函数可以看见调用方式 GpioIntrExample(&Intc, &Gpio, GPIO_DEVICE_ID, GPIO_INTERRUPT_ID);,查看宏定义类似Gpio这是中断控制器的驱动实例,包含在头文件xscugic.h里


在main函数里添加对中断系统的设置

// 设置中断系统
SetupInterruptSystem(&Intc, &Gpio, GPIO_INTERRUPT_ID);

  • SetupInterruptSystem() 函数进行修改,首先把 XScuGic_Config *IntcConfig; /* Instance of the interrupt controller */XGpioPs_Config * ConfigPtr 放一起
  • 查看函数 Xil_ExceptionInit();初始化ARM异常句柄
  • 与xgpiops类似,熟悉的 LookupConfig()CfgInitialize() 函数,查找GIC器件配置信息,并进行初始化
  • IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);INTC_DEVICE_ID 的定义
  • Xil_Exception 三个函数用于初始化并设置ARM处理器的异常功能。XIL_EXCEPTION_ID_INT用于标识中断请求(IRQ)异常,Xil_ExceptionRegisterHandler() 用于给IRQ异常注册处理程序,将中断控制器GIC的中断程序和ARM处理器中硬件中断逻辑连接起来。调用Xil_ExceptionEnableMask()使能处理器中断
// 初始化ARM处理器异常句柄
Xil_ExceptionInit();
// 来给 IRQ 异常注册处理程序
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler) IntrHandler,(void *)Gpio);
// 使能处理器的中断
Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);

  • XScuGic_Connect() 关联需要调用的中断处理函数。当外部中断来临时,需要跳到中断处理函数里处理中断,处理完成后回到原来程序继续运行
  • 函数 XGpioPs_SetIntrType() 配置整个Bank,修改为设置单个引脚 XGpioPs_SetIntrTypePin()。根据注释在xgpiops.h的头文件找到宏定义,设置参数 IntrTypeXGPIOPS_IRQ_TYPE_EDGE_FALLING
  • 函数 XGpioPs_SetCallbackHandler() 用于设置回调函数的句柄为自己编写的中断服务函数 IntrHandler()。如函数XScuGic_Connect(GicInstancePtr, GpioIntrId, (Xil_ExceptionHandler)XGpioPs_IntrHandler, (void *)Gpio); 中的 (Xil_ExceptionHandler)XGpioPs_IntrHandler 给GIC设置中断服务函数,最终指向 IntrHandler(),故两句可以合并为
 Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler) IntrHandler,(void *)Gpio);

  • XGpioPs_IntrEnable()对整个bank设置使能信号修改为对某个引脚设置使能信号 XGpioPs_IntrEnablePin()
  • XScuGic_Enable() 为GPIO器件使能中断,可以和 XScuGic_Connect() 放一起
// 关联中断处理函数
XScuGic_Connect(GicInstancePtr, GpioIntrId,(Xil_ExceptionHandler)IntrHandler,(void *)Gpio);
// 为GPIO器件使能中断
XScuGic_Enable(GicInstancePtr, GpioIntrId);

  • Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ); 使能处理器中断
/* Enable interrupts in the Processor. */
Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
  • 定义 IntrHandler() 函数,定义按键按下这一事件时 key_press = 1;,根据中断程序编写的步骤,执行完中断后用 XGpioPs_IntrDisablePin() 把中断屏蔽掉
void IntrHandler(){printf("interrupt detected!\n\r");key_press = 1;XGpioPs_IntrDisablePin(&Gpio, MIO12_KEY);
}

  • 编写自己定义的 SetupInterruptSystem() 函数如下
void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio,u16 GpioIntrId)
{// 查找GIC器件配置信息,并进行初始化IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);XScuGic_CfgInitialize(GicInstancePtr, IntcConfig, IntcConfig->CpuBaseAddress);// 初始化ARM处理器异常句柄Xil_ExceptionInit();// 来给 IRQ 异常注册处理程序Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler) IntrHandler,(void *)Gpio);// 使能处理器的中断Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);// 关联中断处理函数XScuGic_Connect(GicInstancePtr, GpioIntrId,(Xil_ExceptionHandler)IntrHandler,(void *)Gpio);// 为GPIO器件使能中断XScuGic_Enable(GicInstancePtr, GpioIntrId);// 设置MIO引脚中断触发类型:下降沿 修改为上升沿XGpioPs_SetIntrTypePin(Gpio, MIO12_KEY, XGPIOPS_IRQ_TYPE_EDGE_RISING);// 打开MIO引脚中断使能信号XGpioPs_IntrEnablePin(Gpio, MIO12_KEY);
}

zynq开发系列4:MIO按键中断控制LED相关推荐

  1. 驱动——按键中断控制LED灯实验

    三个按键实现按键中断 要求:按键按一下灯亮,再按一下灯灭 注:由于开发板位置,为了方便一一对应观察,采用key1控制LED3,key2控制LED2,key3控制LED1 0.添加相关设备树节点信息 ① ...

  2. 【嵌入式】按键中断控制 LED 跑马灯实验

    [嵌入式]按键中断控制 LED 跑马灯实验 1. 操作内容 2. 原理解释 2.1 实验箱按键电路 2.2 实验箱LED电路 2.3 寄存器说明 3. 操作步骤 3.1 编写键控制 LED 代码,将代 ...

  3. STM32 HAL库 CubeMx 按键中断控制LED

    依旧是使用Clion和CubeMx开发 实现功能 以中断的方式,通过按键控制 led灯的亮灭 按一下,灯亮.再按一下,灯灭. 一 新建工程 查看原理图 按键 PA15 LED灯 PA8 打开CubeM ...

  4. 【MSP430】MSP430F5529火箭板 --> 按键中断控制LED实验

    实验目的:   测试评估板上的按键和LED 实验内容:   1.按下s1一次红灯亮1s后熄灭   2.快速按下s1两次绿灯亮1s后熄灭 bsp_led.h #ifndef _BSP_LED_H #de ...

  5. STM32按键中断控制led亮灭

    仿真 本实验通过开发板上载有的3个按钮(KEY_UP.KEY0.KEY1),来控制板上的2个LED(DS0和DS1), 其中KEY0控制DS0,按一次亮,再按一次,就灭.KEY1控制DS1,效果同KE ...

  6. zynq开发系列5:通过AXI GPIO的中断实现PL端按键控制PS端LED(SDK开发详解)

    axi_gpio是PL端gpio(FPGA资源搭建的软核),ps7_gpio是ps端gpio(硬核).打开Documentation的示例Examples,可知第二个是关于中断的示例.导入示例impo ...

  7. STM32中断控制LED灯亮灭

    目录 一.中断介绍 1.中断分类 硬件中断(Hardware Interrupt) 软件中断(Software Interrupt) 2.中断优先级 3.中断源种类 4.中断响应原则 二.新建项目 1 ...

  8. zynq开发系列4:EMIO连接按键控制MIO连接的灯

    EMIO是负责PL端和PS端通信,PL侧按键可以通过连接EMIO来控制连接到MIO的PS侧的LED.原理和实验3 zynq开发系列3:GPIO连接MIO通过按键控制LED灯亮起 类似,只是由MIO侧的 ...

  9. zynq开发系列3:GPIO连接MIO通过按键控制LED灯亮起

    按键和LED由MIO连接,在PS端用按键控制LED,按键按下时发出信号,LED接收到信号后亮起 可以参考上一节实验 zynq开发系列2:GPIO连接MIO控制LED闪烁 的流程和代码,在vivado操 ...

最新文章

  1. 路印协议受邀参加澳洲新南威尔士政府孵化器Haymarket HQ分享论坛
  2. 19.04.27--作业 打字游戏
  3. 如何仅从SQL Server DateTime数据类型返回日期
  4. ios预支付系统 java_支付系统的预发布环境如何搭建
  5. firefox和chrome中 JQuery的ajax组件执行差异
  6. [转]重新分配内置存储空间 android手机
  7. hotelling变换_基于Hotelling-T²的偏最小二乘(PLS)中的变量选择
  8. 用好CloudIDE提升Web全栈编码效率
  9. sh mysql configure_【翻译自mos文章】使用config.sh/config.bat来configureorre-con
  10. Application page and Site page
  11. 【循序渐进学Python】4. Python中的序列——字典
  12. Zabbix学习(十七)zabbix low-level discover zabbix批量部署必备
  13. ffmpeg编码个参数的设置以及作用
  14. RGB_LED,WS2811彩带驱动设计
  15. pdf文档怎么转换成word格式,pdf转word的方法
  16. 基于R语言的数据分析报告
  17. Android:如何打开工程模式
  18. 旋转卡壳凸包(不用一下子就学完所有)
  19. 栈的实现(C语言版)
  20. 小程序,公众号微信客服消息开发

热门文章

  1. 移动应用开发专业简介(610212)
  2. 解决岛屿类问题(网格)通用解法DFS(附题)
  3. 【数据结构和算法笔记】线性表的查找(平均查找长度,二分法,判定树)
  4. java io图_JAVA IO流结构图
  5. Filebeat 将多个日志输出到不同的 Kafka Topic
  6. 曙光天阔服务器文档,曙光天阔服务器远程控制手册(附件).doc
  7. vscode设置背景图片
  8. Win10系统安装Oracle11g时遇到INS-13001环境不满足最低要求
  9. 期末数据结构复习的一点笔记
  10. oracle数据库基础测试,ORACLE数据库基础测试题oracle数据库复习题.docx