MIO和EMIO方式是使用PS部分的GPIO模塊來實現(xiàn)GPIO功能的,支持54個MIO(可輸出三態(tài))、64個輸入和128個輸出(64個輸出和64個輸出使能)EMIO
而IP方式是在PL部分實現(xiàn) GPIO功能,PS部分通過M_AXI_GP接口來控制該GPIO IP模塊;另外EMIO模塊雖然使用PS部分GPIO但也使用了PL部分的管腳資源。
MIO方式實現(xiàn)GPIO
vivado中zynq設(shè)置如下圖
由圖中可見要選中打開GPIO,其下自動顯示可用于GPIO的MIO(當(dāng)MIO作為其他功能時就不能作為GPIO使用了),其中MIO 7、MIO 8只能作為輸出使用,因為它們用于VMODE管腳
軟件部分如下
#include
#include "platform.h"
#include "xgpiops.h"
#define LED1 0
#define LED2 9
static void delay(int dly)
{
int i, j;
for (i = 0; i < dly; i++) {
for (j = 0; j < 0xffff; j++) {
;
}
}
}
int main()
{
int Status;
XGpioPs_Config *ConfigPtr;
XGpioPs Gpio;
init_platform();
ConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS){
return XST_FAILURE;
}
XGpioPs_SetDirectionPin(&Gpio, LED1, 1);
XGpioPs_SetDirectionPin(&Gpio, LED2, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED1, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED2, 1);
while (1) {
XGpioPs_WritePin(&Gpio, LED1, 0);
XGpioPs_WritePin(&Gpio, LED2, 1);
delay(1000);
XGpioPs_WritePin(&Gpio, LED1, 1);
XGpioPs_WritePin(&Gpio, LED2, 0);
delay(1000);
}
cleanup_platform();
}
EMIO方式實現(xiàn)GPIO
vivado中zynq設(shè)置如下圖
圖中可知GPIO中選擇使用EMIO,并選擇位寬(這里例子中選擇3);其vivado中連接如下圖
上圖可知除了FIXED IO和DDR接口外,還多了3個3對(一個輸入,一個輸出和一個輸出使能)GPIO管腳。
不同于MIO,這里三個IO管腳(一個輸入,一個輸出和一個輸出使能在自動生成的頂層模塊中合并為一個IO)要綁定到芯片對應(yīng)管腳上
軟件部分如下
#include
#include "platform.h"
#include "xgpiops.h"
#define LED_R 54
#define LED_G 55
#define LED_B 56
#define LED_ON 0
#define LED_OFF 1
static void delay(int dly)
{
int i, j;
for (i = 0; i < dly; i++) {
for (j = 0; j < 0xffff; j++) {
;
}
}
}
int main()
{
int Status;
XGpioPs_Config *ConfigPtr;
XGpioPs Gpio;
init_platform();
ConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS) {
print("cfg init err\n");
return XST_FAILURE;
}
XGpioPs_SetDirectionPin(&Gpio, LED_R, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED_R, 1);
XGpioPs_SetDirectionPin(&Gpio, LED_G, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED_G, 1);
XGpioPs_SetDirectionPin(&Gpio, LED_B, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED_B, 1);
while (1) {
XGpioPs_WritePin(&Gpio, LED_R, LED_ON);
delay(1000);
XGpioPs_WritePin(&Gpio, LED_G, LED_ON);
delay(1000);
XGpioPs_WritePin(&Gpio, LED_B, LED_ON);
delay(1000);
XGpioPs_WritePin(&Gpio, LED_R, LED_OFF);
delay(1000);
XGpioPs_WritePin(&Gpio, LED_G, LED_OFF);
delay(1000);
XGpioPs_WritePin(&Gpio, LED_B, LED_OFF);
delay(1000);
}
cleanup_platform();
}
類似MIO方式(都為PS部分GPIO操作),設(shè)置為輸出并設(shè)置輸出使能,但要注意這里的GPIO號是從54開始的3個。
IP方式實現(xiàn)GPIO
vivado中zynq設(shè)置如下圖
圖中可知GPIO中MIO和EMIO都不選擇,但要打開M_AXI_GP接口(這里選擇M_AXI_GP0)和復(fù)位管腳,如下圖
當(dāng)然用到了PL部分邏輯則至少需要一個時鐘輸出到PL部分,這里選擇FCLK_CLK0輸出50MHz,如下圖
推薦加入zynq后,不要自動連接,再加入gpio并位寬設(shè)置為3,具體設(shè)置如下圖
GPIO設(shè)置好后,再點擊上面的藍色字體的自動連接,即可得到上面的連接,這樣可以減少手動連接量。
最后vivado中連接如下圖
與EMIO類似需要將頂層三個GPIO管腳要綁定到芯片對應(yīng)管腳上。
軟件部分如下
#include
#include "platform.h"
#include "xgpio.h"
#define AXI_GPIO_DEVICE_ID XPAR_GPIO_0_DEVICE_ID
#define XGPIO_BANK1 1
#define XGPIO_BANK2 2
#define LED34_R_PIN 0x01
#define LED34_G_PIN 0x02
#define LED34_B_PIN 0x04
static void delay(int dly)
{
int i, j;
for (i = 0; i < dly; i++) {
for (j = 0; j < 0xffff; j++) {
;
}
}
}
int main()
{
XGpio_Config *XGpioCfg;
XGpio XGpio;
int Status;
init_platform();
XGpioCfg = XGpio_LookupConfig(AXI_GPIO_DEVICE_ID);
Status = XGpio_CfgInitialize(&XGpio, XGpioCfg, XGpioCfg->BaseAddress);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
XGpio_SetDataDirection(&XGpio, XGPIO_BANK1, ~(LED34_R_PIN | LED34_G_PIN | LED34_B_PIN));
XGpio_DiscreteWrite(&XGpio, XGPIO_BANK1, LED34_R_PIN | LED34_G_PIN | LED34_B_PIN);
while (1) {
XGpio_DiscreteWrite(&XGpio, XGPIO_BANK1, ~LED34_R_PIN);
delay(1000);
XGpio_DiscreteWrite(&XGpio, XGPIO_BANK1, ~(LED34_R_PIN | LED34_G_PIN));
delay(1000);
XGpio_DiscreteWrite(&XGpio, XGPIO_BANK1, ~(LED34_R_PIN | LED34_G_PIN | LED34_B_PIN));
delay(1000);
XGpio_DiscreteWrite(&XGpio, XGPIO_BANK1, ~(LED34_G_PIN | LED34_B_PIN));
delay(1000);
XGpio_DiscreteWrite(&XGpio, XGPIO_BANK1, ~(LED34_B_PIN));
delay(1000);
XGpio_DiscreteWrite(&XGpio, XGPIO_BANK1, LED34_R_PIN | LED34_G_PIN | LED34_B_PIN);
delay(1000);
}
cleanup_platform();
return 0;
}
這里實現(xiàn)的功能與EMIO方式中功能相同,當(dāng)時IP方式中為PL部分實現(xiàn)的GPIO,所以調(diào)用的函數(shù)與前面兩種GPIO實現(xiàn)函數(shù)不同,注意包含的GPIO頭文件,前兩種是#include "xgpiops.h"而這最后一種為#include "xgpio.h"
總結(jié)
MIO和EMIO方式使用PS部分的GPIO模塊,其中MIO方式不占用PL部分資源,其輸出管腳只能為固定的54個(而且要在未被其它外設(shè)使用的情況下),EMIO方式會占用PL的管腳資源,其管腳可在PL部分任意選擇(除特殊功能管腳),IP方式除了占用PL部分管腳資源外還會占用PL部分邏輯資源,所以其GPIO功能在PL部分實現(xiàn)其調(diào)用函數(shù)也和前兩種不同,最后EMIO和IP方式在vivado都需要綁定管腳。
發(fā)布評論請先 登錄
相關(guān)推薦
FOC中的三種電流采樣方式,你真的會選擇嗎?(可下載)
三種太赫茲波的產(chǎn)生方式

示波器的三種觸發(fā)模式

systemd journal收集日志的三種方式

I2S有左對齊,右對齊跟標(biāo)準(zhǔn)的I2S三種格式,那么這三種格式各有什么優(yōu)點呢?
Windows管理內(nèi)存的三種主要方式
如何利用三種 SOT-563 封裝實現(xiàn)共同布局

shell腳本執(zhí)行的三種方式及區(qū)別
簡述三種esp32的開發(fā)方式是什么
常用的pwm跟蹤控制方式是哪三種
計算機網(wǎng)絡(luò)中的三種通信方式
逆變電路的三種調(diào)壓方式
交流電力控制電路三種控制方式
在線視頻會議軟件有哪些?三種實現(xiàn)方式

評論