1 实验任务
本实验任务是使用GPIO通过PL侧EMIO按键控制PS侧LED的亮灭,实现LED闪烁的效果。
2 系统框图
3 硬件设计
3.1 Block Design
- 添加ZYNQ7 Processing System IP核
- (1)在Peripheral I/O Pins页面
- 1)勾选UART
- 2)勾选GPIO MIO
- 3)勾选GPIO EMIO
- 4)正确选择Bank 0和Bank 1的电压
- (2)在MIO Configuration页面,设置GPIO EMIO位宽
- (3)在DDR Configuration页面
- 1)DDR Controller Configuration下,合理配置Memory Type、Memory Part和Bus Width等参数
- (1)在Peripheral I/O Pins页面
3.2 注意事项
- GPIO EMIO通过IOBUF与用户I/O相连,可实现三态功能。
4 软件设计
4.1 注意事项
- 实现PS侧两个按键控制PS侧两个LED灯亮灭、PL侧4个按键控制PL侧4个LED灯亮灭(与系统框图不同)。
4.2 工程源码
/***************************** Include Files ********************************/
#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "xstatus.h"
#include "sleep.h"
/************************** Constant Definitions ****************************/
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define PS_LED0_GPIO_PIN 0
#define PS_LED1_GPIO_PIN 13
#define PS_KEY0_GPIO_PIN 50
#define PS_KEY1_GPIO_PIN 51
#define PL_KEY0_GPIO_PIN 54
#define PL_KEY1_GPIO_PIN 55
#define PL_KEY2_GPIO_PIN 56
#define PL_KEY3_GPIO_PIN 57
#define PL_LED0_GPIO_PIN 58
#define PL_LED1_GPIO_PIN 59
#define PL_LED2_GPIO_PIN 60
#define PL_LED3_GPIO_PIN 61
/**************************** Type Definitions ******************************/
/***************** Macros (Inline Functions) Definitions ********************/
/************************** Function Prototypes *****************************/
int GpioPsInit(XGpioPs* GpioPsInstPtr);
/************************** Variable Definitions ****************************/
XGpioPs GpioPsInst;
/****************************************************************************/
int GpioPsInit(XGpioPs* GpioPsInstPtr)
{
//
int Status;
XGpioPs_Config* GpioPsConfigPtr;
//
GpioPsConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
Status = XGpioPs_CfgInitialize(GpioPsInstPtr, GpioPsConfigPtr, GpioPsConfigPtr->BaseAddr);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
// 设置LED为输出
XGpioPs_SetDirectionPin(GpioPsInstPtr, PS_LED0_GPIO_PIN, 1);
XGpioPs_SetDirectionPin(GpioPsInstPtr, PS_LED1_GPIO_PIN, 1);
XGpioPs_SetDirectionPin(GpioPsInstPtr, PL_LED0_GPIO_PIN, 1);
XGpioPs_SetDirectionPin(GpioPsInstPtr, PL_LED1_GPIO_PIN, 1);
XGpioPs_SetDirectionPin(GpioPsInstPtr, PL_LED2_GPIO_PIN, 1);
XGpioPs_SetDirectionPin(GpioPsInstPtr, PL_LED3_GPIO_PIN, 1);
// 设置KEY为输入
XGpioPs_SetDirectionPin(GpioPsInstPtr, PS_KEY0_GPIO_PIN, 0);
XGpioPs_SetDirectionPin(GpioPsInstPtr, PS_KEY1_GPIO_PIN, 0);
XGpioPs_SetDirectionPin(GpioPsInstPtr, PL_KEY0_GPIO_PIN, 0);
XGpioPs_SetDirectionPin(GpioPsInstPtr, PL_KEY1_GPIO_PIN, 0);
XGpioPs_SetDirectionPin(GpioPsInstPtr, PL_KEY2_GPIO_PIN, 0);
XGpioPs_SetDirectionPin(GpioPsInstPtr, PL_KEY3_GPIO_PIN, 0);
// 使能输出
XGpioPs_SetOutputEnablePin(GpioPsInstPtr, PS_LED0_GPIO_PIN, 1);
XGpioPs_SetOutputEnablePin(GpioPsInstPtr, PS_LED1_GPIO_PIN, 1);
XGpioPs_SetOutputEnablePin(GpioPsInstPtr, PL_LED0_GPIO_PIN, 1);
XGpioPs_SetOutputEnablePin(GpioPsInstPtr, PL_LED1_GPIO_PIN, 1);
XGpioPs_SetOutputEnablePin(GpioPsInstPtr, PL_LED2_GPIO_PIN, 1);
XGpioPs_SetOutputEnablePin(GpioPsInstPtr, PL_LED3_GPIO_PIN, 1);
//
return XST_SUCCESS;
}
int main()
{
//
int Status;
u32 ps_key0_val;
u32 ps_key1_val;
u32 pl_key0_val;
u32 pl_key1_val;
u32 pl_key2_val;
u32 pl_key3_val;
//
printf("GPIO's EMIO Control LED Test\n");
//
Status = GpioPsInit(&GpioPsInst);
if (Status == XST_FAILURE) {
printf("GPIO Init Failed.\n");
}
//
while(1)
{
//读取KEY的值
ps_key0_val = XGpioPs_ReadPin(&GpioPsInst, PS_KEY0_GPIO_PIN);
ps_key1_val = XGpioPs_ReadPin(&GpioPsInst, PS_KEY1_GPIO_PIN);
pl_key0_val = XGpioPs_ReadPin(&GpioPsInst, PL_KEY0_GPIO_PIN);
pl_key1_val = XGpioPs_ReadPin(&GpioPsInst, PL_KEY1_GPIO_PIN);
pl_key2_val = XGpioPs_ReadPin(&GpioPsInst, PL_KEY2_GPIO_PIN);
pl_key3_val = XGpioPs_ReadPin(&GpioPsInst, PL_KEY3_GPIO_PIN);
//使用KEY的值控制LED亮灭
XGpioPs_WritePin(&GpioPsInst, PS_LED0_GPIO_PIN, ps_key0_val);
XGpioPs_WritePin(&GpioPsInst, PS_LED1_GPIO_PIN, ps_key1_val);
XGpioPs_WritePin(&GpioPsInst, PL_LED0_GPIO_PIN, pl_key0_val);
XGpioPs_WritePin(&GpioPsInst, PL_LED1_GPIO_PIN, pl_key1_val);
XGpioPs_WritePin(&GpioPsInst, PL_LED2_GPIO_PIN, pl_key2_val);
XGpioPs_WritePin(&GpioPsInst, PL_LED3_GPIO_PIN, pl_key3_val);
}
//
return 0;
}