0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Xilinx ZYNQ開發(fā)GPIO的三種方式:MIO、EMIO、AXI_GPIO

電子設(shè)計 ? 來源: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部分實現(xiàn)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核,雙擊,配置好時鐘和內(nèi)存類型,確認勾選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 可以通過驅(qū)動 EMIO 控制 PL 部分的引腳 。

Vivado工程里ZYNQ CPU核配置,確保EMIO勾選,這里我設(shè)置了位寬為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 接口:

勾選復(fù)位信號:

給PL的時鐘信號:

加入AXI_GPIO IP,這里設(shè)置位寬為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);//設(shè)置通道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燈依次閃爍。

總結(jié):

MIO和EMIO使用PS的GPIO,,MIO固定管腳,EMIO手動分配管腳;IP方式手動分配管腳,綜合后需要消耗PL的邏輯資源。

編輯:hfy


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Xilinx
    +關(guān)注

    關(guān)注

    70

    文章

    2137

    瀏覽量

    120397
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1175

    瀏覽量

    51515
  • MIO
    MIO
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    8140
  • Zynq
    +關(guān)注

    關(guān)注

    9

    文章

    604

    瀏覽量

    47016
收藏 人收藏

    評論

    相關(guān)推薦

    GPIO靜電放電防護方案

    GPIO靜電放電防護方案 方案簡介 GPIO的全稱是General Purpose Input Output (通用輸入/輸出端口),簡稱為GPIO或總線擴展器,是一在微控制器、微處
    的頭像 發(fā)表于 09-19 17:02 ?87次閱讀
    <b class='flag-5'>GPIO</b>靜電放電防護方案

    [XILINX] 正點原子ZYNQ7035/7045/7100開發(fā)板發(fā)布、ZYNQ 7000系列、雙核ARM、PCIe2.0、SFPX2!

    7000系列芯片,核心板支持Xilinx Zynq-7035、Zynq-7045和Zynq-7100三種型號。
    發(fā)表于 09-02 17:18

    簡述三種esp32的開發(fā)方式是什么

    ESP32是一款由樂鑫(Espressif)推出的低功耗、高性能的Wi-Fi和藍牙雙模無線通信芯片,廣泛應(yīng)用于物聯(lián)網(wǎng)、智能家居、智能硬件等領(lǐng)域。本文將詳細介紹三種ESP32的開發(fā)方式:Arduino
    的頭像 發(fā)表于 08-20 09:11 ?636次閱讀

    STM32 GPIO模式及工作原理詳解

    圍設(shè)備(像控制led亮滅,按鍵控制,軟件模擬IIC等)直觀又簡單的控制。 GPIO的8模式 ?1. 輸入模式: ??(1)上拉輸入模式 GPIO_Mode_IPU ??(2)下拉輸入模式
    的頭像 發(fā)表于 07-22 09:32 ?2414次閱讀
    STM32 <b class='flag-5'>GPIO</b>八<b class='flag-5'>種</b>模式及工作原理詳解

    快速搞懂GPIO控制器的六模式

    在嵌入式系統(tǒng)和單片機開發(fā)中,GPIO(通用輸入輸出)控制器是一個非常重要的組件。GPIO引腳的靈活性使它們能夠執(zhí)行多種功能,從簡單的輸入輸出到復(fù)雜的通信任務(wù)。為了幫助大家快速了解和掌握GPIO
    的頭像 發(fā)表于 05-18 08:04 ?1185次閱讀
    快速搞懂<b class='flag-5'>GPIO</b>控制器的六<b class='flag-5'>種</b>模式

    什么是GPIO?GPIO組成原理

    GPIO全拼叫General Purpose Input Output(通用輸入輸出)簡稱IO口也叫總線擴展器,GPIO口是由引腳,功能寄存器組成,不同的架構(gòu)中的GPIO封裝不同,所使用的引腳數(shù)與寄存器數(shù)不同,具體可以參考芯片手
    發(fā)表于 04-28 12:30 ?5313次閱讀
    什么是<b class='flag-5'>GPIO</b>?<b class='flag-5'>GPIO</b>組成原理

    MCU啟動失敗竟因GPIO先上電?

    由于 RT1060 上 GPIO_AD_Bx 和 GPIO_Bx 兩組 PAD 供電均來自于 NVCC_GPIO,當其中任何一個 GPIO 有電壓時,均可能會漏電到 NVCC_
    發(fā)表于 03-28 10:32 ?543次閱讀
    MCU啟動失敗竟因<b class='flag-5'>GPIO</b>先上電?

    嵌入式Linux開發(fā)三種方式

    嵌入式Linux開發(fā)主要有三種方式:裸機開發(fā)、SDK開發(fā)和驅(qū)動開發(fā)。
    的頭像 發(fā)表于 01-22 14:22 ?789次閱讀

    使用STM32 HAL庫進行GPIO控制的實例

    在基于STM32微控制器的嵌入式系統(tǒng)開發(fā)中,GPIO(GeneralPurposeInput/Output)控制是其中最基本、最常見的操作之一。通過使用STM32的HAL庫,可以輕松地對GPIO進行配置和控制。本文將演示如何使用
    的頭像 發(fā)表于 12-21 15:22 ?2367次閱讀

    GPIO的四輸入模式介紹

    GPIO的介紹 GPIO (general purpose input output)是通用輸入輸出端口的簡稱,通俗來講就是單片機上的引腳,在STM32中,GPIO的工作模式被細分為8
    的頭像 發(fā)表于 11-09 16:51 ?5352次閱讀
    <b class='flag-5'>GPIO</b>的四<b class='flag-5'>種</b>輸入模式介紹

    ZYNQ的ARM和FPGA數(shù)據(jù)交互——AXI交互最重要的細節(jié)

    大部分器件的接口要求,提供互聯(lián)架構(gòu)的靈活性與獨立性。 (1)AXI總線 總線是一組傳輸通道,是各種邏輯器件構(gòu)成的傳輸數(shù)據(jù)的通道,一般由數(shù)據(jù)線、地址線、控制線等構(gòu)成。在ZYNQ中支持三種AXI
    發(fā)表于 11-03 10:51

    STM32使用GPIO配置的5方式

    采用五不同的方式,具體如下: 一、使用直接寄存器訪問 這種方式是最原始的GPIO訪問方式,直接訪問GP
    的頭像 發(fā)表于 10-26 17:42 ?1232次閱讀

    如何從單片機平臺編寫GPIO口程序

    單片機平臺編寫 GPIO 口程序,以 STM32F103 為例,有三種模式:庫函數(shù)、HAL庫、寄存器。 使用庫函數(shù)的方式操控 GPIO 方式
    的頭像 發(fā)表于 09-28 15:56 ?1108次閱讀

    gpio子系統(tǒng)API詳解

    gpio 子系統(tǒng) API gpio 子系統(tǒng)中操作一個 GPIO 需要如下幾步: 1、of_find_compatible_node2、of_get_named_gpio3、
    的頭像 發(fā)表于 09-27 17:17 ?636次閱讀
    <b class='flag-5'>gpio</b>子系統(tǒng)API詳解

    什么是AXIAXI如何工作?

    Xilinx 從 Spartan-6 和 Virtex-6 器件開始采用高級可擴展接口 (AXI) 協(xié)議作為知識產(chǎn)權(quán) (IP) 內(nèi)核。Xilinx 繼續(xù)將 AXI 協(xié)議用于針對 7 系
    的頭像 發(fā)表于 09-27 09:50 ?1422次閱讀
    什么是<b class='flag-5'>AXI</b>?<b class='flag-5'>AXI</b>如何工作?