cuter

【再话ZED】EMIO使用笔记

0
阅读(5078) 评论(2)

前言:这篇文章其实有一半是年前在回家的火车上写的,家里上网不方便,手机试了也不行,所以就一直没有发出来,回来才补齐了程序。

 

踏上回家的征程了,写篇笔记打发打发漫长的旅程。

开篇想吐槽高铁…大多数城市的高铁站太偏了,而且没有配套设施。苏州京沪高铁北站里面只有一两家吃饭的地方,今天人品不好,从宿舍坐到高铁站用了将近100分钟,早晨有个同事才用了50分钟,这rp指数差得略大。坐普通车虽然慢,但火车站一般不会太偏,所以综合起来看,高铁的速度又慢了很多。偏偏很多朋友在让我回家玩的时候总是拿高铁说事,听起来多好,苏州到徐州,俩小时到了…都没想过我去高铁站还要俩小时…

现在已经坐上车了,饿着肚子,只能回家吃了。不过高铁确实快,苏州下着大雪呢,车开了几分钟就已经看不到雪了,两个小时左右就到徐州东了。

说了这么多,跟个怨妇似的,言归正传吧。

最近想做一个小东西,要用到几个独立按键。像之驱动OLED那样用IP核的话,感觉稍微复杂了些,所以打算研究一下EMIO的使用。网上谷歌了一下,没发现什么有价值的参考资料,所以又要自己摸索了。不过幸好官方给过一个例子有用到EMIO,虽然很多地方是一笔带过,但参考价值不容小觑,没记错的话是UG873,名字好像简称CTT,也是这篇笔记的主要参考文献。

EMIO的使用搞明白之后会感叹:“原来这么简单!”但回头想想摸索的过程,也有一点点蛋疼。所以还是记录一下,同时也希望能帮到需要的网友。

EMIO使用流程如下:

1. 使能EMIO。

在14.2这个使能找起来稍微麻烦些,在可编程的模块中找到一个“general setting” 的模块,单击后在弹出的界面中可以找到使能选项,打√;然后设定位宽就可以了。此时,进入原理图界面可以看到内核模块引出了GPIO(不是54个MIO)。

2. 初始化GPIO。

这里注意,使能了EMIO之后,BSP才会生成对应的驱动程序。应该是XGpioPs打头的,驱动程序的大多数函数都是以XGpioPs打头的,这里和MIO的初始化是不同的,使用的时候需要留心。

3. 使用GPIO。

操作GPIO无非就是使用驱动函数。常用的函数有输入输出设定函数;单个引脚的读写函数WritePin,ReadPin;驱动程序里的注释还算详尽,就不多说了。

参考程序如下:

/***************************** Include Files ********************************/

#include "xparameters.h"
#include "xgpiops.h"
#include "xstatus.h"
#include <xil_printf.h>
#include "sleep.h"
/************************** Constant Definitions ****************************/

/*
 * The following constants map to the XPAR parameters created in the
 * xparameters.h file. They are defined here such that a user can easily
 * change all the needed parameters in one place.
 */
#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID

/*
 * Following constant define the Input and Output pins.
 */
#define OUTPUT_PIN		55	/* Pin connected to LED/Output */
#define INPUT_PIN		54	/* Pin connected to Switch/Input */
#define OUT	1
#define IN 0

/**************************** Type Definitions ******************************/

/***************** Macros (Inline Functions) Definitions *******************/

/************************** Function Prototypes ****************************/
int InitEMIO(void);

/************************** Variable Definitions **************************/

/*
 * The following are declared globally so they are zeroed and can be
 * easily accessible from a debugger.
 */
XGpioPs Gpio;	/* The driver instance for GPIO Device. */

int main(void)
{
	u32 key=1;
	u32 led=0;

	InitEMIO();

	while(1)
	{

		// 读输入引脚,接到按键
		key = XGpioPs_ReadPin(&Gpio, INPUT_PIN);
		if(key)
		{
			usleep(10000);		// 消抖延时
			if(key)
			{
				while(XGpioPs_ReadPin(&Gpio, INPUT_PIN))
					;				// 等待按键释放
				led = ~led;		// 按键按下,改变灯的状态
			}
		}
		// 写输出
		XGpioPs_WritePin(&Gpio, OUTPUT_PIN, led&0x01);

	}

	return 0;
}

int InitEMIO(void)
{
	int Status;
	XGpioPs_Config *ConfigPtr;

	// 初始化GPIO(包括EMIO)
	ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
	Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
					ConfigPtr->BaseAddr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	// 将EMIO 0,GPIO 64设为输入
	XGpioPs_SetDirectionPin(&Gpio, INPUT_PIN, IN);

	// 将EMIO 1,GPIO 65设为输出,用于点亮LED
	XGpioPs_SetDirectionPin(&Gpio, OUTPUT_PIN, OUT);
	XGpioPs_SetOutputEnablePin(&Gpio, OUTPUT_PIN, OUT);

	return 0;
}


 

文章最后,说一下EMIO使用时,引脚的pin number为 GPIO 0 <-> 54 ,以此类推。

最后给一下ug585中的说明,但是需要用EMIO的朋友,最好自己仔细看一下相关章节:

 

1、It also provides access to 64 inputs from the Programmable Logic
(PL) and 128 outputs to the PL through the EMIO interface.

2、• 192 GPIO signals between the PS  and PL via the EMIO interface
° 64 Inputs, 128 outputs (64 true outputs and 64 output enables)

3、

image


版权声明:

本文由博主“cuter”发布。欢迎转载,但不得擅自更改博文内容,也不得用于任何盈利目的。转载时不得删除作者简介和版权声明。如有盗用而不说明出处引起的版权纠纷,由盗用者自负。

博客官方地址:

ChinaAET:http://blog.chinaaet.com/cuter521

EDN China: http://bbs.ednchina.com/BLOG_cuter521_356737.HTM


  1. 匿名用户匿名用户
    // 将EMIO 0,GPIO 64设为输入
        XGpioPs_SetDirectionPin(&Gpio, INPUT_PIN, IN);

     // 将EMIO 1,GPIO 65设为输出,用于点亮LED


    这里应该是54和55吧~~



    64 true outputs and 64 output enables


    true outputs 和 output enables 有什么区别吗

  2. 最近在xilinx小组看到了一个关于EMIO的问题,感觉本文有点文不对题,准确地讲,本文叫GPIO使用笔记更加合适,文章讲的都是GPIO相关知识,只是在使用GPIO之前使能了EMIO接口。