zynq中各種GPIO方式的區別

2021-07-26 07:05:04 字數 3137 閱讀 9346

zynq可以提供多種方式提供gpio的能力,早上到公司就想應該先搞清楚裡面的各種區別,因為我自己不自然就只會用自己的最熟悉的方案來實現,所以在此總結一下;

很多帖子討論這個,當然是因為簡單了;但是好像都沒有整理完整

zynq中gpio有四種,其中ps中mio/emio兩種,而pl中同樣有兩種情況,axi_gpio和axi_lite自定義的gpio;下面就這四種情況進行說明;

mio實現的gpio需要在做pcb板卡之前就對功能有所限制;

其中mio和emio是直接掛在ps上的gpio。而axi_gpio是通過axi匯流排掛在ps上的gpio上。

其中mio分布在bank0,bank1,而emio則分布在bank2、bank3。注意一下幾項:

首先、mio在zynq上的管腳是固定的,而emio,是通過pl部分擴充套件的,所以使用emio時候需要在約束檔案中分配管腳,所以設計emio的程式時,需要生成pl部分的bit檔案,燒寫到fpga中。

其次、mio共佔54bit,而emio佔64bit。其中mio占用io號為0-53。而emio占用io號為54-117。

無論是emio還是mio都屬於ps上的io,直接由ps操作。在呼叫標頭檔案,

只呼叫#include "xgpiops.h"即可,

而在呼叫axi_gpio時,則需要#include "xgpio.h"。

emio實現gpio也使用ps,但是有fpga的靈活

emio實現是在平台設定

emio設定之後如果實現為io方式就需要新增乙個自定義的iobuf如圖

iobuf的實現**如下

module ad_iobuf

( input [1:0] dio_t,

input [1:0] dio_i,

output [1:0] dio_o,

inout [1:0] dio_p

); genvar n;

generate

for (n = 0; n < 2; n = n + 1)

begin: g_iobuf

assign dio_o[n] = dio_p[n];

assign dio_p[n] = (dio_t[n] == 1'b1) ? 1'bz : dio_i[n];

endendgenerate

endmodule

以上兩種在軟體層面實現

static xgpiops psgpioinstanceptr;   //定義ps的gpio指標,如果用到mio和emio也只要定義這乙個就行

xgpiops_config *gpioconfigptr; //xgpiops結構體中還包含乙個結構體,查bsp中的h檔案

int xstatus;

gpioconfigptr =xgpiops_lookupconfig(xpar_ps7_gpio_0_device_id);   

if(gpioconfigptr == null)

returnxst_failure;

xstatus =xgpiops_cfginitialize(&psgpioinstanceptr,gpioconfigptr,gpioconfigptr->baseaddr);

if(xst_success != xstatus)

print("ps gpio init failed \n\r");

xgpiops_setdirectionpin(&psgpioinstanceptr,ipinnumber,upindirection);

xgpiops_setoutputenablepin(&psgpioinstanceptr,ipinnumber,1);

xgpiops_writepin(&psgpioinstanceptr,ipinnumber,0);     //這裡是寫某乙個pin,也有寫乙個bank的,陸書上p111就是寫bank的。

舉例:以ld9(在zed板上是mio7),另外加上一位emio,即54,估計emio是從54位開始,有待驗證(mark)。

static xgpiops psgpioinstanceptr;   //定義ps的gpio指標,如果用到mio和emio也只要定義這乙個就行

xgpiops_config *gpioconfigptr; //xgpiops 結構體中還包含乙個結構體,查bsp中的h檔案

int xstatus;

static int ipinnumber = 7; /*led ld9 isconnected to mio pin 7*/

static int ipinnumberemio = 54;

gpioconfigptr =xgpiops_lookupconfig(xpar_ps7_gpio_0_device_id);   

if(gpioconfigptr == null)

returnxst_failure;

xstatus =xgpiops_cfginitialize(&psgpioinstanceptr,gpioconfigptr,gpioconfigptr->baseaddr);

if(xst_success != xstatus)

print("ps gpio init failed \n\r");

xgpiops_setdirectionpin(&psgpioinstanceptr,7,1);  0輸入,1輸出

xgpiops_setoutputenablepin(&psgpioinstanceptr,7,1);   0 為dis,1為enable

xgpiops_writepin(&psgpioinstanceptr,7,0);

xgpiops_setdirectionpin(&psgpioinstanceptr,54,0);  0輸入,1輸出

xgpiops_setoutputenablepin(&psgpioinstanceptr,54,0);   0 為dis,1為enable

註明:7可以用ipinnumber代替,54可以用ipinnumberemio代替。

Linux下ZYNQ中GPIO中斷號獲取

使用提供的gpio to irq是最佳的選擇,裝置樹配置起來也比較方便,都不需要將中斷父結點設定為gpio0。key 驅動程式申請一下對映後的終端號key test.irq int key test.irq gpio to irq key test.key gpio 使用key test.irq就可...

學會Zynq(4)GPIO中MIO的使用方法

本文將介紹ps部分gpio中mio的使用。本文先通過乙個控制led閃爍的例項體會mio的用法,學習gpio相關結構體與api函式的使用 然後再系統講解gpio的相關概念。include xgpiops.h include sleep.h xgpiops gpiops init int main re...

GPIO埠各種模式的區別

gpio埠各種模式的區別 1 gpio mode ain 模擬輸入 2 gpio mode in floating 浮空輸入 3 gpio mode ipd 下拉輸入 4 gpio mode ipu 上拉輸入 5 gpio mode out od 開漏輸出 6 gpio mode out pp 推挽...