GPIO 之 EMIO 按键控制 LED 实验目的
使用启明星 ZYNQ 底板上的两个用户按键分别控制 PS 端两个 LED 的亮灭
其中一个按键 PL_KEY0 连接到了 PL 端,需要通过 EMIO 进行扩展,另外一个按键是底板上 PS 端的用户按键PS_KEY0,这两个按键分别控制 PS_LED0 和 PS_LED1
底板上的 PS_KEY0 控制 PS_LED0、PL_KEY0 控
制 PS_LED1。两个 LED 灯在按键按下的时候点亮,释放后熄灭。
简介
ZYNQ GPIO 接口信号被分成四组,分别是从 BANK0 到 BANK3。其中 BANK0 和 BANK1 中共计 54
个信号通过 MIO 连接到 ZYNQ 器件的引脚上,这些引脚属于 PS 端;而 BANK2 和 BANK3 中共计 64 个信
号则通过 EMIO 连接到了 ZYNQ 器件的 PL 端
硬件设计
创建 Vivado 工程
另存工程
使用 IP Integrator 创建 Processing System
在 Flow Navigator 中,点击 IP INTEGRATOR 下的 Open Block Design
在 Diagram 窗口中,双击打开 ZYNQ7 Processing System 重定义窗口
通过 EMIO 扩展一个 1 位的 GPIO 接口信号,此信号将用于连接 PL 端的引脚
点击选中该端口,然后点击
鼠标右键,在弹出的列表中选择“Make External”,
看到 ZYNQ7 Processing System 引出了一个名为 GPIO_0_0 的接口
点击选中该接口,在左侧External Interface Properties 一栏中将该接口的名称修改为GPIO_EMIO_KEY
按 Ctrl+S 快捷键保存设计
生成顶层 HDL
在 Sources 窗口中展开 Design Sources,然后右键点击 sysetm_wrapper 下的 system.bd,在弹出的菜
单中选择 Generate Output Products
生成 Bitstream 文件并导出硬件
在左侧 Flow Navigator 导航栏中找到 RTL ANALYSIS,点击该选项中的“Open Elaborated Design”,
在 ELABORATED DESIGN 界面下方找到 I/O Ports 窗口
Ctrl+S 快捷键保存
并生成 Bitstream 文件
导出硬件
File > Export > Export hardware
勾选“Include bitstream”
点击“Next”
如果我们的设计使用了 PL 的资源,比如使用了 PL 的引脚,或者在 PL 内实现了部
分功能模块,那么我们就需要生成 Bitstream 文件,并在导出硬件的时候包含该文件
软件设计
#include "xparameters.h" //器件参数信息
#include "xstatus.h" //包含 XST_FAILURE 和 XST_SUCCESS 的宏定义
#include "xil_printf.h" //包含 print()函数
#include "xgpiops.h" //包含 PS GPIO 的函数
#include "sleep.h" //包含 sleep()函数
// MIO 引脚的高电平对应的是 LED 灯亮,低电平对应 LED 灯灭
//宏定义 GPIO_DEVICE_ID
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
//连接到 MIO 的 LED
#define MIOLED0 7 //连接到 MIO7
#define MIOLED1 8 //连接到 MIO8
#define MIOKEY0 12 //连接到 MIO12
#define EMIOKEY0 54 //连接到PL_KEY0
XGpioPs Gpio; // GPIO 设备的驱动程序实例
int main()
{
int Status;
XGpioPs_Config *ConfigPtr;
print(" LJL EMIO Test! \n\r");
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS){
return XST_FAILURE;
}
//设置指定引脚的方向:0 输入,1 输出
XGpioPs_SetDirectionPin(&Gpio, MIOLED0, 1);
XGpioPs_SetDirectionPin(&Gpio, MIOLED1, 1);
XGpioPs_SetDirectionPin(&Gpio, MIOKEY0, 0);//输入
XGpioPs_SetDirectionPin(&Gpio, EMIOKEY0, 0);
//使能指定引脚输出:0 禁止输出使能,1 使能输出
XGpioPs_SetOutputEnablePin(&Gpio, MIOLED0, 1);
XGpioPs_SetOutputEnablePin(&Gpio, MIOLED1, 1);
while (1) {
XGpioPs_WritePin(&Gpio, MIOLED0, XGpioPs_ReadPin(&Gpio, MIOKEY0)); //向指定引脚写入数据:0 或 1
XGpioPs_WritePin(&Gpio, MIOLED1, XGpioPs_ReadPin(&Gpio, EMIOKEY0));
}
return XST_SUCCESS;
}
下载验证
完成比完美重要!!!
学习记录,侵权联系删除
来源:正点原子