ZYNQ学习笔记_GPIO实例:通过EMIO实现按键控制LED

  • 总体思路
    • Block Design界面配置IP核并导出硬件配置
    • 在SDK中编写C代码
    • 下载PS和PL的联合工程到开发板

总体思路

首先需要先导出硬件环境到SDK中。
因为是通过EMIO接口,所以这次要使用PL端的引脚,不只是单纯的PS端设计,导出前要生成Bit流并在导出时要勾选包含bit文件。

其次在SDK设计中要将一个引脚设置为输入,另一个设置为输出,并将输入读到的值传给输出。

(没有先做MIO的实例是因为PYNQ-Z2上没有PS端的LED和按键…

Block Design界面配置IP核并导出硬件配置

从0到1的配置过程在Hello World那一节已经讲过了,所以这里直接贴出不一样的部分。

勾选UART0,GPIO_MIO和GPIO_EMIO,勾选MIO是因为UART0(14、15)是PS端的引脚。

因为仅需要用到2个EMIO引脚,一个按键和一个LED,所以EMIO接口数量选择2。

确认后可以发现多了一个GPIO_0的接口。

同时,打开RTL原理图可以看到,GPIO_EMIO引脚是一个输入输出引脚,向内连接着两个三态门。

配置好后写约束文件将这两个引脚连接到PL端的LED和按键上,再生成bit流文件即可导出硬件配置,之后的开发则在SDK中进行。

需要注意的是导出时需要勾选包含bit流文件。

在SDK中编写C代码

废话不多说,先贴代码再做解释。

#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"#define GPIO_DEVICE_ID        XPAR_XGPIOPS_0_DEVICE_ID#define EMIO_LED            54
#define EMIO_key            55XGpioPs Gpio;XGpioPs_Config * ConfigPtr;int main(){printf("GPIO EMIO TEST!\n\r");u32 key_value;//根据器件的ID,查找器件的配置信息ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);//初始化GPIO驱动XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);//把GPIO的方向设置为输入(0:输入/1:输出)XGpioPs_SetDirectionPin(&Gpio, EMIO_key, 0);//把GPIO的方向设置为输出(0:输入/1输出)XGpioPs_SetDirectionPin(&Gpio, EMIO_LED, 1);//设置输出使能(0:关闭/1:打开)XGpioPs_SetOutputEnablePin(&Gpio, EMIO_LED, 1);while (1){key_value = XGpioPs_ReadPin(&Gpio,EMIO_key);XGpioPs_WritePin(&Gpio, EMIO_LED, key_value);}return 0;
}

下面对代码中的一些定义和函数做出说明

#define GPIO_DEVICE_ID       XPAR_XGPIOPS_0_DEVICE_ID

这是一个宏定义,按住Crtl并点击右边的XPAR_XGPIOPS_0_DEVICE_ID会跳转到xparameters.h头文件内,可以看到GPIO的ID为0,地址为0xE000A000。这让我想起了上一篇文章中的一句话:

软件通过一组存储映射(memory-mapped)的寄存器来控制GPIO

之后的一条代码正是通过这个ID来查询设备(GPIO)的地址

ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);

查到的这个0xE000A000地址和ID一起传给了ConfigPtr结构体指针,该结构体的定义如下:

typedef struct {u16 DeviceId;        /**< Unique ID of device */u32 BaseAddr;     /**< Register base address */
} XGpioPs_Config;

有了GPIO的配置信息,将GPIO通过XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);函数进行初始化。

初始化完毕就可以开始设置具体的GPIO引脚的输入输出了。

void XGpioPs_SetDirectionPin(const XGpioPs *InstancePtr, u32 Pin, u32 Direction)

该函数即可对引脚的输入输出进行配置,0为输入,1为输出。

之前我们对寄存器的知识学习时就知道,引脚配置为输出之后,还需要对引脚使能输出,即下面这个函数:

void XGpioPs_SetOutputEnablePin(const XGpioPs *InstancePtr, u32 Pin, u32 OpEnable)

下载PS和PL的联合工程到开发板

代码编写完毕后,要将工程下载到开发板上,之前因为仅有PS端所以只用右键工程文件夹后Run As→Launch On Hardware。现在除了要进行这个操作以外,还需要下载bit流文件到开发板,只需点击下面这个按钮。

ZYNQ学习笔记_GPIO实例:通过EMIO实现按键控制LED相关推荐

  1. ZYNQ学习笔记_GPIO之输入输出

    ZYNQ学习笔记_GPIO之输入输出 GPIO介绍 MIO介绍 EMIO介绍 控制GPIO接口的寄存器原理_输入输出部分 GPIO介绍 GPIO的英文全称为General-purpose input/ ...

  2. STM32学习笔记——EXTI外部中断,光敏传感器控制LED灯

    中断系统 中断:在主程序运行过程中,当出现了特定的中断触发条件,CPU就可以暂停当前正在运行的程序去处理中断程序,并把当前程序的地址压入堆栈,中断程序处理完成后把地址弹出堆栈,回到刚刚暂停的位置继续执 ...

  3. 28335学习笔记4——F28335之3*3按键控制(包含按键消抖和按键检测方法介绍)

    1.按键消抖 通常的按键所用开关为机械弹性开关,当机械触点断开. 闭合时, 电压信号如下图所示 由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开.在闭合和断开的瞬间均 ...

  4. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示: 1.1 首行加上/usr/bin/expect 1.2 spawn: 后面加上需要执行的shell命令,比如说 ...

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

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

  6. 51单片机学习笔记5 流水灯实现及蜂鸣器控制

    51单片机学习笔记5 流水灯实现及蜂鸣器控制 一.流水灯 1. 硬件电路 2. 代码实现 (1) 点亮一个LED的基本操作 (2) 使用算术左移实现流水灯 (3) 使用库文件左移函数 二.蜂鸣器 1. ...

  7. STM32F072 Nucleo笔记2-利用STM32CuBeMX创建工程并用按键控制LED的亮灭

    STM32F072 Nucleo学习笔记2-利用STM32CuBeMX创建工程并用按键控制LED的亮灭 本文例子用到: 1.  STM32F072 Nucleo开发板 2.  STM32CubeMX软 ...

  8. petalinux zynq spi_ZYNQ 系列 01 | PL 实现按键控制 LED(1)

    注:本篇文章由[开源骚客:OpenSoc]公众号首发,现转载至头条号. 新的开始,这一篇文章,就算是使用 Vitis 开发 ZYNQ 的第一篇文章吧. 计划把 ZYNQ 开发写成一个系列,所使用的的软 ...

  9. STM32学习:按键控制LED

    STM32学习:按键控制LED 文章目录 前言 一.所用知识点复习 1.stm32工作模式(*注意上下拉输入的区别*) 2.按键抖动与常见按键接法 按键抖动: 按键消抖: 常见按键接法: 3.GPIO ...

最新文章

  1. Linux下如何查看硬件信息?
  2. 第10课--10_04_LVM之二
  3. 防火墙(二)SNAT和DNAT
  4. javascript滚动文字
  5. TensorFlow Serving 尝尝鲜
  6. java跨用问题怎么解决_跨浏览器问题的五种解决方案
  7. 【语义分割】数据增强方法(原图与标签同时扩增)
  8. Go Web开发之Revel - 返回值
  9. 刷机精灵Android版V3.0,刷机精灵V3.0版发布,开启全新刷机时代
  10. 使用Python爬取百度热搜榜
  11. ios 融云 重写对话列表_iOS开发融云即时通讯集成详细步骤
  12. 2019年 CCF 中国计算机学会推荐国际学术会议和期刊目录 最新版
  13. 单片机实验:外部中断系统实验 如何1357,2468灯交替亮
  14. 共阳极数码管显示0~9_《显示器件应用分析精粹》之(3)数码管静态显示
  15. JAVA Oracle插入大量数据优化
  16. 木纹标识lisp_LISP架构中一种新的移动性管理方案研究
  17. 《弃子长安》第十一章 一路向西
  18. [再寄小读者之数学篇](2014-05-30 对数不等式)
  19. 【ELMAN预测】基于粒子群算法改进ELMAN动态递归神经网络实现数据预测matlab源码
  20. strcpy函数和strcat函数

热门文章

  1. Java设计模式之开闭原则(Open-Closed Principle)
  2. html div peidui,AirPods怎么删除配对过的设备 airpods可以和电脑连接的。
  3. 关于陌陌和微信表情页与输入法之间切换的问题
  4. 无影云桌面 1块钱体验
  5. XP下解决暗黑2全屏模式花屏问题
  6. vue.js的两个核心是什么
  7. Web Editor插件 网页在线编辑器
  8. 社交返利APP正在被返利机器人,普通返利APP集体围攻绞杀
  9. 如何更改计算机名称及查看自己计算机的型号
  10. 经典书籍《宽客》阅读心得