前言
   xilinx公司在设计这款芯片时就同步编写了ps端的函数库,我们在对zynq这款芯片进行开发,直接调用库函数就可以了。不过比较难过的是,官方虽然编写了函数驱动库,但并没有出版相应的类似于函数指导之类的文档,需要开发者自己去理解这个函数用法,但官方还是有相应的历程,我们可以学历历程来基本掌握这些函数的用法,但并不是很详细,也没有说明文档,需要结合datasheet和其他的文档进行综合理解分析。
首先
gpio有两个重要的数据结构:XGpioPs 和 XGpioPs_Config

typedef struct {XGpioPs_Config GpioConfig;   /**< Device configuration */u32 IsReady;         /**< Device is initialized and ready */XGpioPs_Handler Handler;  /**< Status handlers for all banks */void *CallBackRef;      /**< Callback ref for bank handlers */u32 Platform;          /**< Platform data */u32 MaxPinNum;          /**< Max pins in the GPIO device */u8 MaxBanks;          /**< Max banks in a GPIO device */
} XGpioPs;typedef struct {u16 DeviceId;     /**< Unique ID of device */u32 BaseAddr;     /**< Register base address */
} XGpioPs_Config;

XGpioPs 结构体里面各个成员变量的大致作用:
  1:GpioConfig 是XGpioPs_Config结构体的指针,指向内部成员DeviceId和BaseAddr;这两个成员作用是保存gpio这个设备的Id和基地址,在zynq中任何外设都有一个相应的id和基地址用来识别。
  解析一下为什么我们在所有历程中或者别人的工程中看到的id都是0,它只是被用来初始化,表示这个设备在vivado搭建工程环境时我们勾选了这个设备,没有勾选的设备你是在#include "xparameters_ps.h"中找不到相应的id和地址的。
  2:IsReady,当设备初始化完成,设备已经准备好
  3:Handler ,中断句柄,用于中断读取和写入
  4:CallBackRef 中断回调函数,没有用到中断时可不做关心
  5:Platform 这个是跟你的开发板硬件平台相关,不做关心
  6:MaxPinNum ps端能使用的最大的pin数量,在zynq中为118
  7:MaxBanks 在zynq中的io bank数目为4

1:查询函数XGpioPs_LookupConfig()

XGpioPs_Config *XGpioPs_LookupConfig(u16 DeviceId)
{XGpioPs_Config *CfgPtr = NULL;u32 Index;for (Index = 0U; Index < (u32)XPAR_XGPIOPS_NUM_INSTANCES; Index++) {if (XGpioPs_ConfigTable[Index].DeviceId == DeviceId) {CfgPtr = &XGpioPs_ConfigTable[Index];break;}}return (XGpioPs_Config *)CfgPtr;
}

参数:设备id,我们可以在#include "xparameters_ps.h"找到id和地址

/* Definitions for peripheral PS7_GPIO_0 */
#define XPAR_PS7_GPIO_0_DEVICE_ID 0
#define XPAR_PS7_GPIO_0_BASEADDR 0xE000A000
#define XPAR_PS7_GPIO_0_HIGHADDR 0xE000AFFF

每一个设备都有一个唯一的配置表:

XGpioPs_Config XGpioPs_ConfigTable[XPAR_XGPIOPS_NUM_INSTANCES] =
{{XPAR_PS7_GPIO_0_DEVICE_ID,XPAR_PS7_GPIO_0_BASEADDR}
};

XGpioPs_LookupConfig这个函数就是根据设备id,查找配置表,然后将设备的地址等信息,通过XGpioPs_Config 指针返回。

2:初始化函数XGpioPs_CfgInitialize()

s32 XGpioPs_CfgInitialize(XGpioPs *InstancePtr, XGpioPs_Config *ConfigPtr,u32 EffectiveAddr)
{s32 Status = XST_SUCCESS;u8 i;Xil_AssertNonvoid(InstancePtr != NULL);Xil_AssertNonvoid(ConfigPtr != NULL);Xil_AssertNonvoid(EffectiveAddr != (u32)0);/** Set some default values for instance data, don't indicate the device* is ready to use until everything has been initialized successfully.*/InstancePtr->IsReady = 0U;InstancePtr->GpioConfig.BaseAddr = EffectiveAddr;InstancePtr->GpioConfig.DeviceId = ConfigPtr->DeviceId;InstancePtr->Handler = StubHandler;InstancePtr->Platform = XGetPlatform_Info();/* Initialize the Bank data based on platform */if (InstancePtr->Platform == XPLAT_ZYNQ_ULTRA_MP) {/**   Max pins in the ZynqMP GPIO device* 0 - 25,  Bank 0*    26 - 51, Bank 1*    52 - 77, Bank 2*    78 - 109, Bank 3*   110 - 141, Bank 4*  142 - 173, Bank 5*/InstancePtr->MaxPinNum = (u32)174;InstancePtr->MaxBanks = (u8)6;} else {/**  Max pins in the GPIO device*    0 - 31,  Bank 0*    32 - 53, Bank 1*    54 - 85, Bank 2*    86 - 117, Bank 3*/InstancePtr->MaxPinNum = (u32)118;InstancePtr->MaxBanks = (u8)4;}/** By default, interrupts are not masked in GPIO. Disable* interrupts for all pins in all the 4 banks.*/for (i=0;i<InstancePtr->MaxBanks;i++) {XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr,((u32)(i) * XGPIOPS_REG_MASK_OFFSET) +XGPIOPS_INTDIS_OFFSET, 0xFFFFFFFFU);}/* Indicate the component is now ready to use. */InstancePtr->IsReady = XIL_COMPONENT_IS_READY;return Status;
}

  参数1:XGpioPs 结构体指针
  参数2:指向XGpioPs_Config 设备指针
  参数3:指向设备基地址
**函数功能:**设置一些初始默认值,如:设置io的最大值和bank数,默认关闭中断等等。

使用

 static XGpioPs   psGpioInstancePtr;XGpioPs_Config*  GpioConfigPtr;int xStatus;GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);if(GpioConfigPtr == NULL)return XST_FAILURE;xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr, GpioConfigPtr->BaseAddr);if(XST_SUCCESS != xStatus)print(" PS GPIO INIT FAILED \n\r");

zynq7000系列PS端GPIO初始化函数XGpioPs_LookupConfig()和XGpioPs_CfgInitialize()详解相关推荐

  1. ZYNQ7000系列入门之GPIO点灯

    文章目录 ZYNQ AC7020 一.简介 二.MIO和EMIO/AXI_GPIO 1.MIO 2.EMIO 3.AXI_GPIO 三.开发板IO口 四.裸机开发点灯 1.代码部分 2.测试 五.li ...

  2. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  3. [Pytorch系列-61]:循环神经网络 - 中文新闻文本分类详解-3-CNN网络训练与评估代码详解

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  4. [Pytorch系列-60]:循环神经网络 - 中文新闻文本分类详解-2-LSTM网络训练与评估代码详解

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  5. 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(二)

    互斥量.条件变量与pthread_cond_wait()函数的使用,详解(二) 1.Linux"线程" 进程与线程之间是有区别的,不过linux内核只提供了轻量进程的支持,未实现线 ...

  6. 在python中使用关键字define定义函数_python自定义函数def的应用详解

    这里是三岁,来和大家唠唠自定义函数,这一个神奇的东西,带大家白话玩转自定义函数 自定义函数,编程里面的精髓! def 自定义函数的必要函数:def 使用方法:def 函数名(参数1,参数2,参数-): ...

  7. 如何使用指向类的成员函数的指针(详解!)

    原文:如何使用指向类的成员函数的指针(详解!) 另外一篇英文参考:Member Function Pointers and the Fastest Possible C++ Delegates 我们首 ...

  8. python def函数报错详解_python自定义函数def的应用详解

    这篇文章主要介绍了python自定义函数def的应用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 这里是三岁,来和大家唠唠 ...

  9. SQL Server时间粒度系列----第4节季、年时间粒度详解

    本文目录列表: 1.SQL Server季时间粒度 2.SQL Server年时间粒度 3.总结语 4.参考清单列表 SQL Serve季时间粒度   季时间粒度也即是季度时间粒度.一年每3个月是一个 ...

最新文章

  1. FPGA逻辑设计回顾(12)RAM以及ROM的RTL设计及其验证
  2. idea mybatis generator插件_在idea中使用mybatis generator逆向工程生成代码
  3. linux 重定向_Unix/Linux编程实践之IO重定向和管道
  4. java as uuid_java UUID 源码学习
  5. SpringMVC的工作流程
  6. zybo的linux开发教程,Zybo全栈开发入门教程——连载三:创建Linux设备驱动和应用程序...
  7. c语言画爱心附带解释,用C语言画一个“爱心”
  8. ios怎么引入masonry_iOS Masonry的使用需要注意的地方
  9. [剑指Offer] 36.两个链表的第一个公共结点
  10. 问卷星的自动答题脚本
  11. c# 调用有道智云翻译接口+语音组件tts
  12. 关于git的安装与配置问题
  13. 市场营销方式详尽客户调查报告:Inbound vs. Outbound
  14. R绘图笔记 | 生存曲线的绘制
  15. 微信小程序开发学习4(视图与逻辑)
  16. 【每日一题】P1551 亲戚
  17. 网站排名优化方法_快速排名窍门
  18. pytorch笔记(一)——tensor的storage()、stride()、storage_offset()
  19. 期权和期货的定义及区别
  20. tkinter教程4:控件LabelFrame和Entry

热门文章

  1. matlab三维图加上四维,matlab 3D+颜色的四维函数的作图
  2. Git学习————blibli大学
  3. Android 4.1官方文档chm格式
  4. IP TCP和HTTP
  5. Alien Skin Exposure X5与Adobe Camera Raw工作流程速度比较
  6. 约梭芬杀人算法 约梭芬杀人法
  7. 汤老师的Python标准库
  8. Ubuntu之which查看命令所在位置
  9. MySQL数据库,从入门到精通:第四篇——MySQL中常用的运算符及其用法
  10. D-OJ刷题日记:输出直接插入排序每趟比较的过程 题目编号:196