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- ...
随机推荐
- c语言位域的使用注意事项——数据溢出
c语言可以使用位域来节省变量的空间,例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位.位域的取值范围非常有限,数据稍微大些就会发生溢出,这个字使用keil的使用,keil提 ...
- js原型结构图
要素:对象原型.函数原型: [p] 原型对象: p 模版对象: 要构造的对象的信息: 构造函数具有原型对象和模版对象: 普通对象只具有模版对象: https://zhuanlan.zhihu. ...
- 关于kmp算法
字符串匹配算法简称kmp 日常安利大佬博客(真的是一篇很好的文章) 觉得百度百科讲的也挺好 就是给出两个字符串a, b 求b在a中的所有位置 next数组:代表当前字符之前的字符串中,有多大长度的相同 ...
- 一起学Makefile(五)
多目标规则 多目标规则,可以简单的理解为是一种将多条具有1)相同依赖和2)相同生成命令的规则,合并成一条规则的语法,其基本格式为: targets...: prerequisites... comma ...
- windows自动修复失败,无法启动
Windows10操作系统于2015年7月29日正式发布,此后,win10也就成了新上市的笔记本电脑或者台式机电脑的预装操作系统!win10系统给我们带了全新的体验,当然也带来了一定的烦恼!就拿win ...
- MP实战系列(十九)之批量新增
批量操作在实际开发中也应用非常多,例如批量下发优惠券.批量添加用户等. 以MyBatis为例,通常实现批量操作,有这么几种方式? 第一,单条插入sql语句,进行for循环遍历,基准条件是根据前端传过的 ...
- 制作镜像文件工具packer
openstack镜像制作要在openstack上创建虚拟机,必然要使用到虚拟机镜像. 对于普通用户,可以使用已经创建好的虚拟机镜像.一般是操作系统官方构建并提供的. 某些用户可以有自己独特的需求,需 ...
- PHP系列 | PHPexcel导入xls格式 ,提示错误:iconv(): Wrong charset, conversion from `CP936' to `UTF-8' is not allowed
导入xls格式(2003版本)时会报错提示错误信息 iconv(): Wrong charset, conversion from `CP936' to `UTF-8' is not allowed[ ...
- Java: Java终止线程的几种方式
首先说明,使用stop方法终止的方式已经在很久之前就被废弃了,在加锁的情况下有可能会造成死锁,这里不做讨论. 1. 使用标志位终止线程 在run()方法执行完毕后,该线程就终止了.但是在某些特殊的情况 ...
- mysql实现row_number()和row_number() over(partition by)
row_number() ) r, test_table t 解释:给test_table里的数据设置行号, rn是行号 row_number() over(partition by) ,@rank: ...