Zynq 7020笔记之 GPIO MIO 和EMIO的学习
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的学习的更多相关文章
- ZYNQ笔记(3):GPIO的使用(MIO、EMIO)——led灯
一.GPIO原理 1.GPIO介绍 程序员通过软件代码可以独立和动态地对每个 GPIO 进行控制,使其作为输入.输出或中断. (1)通过一个加载指令,软件可以读取一个 GPIO 组内所有 GPIO 的 ...
- ZYNQ 中PS端GPIO EMIO使用
ZYNQ 中PS端GPIO EMIO使用 在使用ZYNQ进行开发设计时,往往需要对一些GPIO引脚进行配置,传统的配置方法通常在PL端进行管脚约束之后在Verilog代码中对相应引脚进行配置.这样如果 ...
- 第七章 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 ...
- STL笔记(5)条款49:学习破解有关STL的编译器诊断信息
STL笔记(5)条款49:学习破解有关STL的编译器诊断信息 条款49:学习破解有关STL的编译器诊断信息 用一个特定的大小定义一个vector是完全合法的, vector<int> v( ...
- 深度学习课程笔记(十四)深度强化学习 --- Proximal Policy Optimization (PPO)
深度学习课程笔记(十四)深度强化学习 --- Proximal Policy Optimization (PPO) 2018-07-17 16:54:51 Reference: https://b ...
- Deep Learning论文笔记之(一)K-means特征学习
Deep Learning论文笔记之(一)K-means特征学习 zouxy09@qq.com http://blog.csdn.net/zouxy09 自己平时看了一些论文,但老感 ...
- UFLDL深度学习笔记 (三)无监督特征学习
UFLDL深度学习笔记 (三)无监督特征学习 1. 主题思路 "UFLDL 无监督特征学习"本节全称为自我学习与无监督特征学习,和前一节softmax回归很类似,所以本篇笔记会比较 ...
- Vue学习笔记-Django REST framework3后端接口API学习
一 使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7 (Windows x86- ...
- ZYNQ 7020学习笔记之PL侧普通信号中断PS的实验
1.参考 UG585 网络笔记 2.理论知识 见中断部分 3.实验目的 练习使用PL侧的普通信号来中断PS处理器. 4.实验过程 建立工程,设置并初始化串口中断,在运行程序之后,如果串口接收到N(1- ...
随机推荐
- DSL的概念
DSL:以极其高效的方式描述特定领域的对象.规则和运行方式的语言. 需要有特定的解释器与其配合. 高效简洁的领域语言,与通用语言相比能极大降级理解和使用难度,同时极大提高开发效率的语言. 能够描述特定 ...
- linux修改镜像
修改为163yum源-mirrors.163.com 1.首先备份系统自带yum源配置文件/etc/yum.repos.d/CentOS-Base.repo [root@localhost ~]# m ...
- Nginx 代理到Jetty 页面跳转端口改变问题
Nginx安装 Windows下部署Nginx只需下载安装包,解压启动服务器即可.下载官网:http://nginx.org/en/download.html 操作Nginx首先进入安装文件夹: 查看 ...
- isopod dsl 框架管理kubernetes 配置
isopod 是一个包含了丰富能力的dsl 框架我们可以不用编写yaml 文件来进行k8s 管理 说明 语法类似python,目前移植内置了一些不错的功能kube 方法 vault 集成,helm 集 ...
- trutle库的使用基础
turtle库的使用: 概括: turtle绘图体系:1969年诞生,主要用于程序设计入门 Python语言的标准库之一 入门级的图形绘制函数库 原理: turtle的原(wan)理(fa) (tur ...
- nginx之echo模块与内置变量
Nginx扩展第三方模块——echo 第三方模块是对nginx的功能扩展,第三方模块需要在编译nginx的时候使用参数--add-module=PATH指定扩展模块的源码包路径给Nginx扩展添加ec ...
- nginx rewrite规则说明
格式:rewrite regex replacement [flag] * rewrite配置可以在server.location以及if配置段内生效 * regex是用于匹配URI的正则表达式,其不 ...
- itext7 html转pdf实现
公司最近做一个交易所项目,里面涉及一个需求就是将html模板,在填充数据后转换为pdf,这样防止数据更改,下面是具体实现 1 pom文件 <dependency> <groupId& ...
- Lombok的使用详解与插件安装
JAVA面向对象编程中的封闭性和安全性.封闭性即对类中的域变量进行封闭操作,即用private来修饰他们,如此一来其他类则不能对该变量访问.这样我们就将这些变量封闭在了类内部,这样就提高了数据的安全性 ...
- 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 ...