1. 程式人生 > >ZYNQ. GPIO

ZYNQ. GPIO

GPIO

General Purpose I/O ,網上能找到很多關於znyq gpio 的文章。

 

分類:EMIO 、MIO 、AXI_GPIO

 

硬體系統

MIO和EMIO是在zynq核中配置的,MIO是固定的,EMIO是可選的使用PL的引腳。

AXI_GPIO是在PL端使用的GPIO,掛在znyq核的M_AXI_GP介面下使用。

需要zynq核,AXI_GPIO的使用PL端的模組,如AXI_GPIO

 

軟體部分

SDK的庫封裝是多層次的,

可以使用高層次的

  • xgpio.h  使用AXI_GPIO需要
  • xgpiops.h
       使用MIO和EMIO需要

或者是底層的

  • xgpio_l.h
  • xil_io.h

在高層次中模組被封裝成結構體例項,使用時呼叫例項,初始化讀寫。

而低層次中就是直接對地址進行讀寫,如下:

//write
XGpio_WriteReg(BaseAddress, RegOffset, Data) 
XGpio_Out32((BaseAddress) + (RegOffset), (u32)(Data))
//read
XGpio_ReadReg(BaseAddress, RegOffset) 
XGpio_In32((BaseAddress) + (RegOffset))

或更底層的。

我更喜歡高階的讀寫方式,因為更多資訊都在函式中表現出來了,下面是讀寫方式。

流程都是相似的:

  1. 定義Gpio或GpioPs結構體。
  2. 初始化配置。
  3. 設定讀寫方向、使能。
  4. 讀寫。GpioPs有Pin和Bank兩種方式。

code:

//GPIO

#define GPIO0_ADDR     XPAR_AXI_GPIO_0_BASEADDR
#define GPIO0_ID         XPAR_AXI_GPIO_0_DEVICE_ID

int main()
{
    XGpio Gpio0;    
    XGpioPs_Config *ConfigPtr;

    
int Status; u32 value = 0xa; /* Initialize the GPIO driver */ Status = XGpio_Initialize(&Gpio0, GPIO0_ID); if (Status != XST_SUCCESS) { xil_printf("Gpio Initialization Failed\r\n"); return XST_FAILURE; } Status = XGpioPs_CfgInitialize(GpioPsPtr,ConfigPtr, ConfigPtr->BaseAddr); if (Status != XST_SUCCESS) { xil_printf("Cfg init err\n"); return XST_FAILURE; } /* Set the direction */ XGpio_SetDataDirection(&Gpio0, CHANNEL, 0x00000000);//output // XGpio_Out32((GPIO1_ADDR) + (0), (u32)(value)); // XGpio_WriteReg(GPIO_ADDR, 0, value); XGpio_DiscreteWrite(&Gpio0, CHANNEL, value); return 0; } //GPIOPS #define GpioPsDeviceId XPAR_PS7_GPIO_0_DEVICE_ID #define pin 0 int main() { XGpioPs GpioPs; XGpioPs_Config *ConfigPtr; int Status; int value = 1; /* Initialize the Gpio driver. */ ConfigPtr = XGpioPs_LookupConfig(GpioPsDeviceId); if (ConfigPtr == NULL) { xil_printf("ERROR\n"); return XST_FAILURE; } Status = XGpioPs_CfgInitialize(GpioPsPtr,ConfigPtr, ConfigPtr->BaseAddr); if (Status != XST_SUCCESS) { xil_printf("Cfg init err\n"); return XST_FAILURE; } //set pin direction //value 0 -> input 1 -> output XGpioPs_SetDirectionPin(GpioPsPtr, pin0, 1); //value 0 -> disable 1 -> enable XGpioPs_SetOutputEnablePin(GpioPsPtr, pin0, 1); //write XGpioPs_WritePin(&GpioPs, pin0, value); return 0; }

 

 

 

via :

ug585  CH14 General Purpose I/O

https://blog.csdn.net/husipeng86/article/details/52123465

https://blog.csdn.net/yc461515457/article/details/40954363

https://blog.csdn.net/xzyiverson/article/details/19934837

https://blog.csdn.net/luoqindong/article/details/43017773?utm_source=blogxgwz0