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 推挽...