zynq开发系列4:MIO按键中断控制LED
- 与实验三类似 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的头文件找到宏定义,设置参数IntrType
为XGPIOPS_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相关推荐
- 驱动——按键中断控制LED灯实验
三个按键实现按键中断 要求:按键按一下灯亮,再按一下灯灭 注:由于开发板位置,为了方便一一对应观察,采用key1控制LED3,key2控制LED2,key3控制LED1 0.添加相关设备树节点信息 ① ...
- 【嵌入式】按键中断控制 LED 跑马灯实验
[嵌入式]按键中断控制 LED 跑马灯实验 1. 操作内容 2. 原理解释 2.1 实验箱按键电路 2.2 实验箱LED电路 2.3 寄存器说明 3. 操作步骤 3.1 编写键控制 LED 代码,将代 ...
- STM32 HAL库 CubeMx 按键中断控制LED
依旧是使用Clion和CubeMx开发 实现功能 以中断的方式,通过按键控制 led灯的亮灭 按一下,灯亮.再按一下,灯灭. 一 新建工程 查看原理图 按键 PA15 LED灯 PA8 打开CubeM ...
- 【MSP430】MSP430F5529火箭板 --> 按键中断控制LED实验
实验目的: 测试评估板上的按键和LED 实验内容: 1.按下s1一次红灯亮1s后熄灭 2.快速按下s1两次绿灯亮1s后熄灭 bsp_led.h #ifndef _BSP_LED_H #de ...
- STM32按键中断控制led亮灭
仿真 本实验通过开发板上载有的3个按钮(KEY_UP.KEY0.KEY1),来控制板上的2个LED(DS0和DS1), 其中KEY0控制DS0,按一次亮,再按一次,就灭.KEY1控制DS1,效果同KE ...
- zynq开发系列5:通过AXI GPIO的中断实现PL端按键控制PS端LED(SDK开发详解)
axi_gpio是PL端gpio(FPGA资源搭建的软核),ps7_gpio是ps端gpio(硬核).打开Documentation的示例Examples,可知第二个是关于中断的示例.导入示例impo ...
- STM32中断控制LED灯亮灭
目录 一.中断介绍 1.中断分类 硬件中断(Hardware Interrupt) 软件中断(Software Interrupt) 2.中断优先级 3.中断源种类 4.中断响应原则 二.新建项目 1 ...
- zynq开发系列4:EMIO连接按键控制MIO连接的灯
EMIO是负责PL端和PS端通信,PL侧按键可以通过连接EMIO来控制连接到MIO的PS侧的LED.原理和实验3 zynq开发系列3:GPIO连接MIO通过按键控制LED灯亮起 类似,只是由MIO侧的 ...
- zynq开发系列3:GPIO连接MIO通过按键控制LED灯亮起
按键和LED由MIO连接,在PS端用按键控制LED,按键按下时发出信号,LED接收到信号后亮起 可以参考上一节实验 zynq开发系列2:GPIO连接MIO控制LED闪烁 的流程和代码,在vivado操 ...
最新文章
- 路印协议受邀参加澳洲新南威尔士政府孵化器Haymarket HQ分享论坛
- 19.04.27--作业 打字游戏
- 如何仅从SQL Server DateTime数据类型返回日期
- ios预支付系统 java_支付系统的预发布环境如何搭建
- firefox和chrome中 JQuery的ajax组件执行差异
- [转]重新分配内置存储空间 android手机
- hotelling变换_基于Hotelling-T²的偏最小二乘(PLS)中的变量选择
- 用好CloudIDE提升Web全栈编码效率
- sh mysql configure_【翻译自mos文章】使用config.sh/config.bat来configureorre-con
- Application page and Site page
- 【循序渐进学Python】4. Python中的序列——字典
- Zabbix学习(十七)zabbix low-level discover zabbix批量部署必备
- ffmpeg编码个参数的设置以及作用
- RGB_LED,WS2811彩带驱动设计
- pdf文档怎么转换成word格式,pdf转word的方法
- 基于R语言的数据分析报告
- Android:如何打开工程模式
- 旋转卡壳凸包(不用一下子就学完所有)
- 栈的实现(C语言版)
- 小程序,公众号微信客服消息开发
热门文章
- 移动应用开发专业简介(610212)
- 解决岛屿类问题(网格)通用解法DFS(附题)
- 【数据结构和算法笔记】线性表的查找(平均查找长度,二分法,判定树)
- java io图_JAVA IO流结构图
- Filebeat 将多个日志输出到不同的 Kafka Topic
- 曙光天阔服务器文档,曙光天阔服务器远程控制手册(附件).doc
- vscode设置背景图片
- Win10系统安装Oracle11g时遇到INS-13001环境不满足最低要求
- 期末数据结构复习的一点笔记
- oracle数据库基础测试,ORACLE数据库基础测试题oracle数据库复习题.docx