您好,欢迎来到61ic! | [登录] [注册] 忘记密码 | 设为首页 帮助
 . 网站首页 . 业界新闻 . 设计中心 . 移动技术 . TI专栏 . ADI专栏 . FPGA专栏 . 代码工厂 . 官方商城 . 
 . 活动专区 . 新品快递 . 解决方案 . 前沿科技 . TI资源 . ADI资源 . FPGA资源 . 下载中心 . 产品展示 . 
加入收藏
付款方式
联系我们
您现在的位置: 61IC电子在线 >> FPGA专栏 >> Xilinx >> 正文
  Zynq正确的使用GPIO           ★★★ 【字体:
Zynq正确的使用GPIO
作者:xzy61003…    文章来源:xzy610030    点击数:    更新时间:2014-2-26    

zynq的开发中,有两种GPIO,一种是zynq自带的外设(MIO/EMIO),存在于PS中,第二种是PL中加入的AXI_GPIO  IP核。

参考链接:http://www.edw.com.cn/167

不过,个人觉得上面有错误的地方,就是MIO的头文件怎么回事xgpio.h呢,看bsp中的xgpio.h的说明,它就是为AXI_GPIO  IP核服务的。The XilinxGPIO controller is a soft IP core designed for Xilinx FPGAs的说明就是说明了这一点。

至于存在于PS中的MIO/EMIO,当然头文件在xgpiops.h里面了。

首先,先介绍第一种情况

static XGpioPs psGpioInstancePtr;   //定义PSGPIO指针,如果用到MIOEMIO也只要定义这一个就行

XGpioPs_Config *GpioConfigPtr; //XGpioPs结构体中还包含一个结构体,查bsp中的h文件

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");

XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber,uPinDirection);

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber,1);

XGpioPs_WritePin(&psGpioInstancePtr,iPinNumber,0);     //这里是写某一个pin,也有写一个bank的,陆书上P111就是写bank的。

举例:以LD9(在zed板上是MIO7),另外加上一位EMIO,即54,估计EMIO是从54位开始,有待验证(mark)。

static XGpioPs psGpioInstancePtr;   //定义PSGPIO指针,如果用到MIOEMIO也只要定义这一个就行

XGpioPs_Config *GpioConfigPtr; //XGpioPs 结构体中还包含一个结构体,查bsp中的h文件

int xStatus;

static int iPinNumber = 7; /*Led LD9 is connected to MIO pin 7*/

static int iPinNumberEMIO = 54;

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");

XGpioPs_SetDirectionPin(&psGpioInstancePtr, 7,1);  0输入,1输出

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 7,1);   0 dis1enable

XGpioPs_WritePin(&psGpioInstancePtr,7,0);

XGpioPs_SetDirectionPin(&psGpioInstancePtr, 54,0);  0输入,1输出

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 54,0);   0 dis1enable

注明:7可以用iPinNumber代替,54可以用 iPinNumberEMIO代替。

第二种情况:

       xps中加入GPIOIP核,这个已经在前面的博客中已经实现了,并且网上有各种实例,参见http://blog.csdn.net/xzyiverson/article/details/11818549

       这里前提是xps生成了bit流文件后,并导入到sdk中,然后再应用软件中操作该axi gpio,上述博客已经实现了,这里就是总结一下这样的axi gpio我们如果来操作。

       这里的端口名称为LED,有8位。

       在软件中,要做这些工作:

       static XGpio LED_Ptr;//定义GPIO指针

int XStatus;//函数返回状态

XStatus = XGpio_Initialize(&LED_Ptr,XPAR_AXI_LED_DEVICE_ID);

if(XST_SUCCESS != XStatus)

              print("GPIO INIT FAILED\n\r")

XGpio_SetDataDirection(&LED_Ptr, 1,0x00);//通道1;设置方向 0 输出 1输入

XGpio_DiscreteWrite(&LED_Ptr, 1,0xaa);

上述就是对axi gpio进行操作了,XGpio是一个结构体变量,如果对函数不清楚,我们可以在bsp中看看这些函数,但具体就是这么操作的,另外通道2不知道是什么,它是在我们添加ip核的时候出现的,不信的话你可以看看上述博客中式不是有一个channel2呢!

当然,总的来说,多看bsp中的函数才会豁然开朗。

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    ubuntu 上安装xilinx 14.1及…
    ubuntu上 搭建xilinx zynq l…
    从零开始,搭建zynq-7000的P…
    从零开始,搭建zynq-7000的P…
    从零开始,搭建zynq-7000的P…
    从零开始,搭建zynq-7000的P…
    从零开始,搭建zynq-7000的P…
    从零开始,搭建zynq-7000的P…
    ZYNQ调试遇到的种种问题汇总
    【再话ZedBoard】基于zynq的…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61 湘ICP备13001086号-2