1 参考

Xilinx ZYNQ 7000+Vivado2015.2系列(四)之GPIO的三种方式:MIO、EMIO、AXI_GPIO

2 理论指示

在PS侧,有PS自己的IO pin,称为MIO,共有54个(编号0-53)。如果PS侧IO不够使用,则可以通过扩展的方式来使用PL侧的IO。扩展方式有两中:EMIO和GPIO。 EMIO 方式可以将PL侧IO直接看作PS侧IO使用,只是编号从54-117. 而GPIO则没有数量限制。直接挂到AXI总线上就可以。





上图是EMIO和MIO的IO映射关系示意图。

对于MIO的使用。

MIO的例化在ZYNQ的Perpheral IO和IO Configuration中体现。

Perpheral IO中的0-43就是MIO的pin Number.这个Pin Number在SDK(C编程中)可以体现到。

3 实验目的

练习使用MIO,EMIO,GPIO等接口。

4 实验过程

建立工程,并初始化GPIO,EMIO等。然后:

当按下GPIO LED对应的KEY时,GPIO LED会进行亮灭转换;

当按下EMIO LED对应的KEY时,EMIO LED会进行亮灭转换;

当按下MIO LED对应的KEY时,MIO LED会进行亮灭转换;

5 实验平台

Microphase ZUS zynq7020 开发板。 串口使用 uart1[48,49]. DDR选择 MT41J256M16 RE-125,32bit. BANK1 = 1.8v.

同时对GPIO EMIO进行下图的设置。

EMIO,EMIO也是在Zynq的设置中进行设置的。





上图中的3代表EMIO的宽度,不管是input还是output都算在一起。然后对应的pin number会从54开始映射,到54+emio_width(eg.3)-1。假如在block design中 EMIO端名为ps_emio_port,则pin assignment 会从最低位开始映射,即ps_emio_port[0] = EMIO number 54. ps_emio_port[width-1] = EMIO Number 54+emio_width-1。

GPIO 是挂在PS_to_PL AXI 总线上的外设,比较简单。

6 Vivado 建立工程

block design 如下:

7、SDK的工程程序

#本例程是将GPIO,EMIO和MIO融合在一起的程序。
#include <stdio.h>
#include "platform.h"
#include "xgpio.h"
#include "xgpiops.h"
#include "xparameters.h"
#include <unistd.h> //sleep() usleep() ////// parameter define ,根据xparameters.h中的参数来定义每个AXI_GPIO外设的ID
#define KEY_GPIO_DEVICE_ID XPAR_AXI_GPIO_1_DEVICE_ID
#define LED_Auto_GPIO_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID
#define LED_key_GPIO_DEVICE_ID XPAR_AXI_GPIO_2_DEVICE_ID //定义EMIO的pin number,根据PL程序中port的高地位来映射。54对应最低位,依次累加。【重要】
#define KEY_iPinNumberEMIO 56
#define LED_Auto_iPinNumberEMIO 55
#define LED_Key_iPinNumberEMIO 54 //PL侧EMIO例化的端口的最低位,为端口54,然后依次向上排列 //定义MIO的pin number,根据zynq设定,是多少就定于多少。
#define KEY_iPinNumberMIO 47
#define LED_Auto_iPinNumberMIO 50
#define LED_Key_iPinNumberMIO 51 int main()
{ //定义 gpiO 所用参数
XGpio KEY_GpioInst;
XGpio LED_Auto_GpioInst;
XGpio LED_Key_GpioInst;
u32 led_Auto_gpio ;
u32 Key_gpio_value ; int key_gpio_status;
int led_auto_gpio_status;
int led_key_gpio_status;
int i; //定义EMIO所用参数,和MIO所用参数。
//使用EMIO 和MIO都需要对PS侧GPIO进行初始化,当两个都使用时只需要初始化一次就可以了,所以有些参数共同使用 static XGpioPs psGpioInstancePtr; //共用
XGpioPs_Config* GpioConfigPtr; //共用
u32 emio_Led;
int emio_status; //共用
u32 Key_EMIO_value ;
int j ; u32 mio_led ;
u32 Key_MIO_value ;
int k; //固定初始化。
init_platform(); // init gpio,并检测初始化之后的状态
key_gpio_status = XGpio_Initialize(&KEY_GpioInst ,KEY_GPIO_DEVICE_ID );
led_auto_gpio_status = XGpio_Initialize(&LED_Auto_GpioInst ,LED_Auto_GPIO_DEVICE_ID );
led_key_gpio_status = XGpio_Initialize(&LED_Key_GpioInst ,LED_key_GPIO_DEVICE_ID ); if(key_gpio_status == 0)
{
printf(" KEY GPIO init successful ! \r\n"); } else { printf(" KEY GPIO init Failed ! \r\n");
} if(led_auto_gpio_status == 0)
{
printf(" LED Auto GPIO init successful ! \r\n"); } else { printf(" LED Auto GPIO init Failed ! \r\n");
} if(led_key_gpio_status == 0)
{
printf(" LED KEY GPIO init successful ! \r\n"); } else { printf(" LED KEY GPIO init Failed ! \r\n");
} // 设置GPIO的方向,
XGpio_SetDataDirection(&KEY_GpioInst , 1, 1); // set as input
XGpio_SetDataDirection(&LED_Auto_GpioInst , 1, 0); // set as output
XGpio_SetDataDirection(&LED_Key_GpioInst , 1, 0); // set as output //并对output信号进行消隐(这里output接LED灯),最后的1为data.这里LED 为0时点亮。初始化之后设置为1,熄灭led.
XGpio_DiscreteWrite(&LED_Auto_GpioInst , 1, 1); ////消隐,初始化,关闭LED
XGpio_DiscreteWrite(&LED_Key_GpioInst , 1, 1); ////消隐,初始化,关闭LED // init ps侧GPIO (emio and mio ),并检测初始化状态。 GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
if(GpioConfigPtr == NULL) return XST_FAILURE ;
emio_status = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr,GpioConfigPtr->BaseAddr);
if(emio_status == XST_SUCCESS)
printf(" PS EMIO and MIO init successful ! \r\n");
else
printf(" PS EMIO and MIO init Failed ! \r\n"); // 设置EMIO的方向,
XGpioPs_SetDirectionPin(&psGpioInstancePtr,KEY_iPinNumberEMIO,0);
XGpioPs_SetDirectionPin(&psGpioInstancePtr,LED_Auto_iPinNumberEMIO,1);
XGpioPs_SetDirectionPin(&psGpioInstancePtr,LED_Key_iPinNumberEMIO,1);
//并对output信号进行消隐(这里output接LED灯),
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, LED_Auto_iPinNumberEMIO , 1);
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, LED_Key_iPinNumberEMIO , 1); //// 设置EMIO的方向,并对output信号进行消隐(这里output接LED灯)
XGpioPs_SetDirectionPin(&psGpioInstancePtr, KEY_iPinNumberMIO , 0);
XGpioPs_SetDirectionPin(&psGpioInstancePtr, LED_Auto_iPinNumberMIO , 1);
XGpioPs_SetDirectionPin(&psGpioInstancePtr, LED_Key_iPinNumberMIO , 1); XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, LED_Auto_iPinNumberMIO , 1);
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, LED_Key_iPinNumberMIO , 1); //对EMIO和MIO输出端口进行消隐。
XGpioPs_WritePin(&psGpioInstancePtr,LED_Auto_iPinNumberEMIO , 1); //消隐
XGpioPs_WritePin(&psGpioInstancePtr,LED_Key_iPinNumberEMIO , 1); //消隐
XGpioPs_WritePin(&psGpioInstancePtr,LED_Auto_iPinNumberMIO , 1); //消隐
XGpioPs_WritePin(&psGpioInstancePtr,LED_Key_iPinNumberMIO , 1); //消隐 printf("LED test Start ----> \n") ;
while(1)
{ printf("EMIO LED test Start ----> \n") ;
//EMIO所接的 LED1自动闪烁
printf(".......EMIO LED Auto test Start ........... \n") ;
for(j = 0; j < 5; j++)
{
for(emio_Led = 0; emio_Led < 2; emio_Led ++)
{
XGpioPs_WritePin(&psGpioInstancePtr,LED_Auto_iPinNumberEMIO,emio_Led); //取 最后一位
sleep(1);
}
}
XGpioPs_WritePin(&psGpioInstancePtr,LED_Auto_iPinNumberEMIO,1); //消隐 //当EMIO所接的开关被按下(低有效)之后,EMIO所接的LED2亮一会之后熄灭。
printf(".......wait EMIO KEY test Start ........... \n") ;
while(1)
{
Key_EMIO_value = XGpioPs_ReadPin(&psGpioInstancePtr ,KEY_iPinNumberEMIO)& 0x01;
if(Key_EMIO_value == 0x00)
{
printf(".......KEY EMIO have Pressed, LED KEY EMIO Turn on ....... \n") ;
XGpioPs_WritePin(&psGpioInstancePtr ,LED_Key_iPinNumberEMIO,0);
sleep(5);
break ;
}
}
XGpioPs_WritePin(&psGpioInstancePtr ,LED_Key_iPinNumberEMIO,1); //消隐 printf("GPIO LED test Start ----> \n") ; printf(".......LED Auto test Start ........... \n") ; for(i = 0; i < 5; i++)
{
for(led_Auto_gpio = 0; led_Auto_gpio < 2; led_Auto_gpio ++)
{
XGpio_DiscreteWrite(&LED_Auto_GpioInst,1, 1<<led_Auto_gpio);
sleep(1);
}
}
XGpio_DiscreteWrite(&LED_Auto_GpioInst , 1, 1); ////消隐 printf(".......Wait KEY GPIO Pressed ........... \n") ; while(1)
{
Key_gpio_value = XGpio_DiscreteRead(&KEY_GpioInst,1)& 0x01;
if(Key_gpio_value == 0x00)
{
printf(".......KEY GPIO have Pressed, LED KEY Turn on ....... \n") ;
XGpio_DiscreteWrite(&LED_Key_GpioInst,1,0);
sleep(5);
break ;
}
}
XGpio_DiscreteWrite(&LED_Key_GpioInst,1,1); //消隐 printf("MIO LED test Start ----> \n") ;
printf(".......LED MIO test Start ........... \n") ;
for(k = 0; k < 5; k++)
{
for(mio_led = 0; mio_led < 2; mio_led ++)
{
XGpioPs_WritePin(&psGpioInstancePtr,LED_Auto_iPinNumberMIO,mio_led); //取 最后一位
sleep(5); } }
XGpioPs_WritePin(&psGpioInstancePtr,LED_Auto_iPinNumberMIO,1); //消隐 printf(".......wait MIO KEY test Start ........... \n") ;
while(1)
{
Key_MIO_value = XGpioPs_ReadPin(&psGpioInstancePtr ,KEY_iPinNumberMIO)& 0x01;
if(Key_MIO_value == 0x00)
{
printf(".......KEY EMIO have Pressed, LED KEY EMIO Turn on ....... \n") ;
XGpioPs_WritePin(&psGpioInstancePtr ,LED_Key_iPinNumberMIO,0);
sleep(5);
break ;
}
}
XGpioPs_WritePin(&psGpioInstancePtr ,LED_Key_iPinNumberMIO,1); //消隐 } //结束时需要添加的。
cleanup_platform();
return 0 ; }

8 调试步骤

Zynq 7020笔记之 GPIO MIO 和EMIO的学习的更多相关文章

  1. ZYNQ笔记(3):GPIO的使用(MIO、EMIO)——led灯

    一.GPIO原理 1.GPIO介绍 程序员通过软件代码可以独立和动态地对每个 GPIO 进行控制,使其作为输入.输出或中断. (1)通过一个加载指令,软件可以读取一个 GPIO 组内所有 GPIO 的 ...

  2. ZYNQ 中PS端GPIO EMIO使用

    ZYNQ 中PS端GPIO EMIO使用 在使用ZYNQ进行开发设计时,往往需要对一些GPIO引脚进行配置,传统的配置方法通常在PL端进行管脚约束之后在Verilog代码中对相应引脚进行配置.这样如果 ...

  3. 第七章 ZYNQ-MIZ701 GPIO使用之EMIO

    7.0难度系数★☆☆☆☆☆☆ 7.1硬件截图 7.1.1 PCB上的位置 7.1.1 PCB上的位置 7.2电路分析 本次实验用到的是LD_A0~LD_A3,管脚定义如下表所示. LD_A0:F17 ...

  4. STL笔记(5)条款49:学习破解有关STL的编译器诊断信息

    STL笔记(5)条款49:学习破解有关STL的编译器诊断信息 条款49:学习破解有关STL的编译器诊断信息 用一个特定的大小定义一个vector是完全合法的, vector<int> v( ...

  5. 深度学习课程笔记(十四)深度强化学习 --- Proximal Policy Optimization (PPO)

    深度学习课程笔记(十四)深度强化学习 ---  Proximal Policy Optimization (PPO) 2018-07-17 16:54:51  Reference: https://b ...

  6. Deep Learning论文笔记之(一)K-means特征学习

    Deep Learning论文笔记之(一)K-means特征学习 zouxy09@qq.com http://blog.csdn.net/zouxy09          自己平时看了一些论文,但老感 ...

  7. UFLDL深度学习笔记 (三)无监督特征学习

    UFLDL深度学习笔记 (三)无监督特征学习 1. 主题思路 "UFLDL 无监督特征学习"本节全称为自我学习与无监督特征学习,和前一节softmax回归很类似,所以本篇笔记会比较 ...

  8. Vue学习笔记-Django REST framework3后端接口API学习

    一  使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7  (Windows x86- ...

  9. ZYNQ 7020学习笔记之PL侧普通信号中断PS的实验

    1.参考 UG585 网络笔记 2.理论知识 见中断部分 3.实验目的 练习使用PL侧的普通信号来中断PS处理器. 4.实验过程 建立工程,设置并初始化串口中断,在运行程序之后,如果串口接收到N(1- ...

随机推荐

  1. DSL的概念

    DSL:以极其高效的方式描述特定领域的对象.规则和运行方式的语言. 需要有特定的解释器与其配合. 高效简洁的领域语言,与通用语言相比能极大降级理解和使用难度,同时极大提高开发效率的语言. 能够描述特定 ...

  2. linux修改镜像

    修改为163yum源-mirrors.163.com 1.首先备份系统自带yum源配置文件/etc/yum.repos.d/CentOS-Base.repo [root@localhost ~]# m ...

  3. Nginx 代理到Jetty 页面跳转端口改变问题

    Nginx安装 Windows下部署Nginx只需下载安装包,解压启动服务器即可.下载官网:http://nginx.org/en/download.html 操作Nginx首先进入安装文件夹: 查看 ...

  4. isopod dsl 框架管理kubernetes 配置

    isopod 是一个包含了丰富能力的dsl 框架我们可以不用编写yaml 文件来进行k8s 管理 说明 语法类似python,目前移植内置了一些不错的功能kube 方法 vault 集成,helm 集 ...

  5. trutle库的使用基础

    turtle库的使用: 概括: turtle绘图体系:1969年诞生,主要用于程序设计入门 Python语言的标准库之一 入门级的图形绘制函数库 原理: turtle的原(wan)理(fa) (tur ...

  6. nginx之echo模块与内置变量

    Nginx扩展第三方模块——echo 第三方模块是对nginx的功能扩展,第三方模块需要在编译nginx的时候使用参数--add-module=PATH指定扩展模块的源码包路径给Nginx扩展添加ec ...

  7. nginx rewrite规则说明

    格式:rewrite regex replacement [flag] * rewrite配置可以在server.location以及if配置段内生效 * regex是用于匹配URI的正则表达式,其不 ...

  8. itext7 html转pdf实现

    公司最近做一个交易所项目,里面涉及一个需求就是将html模板,在填充数据后转换为pdf,这样防止数据更改,下面是具体实现 1 pom文件 <dependency> <groupId& ...

  9. Lombok的使用详解与插件安装

    JAVA面向对象编程中的封闭性和安全性.封闭性即对类中的域变量进行封闭操作,即用private来修饰他们,如此一来其他类则不能对该变量访问.这样我们就将这些变量封闭在了类内部,这样就提高了数据的安全性 ...

  10. The Five Qualities You Need in a Partner

    The Five Qualities You Need in a Partner Things I Never Considered Before Getting Married (But Shoul ...