• 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

  • 相关阅读:
    生物学上描述DNA/RNA的长度常用的kb、nt、bp是指什么
    置换检验代码, matlab codes for permutation tests
    MATLAB命令大全——以字母顺序进行分类
    2011年春季C语言课程设计指导书
    C/C++语言课程设计任务书
    hibernate 自动生成数据库表
    利用Tomcat的用户名和密码构建“永久”后门
    flex成品作不知道有哪位大神能看懂是干嘛的
    wikioi1014 装箱问题
    怎样把USB键盘接到Android手机上
  • 原文地址:https://www.cnblogs.com/protogenoi/p/9805418.html
Copyright © 2020-2023  润新知