之前的Hello World和MIO使用都算是纯PS部分,也就是把Zynq单纯地当作ARM使用。很多人都是因为FPGA+ARM架构才使用的Zynq,有两个关键问题容易引起初学者的兴趣:(1).如何用PS控制PL;(2).如何完成PS与PL之间的数据通信。本系列会介绍解决这两个问题的各种方法。

EMIO就是PS控制PL资源的简单例子。EMIO就是可扩展的MIO,当与PS直接相连的MIO不够用时,可以使用EMIO做“扩展”。使用体会上,感觉就是ARM直接控制了PL部分的管脚。GPIO的bank2和bank3就是通过EMIO接口与PL相连的,本文将先通过PS控制PL部分流水灯的实例感受下EMIO的使用,然后再介绍EMIO相关的基本概念。


Zynq设计与代码详解

建立一个工程,配置好Zynq的时钟和DDR后,需要在MIO Configuration->I/O Peripherals->GPIO中选中EMIO GPIO。控制4个LED的流水,则EMIO GPIO(Width)选择4,相当于扩展了4个GPIO。


IP Integrator中选中GPIO_0,右键->Make External创建端口,如下图。

如果想修改添加端口名称,单击选中,在External Interface Properties窗口中修改(白板的中是不能修改的):

由于我们使用了PL中的管脚,所以必须要进行管脚约束。打开任一设计阶段的I/O Planning视图,在I/O Ports窗口中可以看到4个EMIO端口(都是inout双向端口)。根据硬件情况设置管脚号和电平标准,保存为XDC文件(当然也可以直接编辑XDC文件)。

生成bit流后导入到SDK中。SDK中新建工程,添加源文件,代码清单如下:

#include "xgpiops.h"
#include "sleep.h"XGpioPs GpioPs_Init()
{XGpioPs_Config* GpioConfigPtr;XGpioPs psGpioInstancePtr;GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);XGpioPs_CfgInitialize(&psGpioInstancePtr, GpioConfigPtr, GpioConfigPtr->BaseAddr);return psGpioInstancePtr;
}int main()
{static XGpioPs psGpioInstancePtr;psGpioInstancePtr = GpioPs_Init(psGpioInstancePtr);   //GPIO初始化//EMIO配置为输出XGpioPs_SetDirectionPin(&psGpioInstancePtr, 54,1);XGpioPs_SetDirectionPin(&psGpioInstancePtr, 55,1);XGpioPs_SetDirectionPin(&psGpioInstancePtr, 56,1);XGpioPs_SetDirectionPin(&psGpioInstancePtr, 57,1);//使能EMIO输出XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 54,1);XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 55,1);XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 56,1);XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 57,1);while(1){XGpioPs_WritePin(&psGpioInstancePtr, 54, 1);//EMIO的第0位输出1usleep(200000);    //延时XGpioPs_WritePin(&psGpioInstancePtr, 54, 0);//EMIO的第0位输出0usleep(200000);    //延时XGpioPs_WritePin(&psGpioInstancePtr, 55, 1);//EMIO的第1位输出1usleep(200000);    //延时XGpioPs_WritePin(&psGpioInstancePtr, 55, 0);//EMIO的第1位输出0usleep(200000);    //延时XGpioPs_WritePin(&psGpioInstancePtr, 56, 1);//EMIO的第2位输出1usleep(200000);    //延时XGpioPs_WritePin(&psGpioInstancePtr, 56, 0);//EMIO的第2位输出0usleep(200000);    //延时XGpioPs_WritePin(&psGpioInstancePtr, 57, 1);//EMIO的第3位输出1usleep(200000);    //延时XGpioPs_WritePin(&psGpioInstancePtr, 57, 0);//EMIO的第3位输出0usleep(200000);    //延时}return 0;
}

用到的API函数与上一篇MIO的完全相同,不再赘述。不过注意54个MIO占用的管脚号为053;64个EMIO占用的管脚号为54117。这次用的延时函数为usleep,该函数输入参数为long型,延时以微妙为单位。


EMIO介绍


关于GPIO的相关概念已经在上一篇中讲述。EMIO只是GPIO信号的bank2、bank3与PL部分连接的接口,使用的寄存器接口与MIO的完全相同。这里对有差别的相关操作进行补充说明。

  • 输入是来自PL的连线,与输出值或OEN寄存器无关。若DIRM设置为0,可以从DATA_RO寄存器中读取输入值。
  • 输出不支持三态,因此不受OEN寄存器的控制。输出时将DIRM设置为1,使用DATA、MASK_DATA_LSW、MASK_DATA_MSK寄存器配置输出值。
  • 输出使能线由PS输出到PL,这些使能线受到DIRM和OEN寄存器的控制,如EMIOGPIOTN[x]=DIRM[X]&OEN[X]。

EMIO的I/O不能与MIO的I/O连接在一起的:EMIO的输入不能与MIO的输出接在一起;MIO的输入也不能与EMIO的输出结在一起。这是因为它们对应的GPIO属于不同的bank,每个bank都是独立的。


总结

本系列4-5篇介绍了Zynq中GPIO的使用,包括MIO和EMIO。UG585中还详细介绍了GPIO的各种操作流程和示例,但在SDK中实际编程时,已经有了封装好的库函数,一般学习这些函数的用法即可。此外,每个GPIO都可以使用中断功能,这部分内容在后面用到时再做介绍。

学会Zynq(5)GPIO中EMIO的使用方法相关推荐

  1. ZYNQ之GPIO机制

    目录 一.简介 二.MIO 三.EMIO 四.AXI GPIO 五.相关函数介绍 1.MIO / EMIO ① GPIO配置以及初始化 ②GPIO操作函数集 2.AXI GPIO ① GPIO配置以及 ...

  2. zynq PS端通过EMIO访问PL资源

    最近在研究zynq 中EMIO的使用,看了许多文章都是裸跑的,没有将zynq ARM的功能发挥出来,此处将介绍如何在linux下操作PL的资源,本文通过gpio-leds驱动操作emio管脚进行点灯实 ...

  3. 基于Zynq的MIO与EMIO的区别和应用

    MIO与EMIO的区别与应用 1 MIO与EMIO概念 MIO:多功能IO接口,属于Zynq的PS部分,在芯片外部有54个引脚.这些引脚可以用在GPIO.SPI.UART.TIMER.Ethernet ...

  4. 学会Zynq(2)Zynq-7000处理器的配置详解

    上篇中介绍了Xilinx FPGA嵌入式开发的基本概念和软件特性,并以Hello World为例给出了一个操作流程,熟悉该流程相当重要.上一篇中只是简单说明了每一步应该执行哪些操作,本文将详细介绍每一 ...

  5. 学会Zynq(22)XADC测量片内温度与电源电压

    本文将介绍如何在PS中调用Zynq内部的XADC模块进行片内温度和电源电压测量.先了解XADC的相关知识,再通过实例体会XADC的用法,学习XADC API函数的使用. XADC介绍 XADC中文全称 ...

  6. 一篇文章教你学会如何使用CSS中的雪碧图(CSS Sprite)

    一篇文章教你学会如何使用CSS中的雪碧图(CSS Sprite) 一.什么是雪碧图? 雪碧图(CSS Sprite)又叫CSS精灵图,是一种网页图片应用处理方式,他允许你将一个页面设计到 所有零星图片 ...

  7. 瞬间教你学会使用java中list的retainAll方法

    retainAll方法简介 当我们有两个list集合的时候,我们可以使用retainAll方法求得两个list集合的子集.retainAll是Collection接口中提供的一个方法,各个实现类有自己 ...

  8. 冯·诺伊曼奖得主Jorge Nocedal:增强学习中零阶优化方法及其应用(附演讲视频和PPT)

    2020 北京智源大会 本文属于2020北京智源大会嘉宾演讲的整理报道系列.北京智源大会是北京智源人工智能研究院主办的年度国际性人工智能高端学术交流活动,以国际性.权威性.专业性和前瞻性的" ...

  9. 一文详解科研中的Paper阅读方法!!!

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 前言 论文阅读一直是科研过程中至关重要的一环,如何收集论文,快速选取和课题匹配的论 ...

最新文章

  1. 确定Java开发中.jar包的JDK版本
  2. java的基础类库称为_JAVA基本类库介绍
  3. HTML5中如何检查浏览器是否支持本地存储
  4. php mvc 逻辑层在哪,mvc的业务逻辑应该放哪里?
  5. 程序员最常用的7大编程实战网站,阿里腾讯面试题也用它!
  6. 北外发布2019就业质量报告,超50人就业于外交部,本科生平均年薪12.2万
  7. __attribute__((visibility()))
  8. 修改Ubuntu系统的用户名和主机名、创建和删除用户
  9. 点击按钮跳转页面_获取快手主页跳转url scheme 协议的方法(app通用方法)
  10. Java枚举介绍_java枚举使用详细介绍及实现
  11. 骆驼IPTV后端源码+前端APP
  12. MPU6050六轴传感器
  13. 浏览器主页被篡改解决方法
  14. AI上推荐 之 NeuralCF与PNN模型(改变特征交叉方式)
  15. 27岁计算机考研,男生27岁研究生毕业真的晚吗?
  16. javax.faces.FacesException: Unable to find CDI BeanManager的解决方法
  17. 实现一个简单的类似于手电筒的功能@[电灯泡]
  18. JKS 密钥库使用专用格式。建议使用 “xxx“ 迁移到行业标准格式 PKCS12
  19. 原生Android平板,Remix OS 深入动手玩,这是一个改变 Android 平板使用体验的好系统...
  20. java调用快递物流接口api

热门文章

  1. MouseEvent代替initMouseEvent
  2. 计算机网络安全——密码学
  3. 【动手教你学ChatGPT:爆款小红书文案生成】
  4. [论文翻译] Devign: Effective Vulnerability Identification by Learning Comprehensive Program Semantics
  5. oracle 导出blob,Oracle 批量导出Blob文件
  6. 暴力破解凯撒加密(未知密钥时)
  7. 支持HTML的邮箱,Yeah.net邮箱全面支持HTML5
  8. 报错std::__1::basic_stringchar, std::__1::char_traitschar, std::__1::allocatorchar ::at(unsigne
  9. ASP.NET MVC基础数据的处理
  10. insert into 自增 mysql_mysql执行insert into时插入自增字段不输入所有列的办法