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

2021-09-12 08:19:41 字數 3288 閱讀 9490

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

#include "xgpiops.h"

#include "sleep.h"

xgpiops gpiops_init()

int main()

return 0;

}

程式和stm32很相似,由於這是第一次接觸zynq的應用程式**,我們深入了解一下其中的細節。程式中有兩個綠色的結構體,xgpiops_config儲存了器件的配置資訊;使用者需要為系統中的gpio裝置分配乙個xgpiops型別的變數,gpio相關的api函式都需要乙個指向該變數的指標。sdk中滑鼠移動到結構體上即可檢視其原型:

typedef struct  xgpiops_config;

typedef struct xgpiops;

gpio初始化函式中首先用到了xgpiops_lookupconfig函式,右鍵->open declaration即可檢視函式原型。檢視原始檔我們可以知道,這個函式是根據唯一的裝置id來查詢裝置配置,其輸入引數為要查詢的裝置id號,返回值為乙個xgpiops_config型別的指標,如果沒有找到則返回null。上面程式中裝置id使用了巨集定義xpar_ps7_gpio_0_device_id,同樣可以通過open declaration檢視源定義。

接下來使用xgpiops_cfginitialize函式完成對xgpiops裝置的初始化,第乙個引數為待例項化的xgpiops裝置的指標(所以上面程式中加了取位址符&);第二個引數為指向xgpiops裝置的配置結構體;第三個位址為裝置在虛擬記憶體空間中的基位址,上面程式中通過訪問xgpiops_config結構體的成員來獲取基位址。

//兩個函式的介面

xgpiops_config *xgpiops_lookupconfig(u16 deviceid){}

s32 xgpiops_cfginitialize(xgpiops *instanceptr, xgpiops_config *configptr, u32 effectiveaddr){}

主程式中先定義了int型的要操作的mio管腳號,7即表示mio7。主程式中初始化gpio後,先用xgpiops_setdirectionpin函式設定指定管腳的方向,第乙個引數為指向xgpiops裝置的指標;第二個引數為操作的管腳號;第三個引數位要設定的方向,0表示輸入,1表示輸出。

接下來使用xgpiops_setoutputenablepin函式設定特定管腳的輸出使能,前兩個引數的含義與xgpiops_setdirectionpin函式相同;第三個引數為0表示禁止輸出使能,為1表示啟用輸出使能。

//兩個函式的介面

void xgpiops_setdirectionpin(xgpiops *instanceptr, u32 pin, u32 direction){}

void xgpiops_setoutputenablepin(xgpiops *instanceptr, u32 pin, u32 openable){}

while迴圈中使用xgpiops_writepin函式向管腳寫資料,前兩個引數的含義與上面兩個函式相同;第三個引數為要寫入的資料,0或1。while中還用到sleep延遲函式,該函式的延時單位為秒,且傳入引數為int型,因此不要希望能實現延時0.5秒、1.5秒這樣的功能。

//兩個函式的介面

void xgpiops_writepin(xgpiops *instanceptr, u32 pin, u32 data){}

unsigned sleep(unsigned int seconds) {}

這樣我們就對gpio相關操作和相關api函式有了清楚的認識。sdk在儲存檔案時會自動完成構建操作(編譯與鏈結)。進行debug除錯(或直接執行),可以觀察到與ps的mio7相連的led燈以1s頻率閃爍,功能正確。

首先要清楚:gpio訊號≠mio或emio,這在vivado中是兩個概念,mio和emio只是gpio訊號的兩種介面,很多初學者確把這些概念混淆。gpio即general purpose i/o,zynq-7000中處理器的gpio具有如下特性:

gpio按相相關聯的介面訊號分為4個bank。gpio控制和狀態暫存器在記憶體中對映的基位址為)0xe000_a000。gpio的模組框圖如下所示,其中bank0和bank1是通過mio直接與zynq管腳相連的部分。另外注意7z007單核與7z010雙核clg225晶元的mio只有32個,而非其它型號的54個。

通過軟體對gpio或bank的控制,實質上就是對一系列記憶體對映暫存器的控制,主要是slcr.mio_pin_xx暫存器,只不過mio和emio之間會有一些差別。

軟體可以將gpio配置為輸出或輸入模式。很多時候,應用程式會需要同時切換多個gpio。同時切換的gpio必須來自同乙個bank的高16bits或低16bits,使用乙個儲存指令完成對mask_data暫存器的寫入。從上圖可以注意到,由於mio只有54個,因此bank1只有22位。

54個與mio相連的gpio訊號中有兩個特例,bank0的bits[7]和bits[8]。在vivado中配置gpio時我們會發現,與這兩個訊號相連的mio7和mio8只能作為輸出out,而其它mio都可以作為雙向inout。

其實與這兩個訊號相關的管腳在復位期間要用來控制i/o緩衝器的電壓模式,稱作vmode管腳。這兩個管腳必須根據合適的電壓模式,由外部系統驅動,而不能有其它系統邏輯驅動,因此不能作為輸出。但是系統啟動之後,已經讀取了電壓模式,系統便可以將mio7和mio8作為輸出使用。

最後還是要強調,gpio才是與處理器直接相關的,分為bank0~bank3四個組。mio和emio只是gpio訊號與外界連線的介面,bank0、bank1通過mio相連,bank2、bank3通過emio相連。哪怕我們在實際使用過程中就是把mio當作gpio來看待,沒有出現任何問題,但我認為學習應該保持嚴謹的態度,搞清這些基礎的概念,也是專業素養的一種體現。

zynq新增GPIO中斷程式

核心原始碼為adi官方關於ad9361的核心,編譯工具為petalinux2015.2,開發板為zynqxc7z100 一 修改裝置樹 1.開啟petalinux專案下的.project spec meta user recipes dt device tree files system top.d...

zynq中各種GPIO方式的區別

zynq可以提供多種方式提供gpio的能力,早上到公司就想應該先搞清楚裡面的各種區別,因為我自己不自然就只會用自己的最熟悉的方案來實現,所以在此總結一下 很多帖子討論這個,當然是因為簡單了 但是好像都沒有整理完整 zynq中gpio有四種,其中ps中mio emio兩種,而pl中同樣有兩種情況,ax...

2019 07 05 Zynq學習 三種GPIO

前言 zynq 7000有三種gpio mio,emio,axi gpio mio是固定管腳的,屬於ps,使用時不消耗pl資源 emio通過pl擴充套件,使用時需要分配管腳,使用時消耗pl管腳資源 axi gpio是封裝好的ip核,ps通過m axi gpio介面控制pl部分實現io,使用時消耗管腳...