还是上个图,BANK0和BANK1是54个MIO,BANK2和BANK3是64个EMIO。
想要使用EMIO就需要PS+PL两部分结合,EMIO需要引脚分配。
以下以zturn 开发板控制RED三色为实验。
1. 硬件搭建
硬件主要配置EMIO以及DDR,同时进行对应的管脚约束。
形成的系统结构如下图所示。
1. 软件编程
#include "xgpiops.h"
#include "sleep.h"
int main()
{
static XGpioPs psGpioInstancePtr;
XGpioPs_Config* GpioConfigPtr;
int iPinNumber= 54; //第一个RGB_Led连接的是EMIO0
int iPinNumber1 = 55;//第一个RGB_Led连接的是EMIO1
int iPinNumber2 = 56;//第一个RGB_Led连接的是EMIO2
u32 uPinDirection = 0x1; //1表示输出,0表示输入
int xStatus;
//--MIO的初始化
GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
if(GpioConfigPtr == NULL)
return XST_FAILURE;
if(XST_SUCCESS != xStatus)
print(" PS GPIO INIT FAILED \n\r");
//--MIO的输入输出操作
XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber,uPinDirection);//配置EMIO0输出方向
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber,1);//配置EMIO0的第1位输出
XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber1,uPinDirection);//配置EMIO1输出方向
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber1,1);//配置EMIO1的第1位输出
XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber2,uPinDirection);//配置EMIO2输出方向
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber2,1);//配置EMIO2的第1位输出
while(1)
{
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1);//熄灭EMIO0的输出1
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber1, 1);//熄灭EMIO1的输出1
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber2, 1);//熄灭EMIO2的输出1
usleep(500000); //延时
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0);//点亮EMIO0的输出0
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber1, 0);//点亮EMIO1的输出0
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber2, 0);//点亮EMIO2的输出1
usleep(500000); //延时
}
return 0;
}
从以上程序看出,PS操作EMIO同控制MIO一样,只是有两点注意:(1)控制多少个EMIO都是从iPinNumber=54开始的,即第54位,而依靠硬件引脚映射完成;(2)控制EMIO与MIO的灯相反,1是熄灭,0是点亮。