0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Xilinx ZYNQ开发GPIO的三种方式:MIO、EMIO、AXI_GPIO

电子设计 来源:CSDN 博主 作者:ChuanjieZhu 2020-12-26 10:12 次阅读

前言:

ZYNQ 7000有三种GPIO:MIO,EMIO,AXI_GPIO

MIO是固定管脚的,属于PS,使用时不消耗PL资源;EMIO通过PL扩展,使用时需要分配管脚,使用时消耗PL管脚资源;AXI_GPIO是封装好的IP核,PS通过M_AXI_GPIO接口控制PL部分实现IO,使用时消耗管脚资源和逻辑资源。

使用的板子是zc702。

1.MIO方式

Zynq7000 系列芯片有 54 个 MIO(multiuse I/O), 它们分配在 GPIO 的 Bank0 和Bank1 隶属于 PS 部分, 这些 IO 与 PS 直接相连。 不需要添加引脚约束, MIO 信号对 PL部分是透明的, 不可见。 所以对 MIO 的操作可以看作是纯 PS 的操作。

pIYBAF9uIUGACO_GAAGEXyJbwdY370.png


pIYBAF9uIUKAEmemAACU6kfqXfo510.png

新建Vivado工程,添加ZYNQ CPU核,双击,配置好时钟和内存类型,确认勾选MIO:

o4YBAF9uIUiAPJJOAATlvxBVp0s930.png

如系列(三)文章所述,生成bit stream,然后Launch SDK。

在SDK中新建工程,源文件如下:
#include "xgpiops.h"
#include "sleep.h"
int main()
{
static XGpioPs psGpioInstancePtr;
XGpioPs_Config* GpioConfigPtr;
int iPinNumber= 8; //DS12连接的是MIO8
u32 uPinDirection = 0x1; //1表示输出, 0表示输入
int xStatus;
//--MIO的初始化
GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
if(GpioConfigPtr == NULL)
return XST_FAILURE;
xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr,
GpioConfigPtr->BaseAddr);
if(XST_SUCCESS != xStatus)
print(" PS GPIO INIT FAILED /n/r");
//--MIO的输入输出操作
XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber,uPinDirection);//配置MIO输出方向
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber,1);//配置MIO的第8位输出
while(1)
{
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1);//点亮MIO的第8位输出1
usleep(500000); //延时
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0);//熄灭MIO的第8位输出0
usleep(500000); //延时
}
/****************************************************************
while(1)
{
XGpioPs_WriteReg(0xE000A000,0x00000000, 0xFF7FFFFF&0xFFFF0080);
usleep(500000); //延时
XGpioPs_WriteReg(0xE000A000,0x00000000, 0xFF7FFFFF&0xFFFF0000);
usleep(500000); //延时
} *
*****************************************************************/
return 0;
}

下载到板子上,DS12就开始闪烁了。

2.EMIO方式

EMIO 分配在 bank2 和 bank3 和 PL部分相连。EMIO 有 64 个引脚可供我们使用 。当 MIO 不够用时, PS 可以通过驱动 EMIO 控制 PL 部分的引脚 。

Vivado工程里ZYNQ CPU核配置,确保EMIO勾选,这里我设置了位宽为4,后面为其分配了四个管脚:

在Diagram里面将GPIO_0的引脚引出来,生成顶层文件后查看这个引脚的名字,因为我修改了名字,这里叫emio_0_tri_io

管脚约束文件:
#GPIO PMOD1
set_property PACKAGE_PIN E15 [get_ports {emio_0_tri_io[0]}]
set_property IOSTANDARD LVCMOS25 [get_ports {emio_0_tri_io[0]}]
set_property PACKAGE_PIN D15 [get_ports {emio_0_tri_io[1]}]
set_property IOSTANDARD LVCMOS25 [get_ports {emio_0_tri_io[1]}]
set_property PACKAGE_PIN W17 [get_ports {emio_0_tri_io[2]}]
set_property IOSTANDARD LVCMOS25 [get_ports {emio_0_tri_io[2]}]
set_property PACKAGE_PIN W5 [get_ports {emio_0_tri_io[3]}]
set_property IOSTANDARD LVCMOS25 [get_ports {emio_0_tri_io[3]}]

SDK部分:MIO号是0~53,EMIO从54开始

#include "xgpiops.h"
#include "sleep.h"
int main()
{
static XGpioPs psGpioInstancePtr;
XGpioPs_Config* GpioConfigPtr;
int xStatus;
//-- EMIO的初始化
GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
if(GpioConfigPtr == NULL)
return XST_FAILURE;
xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr,
GpioConfigPtr->BaseAddr);
if(XST_SUCCESS != xStatus)
print(" PS GPIO INIT FAILED /n/r");
//--EMIO的输入输出操作
XGpioPs_SetDirectionPin(&psGpioInstancePtr, 54,1);
XGpioPs_SetDirectionPin(&psGpioInstancePtr, 55,1);
XGpioPs_SetDirectionPin(&psGpioInstancePtr, 56,1);
XGpioPs_SetDirectionPin(&psGpioInstancePtr, 57,1);
//使能EMIO输出
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 54,1);
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 55,1);
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 56,1);
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 57,1);
while(1)
{
XGpioPs_WritePin(&psGpioInstancePtr, 54, 1);//EMIO的第0位输出1
usleep(200000); //延时
XGpioPs_WritePin(&psGpioInstancePtr, 54, 0);//EMIO的第0位输出0
usleep(200000); //延时
XGpioPs_WritePin(&psGpioInstancePtr, 55, 1);//EMIO的第1位输出1
usleep(200000); //延时
XGpioPs_WritePin(&psGpioInstancePtr, 55, 0);//EMIO的第1位输出0
usleep(200000); //延时
XGpioPs_WritePin(&psGpioInstancePtr, 56, 1);//EMIO的第2位输出1
usleep(200000); //延时
XGpioPs_WritePin(&psGpioInstancePtr, 56, 0);//EMIO的第2位输出0
usleep(200000); //延时
XGpioPs_WritePin(&psGpioInstancePtr, 57, 1);//EMIO的第3位输出1
usleep(200000); //延时
XGpioPs_WritePin(&psGpioInstancePtr, 57, 0);//EMIO的第3位输出0
usleep(200000); //延时
}
return 0;
}

下载到板子里,PMOD1的4个led灯交替闪烁。

3.AXI_GPIO方式

VIvado工程里,ZYNQ CPU核配置:
勾选M_AXI_GPIO 接口:

勾选复位信号:

给PL的时钟信号:

加入AXI_GPIO IP,这里设置位宽为4,后面将控制4个led灯:

自动连接后如下图:

pIYBAF9uIWyAfeJ2AATkAQcAoX4630.png

管脚约束如下:
#GPIO PMOD1
set_property PACKAGE_PIN E15 [get_ports {gpio_sw_tri_o[0]}]
set_property IOSTANDARD LVCMOS25 [get_ports {gpio_sw_tri_o[0]}]
set_property PACKAGE_PIN D15 [get_ports {gpio_sw_tri_o[1]}]
set_property IOSTANDARD LVCMOS25 [get_ports {gpio_sw_tri_o[1]}]
set_property PACKAGE_PIN W17 [get_ports {gpio_sw_tri_o[2]}]
set_property IOSTANDARD LVCMOS25 [get_ports {gpio_sw_tri_o[2]}]
set_property PACKAGE_PIN W5 [get_ports {gpio_sw_tri_o[3]}]
set_property IOSTANDARD LVCMOS25 [get_ports {gpio_sw_tri_o[3]}]

SDk部分如下:

#include
#include "platform.h"
#include "xparameters.h"
#include "xgpio.h"
int main() {
XGpio gpio_led;
int status;
int i,x,y;

init_platform();
status = XGpio_Initialize(&gpio_led, 0);
if(status == 0){
printf("success /r/n");
}

XGpio_SetDataDirection(&gpio_led,1,0);//设置通道1为输出
while (1){
for (i = 0; i XGpio_DiscreteWrite(&gpio_led, 1, 0x01 for(x =1000; x > 0; x-- ){
for (y = 100000; y > 0; y--);
}
}
}
cleanup_platform();
return 0;
}

可以看到,与EMIO一样需要分配管脚,但是AXI_GPIO使用的头文件是#include "xgpio.h",而EMIO是#include "xgpiops.h"。
下载完成后,PMOD1 的四个LED灯依次闪烁。

总结:

MIO和EMIO使用PS的GPIO,,MIO固定管脚,EMIO手动分配管脚;IP方式手动分配管脚,综合后需要消耗PL的逻辑资源。

编辑:hfy


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Xilinx
    +关注

    关注

    70

    文章

    2119

    浏览量

    119362
  • GPIO
    +关注

    关注

    16

    文章

    1132

    浏览量

    50560
  • MIO
    MIO
    +关注

    关注

    0

    文章

    12

    浏览量

    8120
  • Zynq
    +关注

    关注

    9

    文章

    598

    浏览量

    46609
收藏 人收藏

    评论

    相关推荐

    ZYNQ的ARM和FPGA数据交互——AXI交互最重要的细节

    大部分器件的接口要求,提供互联架构的灵活性与独立性。 (1)AXI总线 总线是一组传输通道,是各种逻辑器件构成的传输数据的通道,一般由数据线、地址线、控制线等构成。在ZYNQ中支持三种AXI
    发表于 11-03 10:51

    如何配置GPIO为中断功能呢?

    如何配置GPIO为中断功能呢? GPIO在嵌入式系统中经常用于控制外设,如LED、摄像头、传感器等。除此之外,GPIO还可以被配置为中断功能,用于检测输入信号的变化,从而触发中断服务程序。本文将介绍
    的头像 发表于 10-30 09:57 3030次阅读

    STM32使用GPIO配置的5种方式

    采用五种不同的方式,具体如下: 一、使用直接寄存器访问 这种方式是最原始的GPIO访问方式,直接访问GPIO的控制寄存器来配置相应的复用功能
    的头像 发表于 10-26 17:42 766次阅读

    如何从单片机平台编写GPIO口程序

    单片机平台编写 GPIO 口程序,以 STM32F103 为例,有三种模式:库函数、HAL库、寄存器。 使用库函数的方式操控 GPIO 方式
    的头像 发表于 09-28 15:56 872次阅读

    gpio子系统API详解

    gpio 子系统 API gpio 子系统中操作一个 GPIO 需要如下几步: 1、of_find_compatible_node2、of_get_named_gpio3、
    的头像 发表于 09-27 17:17 470次阅读
    <b class='flag-5'>gpio</b>子系统API详解

    什么是AXIAXI如何工作?

    Xilinx 从 Spartan-6 和 Virtex-6 器件开始采用高级可扩展接口 (AXI) 协议作为知识产权 (IP) 内核。Xilinx 继续将 AXI 协议用于针对 7 系
    的头像 发表于 09-27 09:50 675次阅读
    什么是<b class='flag-5'>AXI</b>?<b class='flag-5'>AXI</b>如何工作?

    STM32的GPIO配置

    STM32微控制器通用输入/输出引脚(GPIO)提供许多与应用框架内外部电路相连接的方法。本应用笔记提供有关GPIO配置的基本信息,以及硬件和软件开发人员使用GPIO引脚优化其STM3
    发表于 08-31 10:50 0次下载

    迅为RK3568开发GPIO之外接模块

    迅为RK3568开发GPIO之外接模块
    的头像 发表于 08-24 17:41 656次阅读
    迅为RK3568<b class='flag-5'>开发</b>板<b class='flag-5'>GPIO</b>之外接模块

    GPIO可配置为几种模式 请简述GPIO的工作模式

    GPIO可配置为三种模式:Output模式、Input模式和Analog模式
    发表于 07-24 11:27 2902次阅读
    <b class='flag-5'>GPIO</b>可配置为几种模式 请简述<b class='flag-5'>GPIO</b>的工作模式

    Milk-V Duo开发板免费体验 GPIO分析

    设备树 下面截取gpio0的设备树,复制自:linux_5.10/arch/riscv/boot/dts/cvitek/cv180x_base.dtsi gpio0: gpio
    的头像 发表于 07-14 22:14 914次阅读

    使用树莓派GPIO口点亮双色LED灯

    上一篇文章向大家介绍树莓派的硬件部分、安装操作系统及基础设置。这篇文章将介绍树莓派的强大的开发功能口——GPIO,以及利用GPIO口点亮双色LED灯(树莓派的第一个基本实验)。具有一定的参考价值,需要的朋友可以参考一下。
    的头像 发表于 07-04 11:34 1118次阅读
    使用树莓派<b class='flag-5'>GPIO</b>口点亮双色LED灯

    STM32的GPIO在实际开发设计的使用配置和技巧

    一、前言 本篇开始对STM32的GPIO在实际开发设计中的使用配置和技巧进行探讨,可以先去回顾下之前介绍的GPIO的相关理论基础知识包括基本结构,工作模式和寄存器原理。 了解过STM32的GP
    的头像 发表于 06-22 10:22 519次阅读
    STM32的<b class='flag-5'>GPIO</b>在实际<b class='flag-5'>开发</b>设计的使用配置和技巧

    ZYNQ(FPGA)与DSP之间GPIO通信实现

    1.1.3.3.2 ZYNQ程序运行结果点击hw_ila_1窗口上角符号的采集触发按钮,如下图①处标识的按钮,可查看到DSP通过GPIO29、GPIO30两个
    发表于 06-16 16:02

    一文详解GPIO的输出配置

    引言:GPIO,即General purpose input output,通用输入输出端口,是可以根据实际使用场景需求来用软件来配置的引脚。需要注意的是,一款芯片的引脚分为其实分为很多域,比如仅为
    发表于 06-14 16:41 1877次阅读
    一文详解<b class='flag-5'>GPIO</b>的输出配置

    应用指南|基于TQT507开发板介绍如何控制GPIO

    本文档介绍了应用层如何控制GPIO,适用于天嵌开发板TQT507。1.sysfs方式控制GPIO通过sysfs方式进行操控,进入到/sys/
    的头像 发表于 05-30 10:39 569次阅读
    应用指南|基于TQT507<b class='flag-5'>开发</b>板介绍如何控制<b class='flag-5'>GPIO</b>