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
");
        return XST_FAILURE;
    }
    Status = XGpioPs_CfgInitialize(GpioPsPtr,ConfigPtr,
                                 ConfigPtr->BaseAddr); 
    if (Status != XST_SUCCESS) 
    { 
        xil_printf("Cfg init err
"); 
        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
");
        return XST_FAILURE;
    }
    Status = XGpioPs_CfgInitialize(GpioPsPtr,ConfigPtr,
                                    ConfigPtr->BaseAddr);
    if (Status != XST_SUCCESS) {
            xil_printf("Cfg init err
");
            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

原文地址:https://www.cnblogs.com/protogenoi/p/9805418.html