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- ...
随机推荐
- PHP数组操作类
class ArrayHelper{ /** * 从数组中删除空白的元素(包括只有空白字符的元素) * * 用法: * @code php ...
- sparkjob的提交流程
在使用spark-submit提交一个Spark应用之后,Driver程序会向集群申请一定的资源来启动东若干个Executors用来计算,当这些Executors启动后,它们会向Driver端的Sch ...
- MIME Type介绍 Content-Type 各种定义
多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions)是一个互联网标准,它扩展了电子邮件标准,使其能够支持非ASCII字符.二进制格式附件等多种格 ...
- Educational Codeforces Round 47 (Rated for Div. 2) G. Allowed Letters
把原字符看成 $X$,每个位置看成 $Y$,每种字符向每个能去的位置连边,就成了一个二分图完美匹配的问题.现要得到字典序最小,那么就枚举每一位要放什么,然后看放完这种字符,剩下的字符的个数和后面能不能 ...
- PostgreSQL Autovacuum和vacuum
1 基础知识 重点: 如果您的数据库运行了很久,并且从来没有打开过autovacuum,那么请在打开autovacuum之前全库手动运行vacuum analyze(可能要非常久的时间)完全禁用aut ...
- ssh配置连接远程主机 彻底解放你的双手
查看ssh支持配置 man ssh_config 打开ssh并配置 vi ~/.ssh/config 基本配置示例说明 密钥文件连接 Host <别名> Port <机器端口号> ...
- “知乎杯”2018 CCF 大学生计算机系统与程序设计竞赛 分组加密器(encryption)
分组加密器(encryption) 题解点这里 #include<map> #include<stack> #include<vector> #include< ...
- Math小记
20161231 黄金分割比:短/长=长/(短+长)=((根号5)-1)/2 ≍ 0.618 斐波那契数列前后两项的比值存在极限.设其中三个数为a.b.(a+b),则当项数趋于无穷时有a/b=b/(a ...
- JavaScript var、let、const
var申明的变量是有作用域的 如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不可引用该变量: 'use strict'; function foo() { var x = 1; ...
- cocos执行tolua/genbindings.py文件,错误搜集:
1.PYTHON_BIN not defined, use current python.这个不是错误 2.llvm toolchain not found!path: /Users/staff/Do ...