基于Lemon ZYNQ的PS实验三  GPIO之按键功能演示(EMIO方式)

本次实验主要演示EMIO 的GPIO读取(输入)功能。

  • 此章节内容适用于Lemon ZYNQ主板,如是其他板子请看对应板子目录
  • 本文在 vivado2018.3版本上演示

一、硬件介绍

先看原理图,由原理图可以看出板子上接了四个按键,并且默认是通过下拉电阻下拉到GND的,也就是当按键没有按下的时候 按键KEY 的信号脚是0V ,当按键按下后,该信号脚被拉高到3.3V 。

为了演示按键的功能,这里再在工程中引入LED指示灯,指示灯之前章节的例子里测试过,将LED的驱动脚拉高,指示灯亮,拉低指示灯熄灭。

为了方便代码的演示,这里仅用两个按键,和两个LED进行测试

二、工程创建

整个工程的详细创建流程可以参考试验一中的内容,这里不再详细描述了。基于Lemon ZYNQ的PS实验一 GPIO之用EMIO方式点亮LED(完整图文) (芯片型号选XC7Z020CLG400-1)

三、Vivado 中的设置

1)在BLOCK DESIGN 中搜索并添加一个ZYNQ模块

2)在ZYNQ 设置界面,设置 DDR MT41K256M16RE-125的型号 和位宽16bit

 3)因为Lemon ZYNQ主板的PS时钟是50M的晶振输入的,所以这里需要把默认的PS输入时钟33.33M改成50M

4)添加4个EMIO ,其中两个用来驱动LED灯,另两个用来读取按键KEY的信息

5)对GPIO make external,并且连接AXI的时钟(AXI默认开启的,这里用不到AXI,也可以去设置里关闭AXI功能,就不需要连接了)

6)点选Create HDL Wrapper

7)之后创建和添加约束文件:

set_property PACKAGE_PIN P14 [get_ports {GPIO_0_0_tri_io[3]}]
set_property PACKAGE_PIN R14 [get_ports {GPIO_0_0_tri_io[2]}]
set_property PACKAGE_PIN D20 [get_ports {GPIO_0_0_tri_io[1]}]
set_property PACKAGE_PIN D19 [get_ports {GPIO_0_0_tri_io[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {GPIO_0_0_tri_io[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {GPIO_0_0_tri_io[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {GPIO_0_0_tri_io[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {GPIO_0_0_tri_io[0]}]

8) 之后对程序进行正常的编译综合,并且导出 Export Hardware (勾选 include bitstream)供SDK加载

四、PS部分程序设计:

1) 在SDK环境下建立一个名为KEY_TEST空的工程,并且添加main.c 添加如下代码:

#include "xparameters.h"
#include "xgpiops.h"
#include "xstatus.h"
#include "xplatform_info.h"
#include "xscutimer.h"
#include "Xscugic.h"

#define LED2 57
#define LED1 56
#define KEY2 55
#define KEY1 54

#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
XGpioPs Gpio;


void Gpio_Init(void){
XGpioPs_Config *ConfigPtr;

ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);

XGpioPs_SetDirectionPin(&Gpio, LED1, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED1, 1);
XGpioPs_WritePin(&Gpio, LED1, 1);

XGpioPs_SetDirectionPin(&Gpio, LED2, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED2, 1);
XGpioPs_WritePin(&Gpio, LED2, 1);

XGpioPs_SetDirectionPin(&Gpio, KEY1, 0);
XGpioPs_SetDirectionPin(&Gpio, KEY2, 0);
}




int main(void)
{
Gpio_Init();

while(1){
if(XGpioPs_ReadPin(&Gpio, KEY1)==1){
XGpioPs_WritePin(&Gpio, LED1, 1);
XGpioPs_WritePin(&Gpio, LED2, 0);
}
else if(XGpioPs_ReadPin(&Gpio, KEY2)==1){
XGpioPs_WritePin(&Gpio, LED1, 0);
XGpioPs_WritePin(&Gpio, LED2, 1);
}
}

return 0;
}

程序很简单, Gpio_Init是对4个GPIO进行初始化, 因为EMIO 是从54的管脚号开始的,所以根据原先VIVADO 的管脚约束来看,两个按键应该对应54和55,两个LED灯对应56和57

#define LED2    	57
#define LED1    	56
#define KEY2    	55
#define KEY1    	54

XGpioPs_SetDirectionPin(&Gpio, KEY1, 0); 最后的0代表设置GPIO的方向为输入。

使用 XGpioPs_ReadPin(&Gpio, KEY1) 检查按键1的状态。如果按键1被按下(返回值为1),则点亮LED1并熄灭LED2。如果按键1没有被按下,再检查按键2(KEY2)。如果按键2被按下,则熄灭LED1并点亮LED2。(上电后两个灯默认都亮)。

五、下载到板子上进行验证

1)新创建的工程最好先对Run as 进行配置:右键工程,并点选Run As -> Run Configurations

2) 在弹出的窗口中对Reset entire system 和 Program FPGA两个选项进行勾选操作,这样就不会出现下载程序debug的时候概率性不工作的问题了。(这样操作后系统会自动对FPGA进行配置,不需要按之前工程手动对FPGA进行编程了)

PS如果没有出现下图对话框,可以直接双击左侧的applicationo (System Debugger)。

3)设置好之后,选择Run As -> Launch on Hardware (System Debugger) 或者 Launch on Hardware (GDB)。

如果之前的操作都正确的话,下载成功后,主板上的LD0(对应程序的LED1),和LD1(对应程序的LED2)将会被点亮, 当按下BTN0(KEY1)或者BTN1(KEY2)之后,对应的LED会被点亮而另一个LED会熄灭。 证明我们所编写的基于EMIO的按键输入程序已经成功运行了。

程序仅作演示,实际项目中需要对按键增加按键消抖程序,否则按下瞬间会反复触发程序代码

  • 本文的完整工程下载:03_PS_KEY_EMIO_TEST
  • VIVADO的版本:2018.3
  • 工程创建目录: E:\Lemon_ZYNQ\SDK\03_PS_KEY_EMIO_TEST

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注