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
    +关注

    关注

    73

    文章

    2192

    浏览量

    129970
  • GPIO
    +关注

    关注

    16

    文章

    1313

    浏览量

    55733
  • MIO
    MIO
    +关注

    关注

    0

    文章

    12

    浏览量

    8343
  • Zynq
    +关注

    关注

    10

    文章

    625

    浏览量

    49243
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    GPIO、PWM、ADC,到底怎么区分?

    在嵌入式开发中,我们经常听到GPIO、PWM、ADC这些术语。初学者常常搞不清楚它们的区别和用途:“它们不是都是和电平有关吗?为什么还要分这么多种?”今天,我们就把这些基础概念讲清楚,让你在动手开发
    的头像 发表于 11-14 10:28 242次阅读
    <b class='flag-5'>GPIO</b>、PWM、ADC,到底怎么区分?

    使用e203驱动OV5640

    I2C时序。AXI_GPIOXilinx官方提供的IP核,其内部包含7个寄存器,前四个寄存器偏移地址从0x00到0x0F,每个都是32位的寄存器,可以控制GPIO的方向和写的数据,只需这四个寄存器便可
    发表于 10-29 06:15

    将e203 例化AXI总线接口

    否有信号变化,注意axi的awaddr,awvalid,wready,wdata一定要引出到ILA,这里调用ILA时候可以选择axi属性。 最后终于用e203的axi把led0点亮。(最终发现是
    发表于 10-29 06:08

    AXI GPIO扩展e203 IO口简介

    AXI GPIO简介 AXI-GPIO是一Xilinx公司开发的外设IP,可以连接到
    发表于 10-22 08:14

    Air780EPM应用开发:解锁GPIO与LED的N交互模式

    今天特别分享探索Air780EPM中GPIO与LED的多样交互!本文介绍N交互模式,包括脉冲控制、状态切换及多LED联动,为智能设备开发提供丰富技术选型。适用于智能照明、状态指示等物联网场景。 一
    的头像 发表于 05-29 14:31 470次阅读
    Air780EPM应用<b class='flag-5'>开发</b>:解锁<b class='flag-5'>GPIO</b>与LED的N<b class='flag-5'>种</b>交互模式

    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API函数的引入

    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API函数的引入
    的头像 发表于 05-29 14:05 840次阅读
    迅为RK3568<b class='flag-5'>开发</b>板驱动指南<b class='flag-5'>GPIO</b>子系统<b class='flag-5'>GPIO</b>子系统API函数的引入

    迅为RK3568驱动指南GPIO子系统 GPIO操作函数实验

    迅为电子RK3568开发板驱动指南GPIO子系统 GPIO操作函数实验
    的头像 发表于 05-28 15:24 1049次阅读
    迅为RK3568驱动指南<b class='flag-5'>GPIO</b>子系统 <b class='flag-5'>GPIO</b>操作函数实验

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制GPIO中断

    1、实验简介本实验将演示如何在小凌派-RK2206开发板上使用IOT库的GPIO中断模式,进行GPIO编程开发。例程将创建一个任务,通过配置GPIO
    的头像 发表于 04-21 10:39 895次阅读
    基于小凌派RK2206<b class='flag-5'>开发</b>板:OpenHarmony如何使用IoT接口控制<b class='flag-5'>GPIO</b>中断

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制GPIO外设

    1、案例简介本案例主要是如何在小凌派-RK2206开发板上使用IOT库的GPIO接口,进行GPIO编程开发。例程将创建一个任务,通过配置GPIO
    的头像 发表于 04-11 15:36 1623次阅读
    基于小凌派RK2206<b class='flag-5'>开发</b>板:OpenHarmony如何使用IoT接口控制<b class='flag-5'>GPIO</b>外设

    为什么GPIO配置总是出问题?

    在STM32开发中,GPIO(通用输入输出)配置看似简单,但在实际开发中,很多人常常会遇到这些困惑:明明按照教程配置了GPIO,为什么LED灯就是不亮?为什么有时候按键无法响应,或者响
    的头像 发表于 04-07 11:59 1378次阅读
    为什么<b class='flag-5'>GPIO</b>配置总是出问题?

    GPIO使用教程 GPIO接口应用

    交互,实现外部设备的控制和数据传输。 一、GPIO的基本概念 GPIO的全称是General-Purpose Input/Output,即通用输入/输出。它是一在电子设备中常见的接口,允许控制和读取
    的头像 发表于 01-31 10:10 5217次阅读

    GPIO模块与其他外设的连接方法

    在嵌入式系统设计中,GPIO模块是实现设备与外部世界交互的关键接口。它们提供了一灵活的方式来控制和监测外部设备。 GPIO模块的基本概念 GPIO
    的头像 发表于 01-09 09:48 1507次阅读

    GPIO错误排查与解决

    在嵌入式系统和微控制器编程中,通用输入输出(GPIO)是最常见的接口之一。然而,在使用GPIO时,我们可能会遇到各种错误。 1. 理解GPIO GPIO是微控制器上的一组引脚,可以被配
    的头像 发表于 01-09 09:46 3726次阅读

    ZYNQ基础---AXI DMA使用

    Xilinx官方也提供有一些DMA的IP,通过调用API函数能够更加灵活地使用DMA。 1. AXI DMA的基本接口 axi dma IP的基本结构如下,主要分为个部分,分别是控制
    的头像 发表于 01-06 11:13 3599次阅读
    <b class='flag-5'>ZYNQ</b>基础---<b class='flag-5'>AXI</b> DMA使用

    如何通过PMC_GPIO唤醒AMD Versal™ Adaptive SoC Linux系统

    ://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842232/Zynq+UltraScale+MPSoC+Power+Management+-+Linux+Kernel 我们这里采用 VPK120 板卡作为平台,这个板
    的头像 发表于 12-17 10:07 1263次阅读
    如何通过PMC_<b class='flag-5'>GPIO</b>唤醒AMD Versal™ Adaptive SoC Linux系统