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. 安装Matlab出现弹出DVD1插入DVD2的提示怎么办?

    此使,找到DVD1光驱,右键弹出,然后回到dvd2.iso文件右键装载,回到matlab安装页面,对提示框“弹出DVD1插入DVD2”点击确定,安装即可继续进行.

  2. node 进程管理 child_process [spawn,exec] | 珠峰培训node正式课 网络爬虫

    run.js ; function set(){ i++ setTimeout(function(){ console.log(i) ){ set(); } },) }set(); child_pro ...

  3. day004-python运算符与基本数据类型

    一.运算符1.算术运算符:主要用于两个对象算数计算(加减乘除等运算)运算符: +:两个对象相加 -:得到负数或是一个数减去另一个数 *:两个数相乘或是返回一个被重复若干次的字符串 /:x除以y %:返 ...

  4. html css div固定底部

    <div id="father"> <footer></footer> </div> #father{ position:relat ...

  5. 常见WinDbg问题及解决方案

    当你调试一个程序时,你最不想处理的是调试器不能正常工作.当你试图集中精力跟踪一个bug时,总是会因为次要的问题而被忽略,尤其是当调试器的问题导致你失去一个重新编程或者浪费了大量的时间等待调试器完成它, ...

  6. [PHP] Laravel 5.5 打印SQL语句

    [PHP] Laravel 5.5 打印SQL语句 四种方法 第一种方法: 打印SQL默认是关闭的,需要在/vendor/illuminate/database/Connection.php中打开. ...

  7. Lucene创建索引和索引的基本检索(Lucene 之 Hello World)

    Author: 百知教育 gaozhy  注:演示代码所使用jar包版本为 lucene-xxx-5.2.0.jar 一.lucene索引操作 1.创建索引代码 try { // 1. 指定索引文件存 ...

  8. sql server查看表大小

    查看SqlServer 数据库中各个表多少行 : SELECT A.NAME ,B.ROWS FROM sysobjects A JOIN sysindexes B ON A.id = B.id WH ...

  9. 自顶向下深入分析Netty(三)--Bootstrap

    自顶向下深入分析Netty(一)--预备知识 自顶向下深入分析Netty(二)--线程模型 自顶向下深入分析Netty(三)--Bootstrap 自顶向下深入分析Netty(四)--EventLoo ...

  10. linux 下nc 命令的使用

    linux 下nc 命令的使用 https://blog.51cto.com/samyubw/555247