zcu102_3_EMIO实现按钮控制LED

该博客介绍了如何在ZCU102开发板上使用Zynq MPSoC的EMIO来控制LED灯,通过轮询和中断两种方式响应按钮输入。在Vivado中配置Block Design,将GPIO EMIO接口引出,然后在SDK中编写C代码实现按钮状态的检测。轮询方式不断检查按钮状态,而中断方式则在按钮变化时触发中断服务程序。
摘要由CSDN通过智能技术生成


本文配套原码工程上传至 https://download.csdn.net/download/botao_li/10908368

EMIO

EMIO是由PS负责控制,由PL负责连接管脚的GPIO

具体说明见ug1085的General Purpose I/O章节

根据Zynq MPSOC的设计,EMIO占用GPIO BANK3至5的全部32位,对应GPIO的序号78至174,共96个EMIO

但是在PS模块中引出的PL中断会默认占用高序号值的EMIO,如本实验中PS模块的pl_resetn0复位信号占用了序号174的EMIO

Block Design

建立Vivado工程,建立Block Design
在这里插入图片描述

添加Zynq UltraScale+ MPSoC模块
在这里插入图片描述

双击Zynq模块打开设置,并关闭不使用的默认配置项
在这里插入图片描述

UART用于标准IO输出,与主机通过串口连接查看程序运行状况

注意与zcu102的UART管脚对应,只有上图中的MIO序号才能正确与主机串口连接

GPIO EMIO设置引出的EMIO接口数目,从低序号至高序号

当前的配置引出13个EMIO接口,对应GPIO序号为78至90
在这里插入图片描述

配置完成后Zynq模块出现GPIO_0的端口,注意端口总线[12:0]对应GPIO序号[90:78]
在这里插入图片描述

右键点击GPIO_0端口,选择Make External,用于在PL定义管脚约束
在这里插入图片描述

完成Block Design如下图所示
在这里插入图片描述

在Sources窗口,右键点击Block Design,选择Generate Output Products,在弹出窗口中配置并选择Generate
在这里插入图片描述

完成后右键点击Block Design,选择Create HDL Wrapper,给Block Design封装顶层HDL模块

按默认配置完成后Sources窗口如下
在这里插入图片描述

在Flow Navigator中选择Run Synthesis,完成后选择Open Synthesized Design
在这里插入图片描述

打开综合结果后,在Layout菜单选择I/O Planning
在这里插入图片描述

在I/O Ports窗口设置管脚和电平,参考ug1182

低8位为LED,高5位为按钮
在这里插入图片描述

保存后,根据提示添加约束文件top.xdc

在Flow Navigator中选择Generate Bitstream
在这里插入图片描述

结束后在File菜单选择Export Hardware,之后选择Launch SDK
在这里插入图片描述

注意Export Hardware的弹出窗口选择Include Bitstream,方便SDK中加载Bit文件,否则得在SDK中手动查找

SDK

打开SDK后在File菜单选择建立工程
在这里插入图片描述

在弹出窗口中建立HelloWorld模板工程
在这里插入图片描述
在这里插入图片描述

在生成的emio_test工程中双击打开helloworld.c文件进行编程
在这里插入图片描述

在PS程序中抓取按钮状态有2种方式:轮询(Poll)和中断(Intr)

2种方式的代码在本文最下方,实现按钮按下后对应LED点亮,按钮弹起后LED熄灭

完成代码后在emio_test工程上右键菜单选择Run Configuration
在这里插入图片描述

在System Debugger上右键选择New,建立新的配置,并且如下配置
在这里插入图片描述

可以在此窗口选择Apply之后,按Run按钮运行,也可以在窗口关闭后,在工程上点击右键选择
在这里插入图片描述

Debug也可以用同样的方式设置,但是Debug模式不会进入中断响应函数,只有Run才能正常中断

轮询方式抓取按钮代码

#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"

XGpioPs Gpio;

int main(void)
{
   
	print("emio test begins");

	int Status;
	XGpioPs_Config *ConfigPtr;

	//根据ID,查找配置
	//参数来源于xparameters.h
	ConfigPtr = XGpioPs_LookupConfig(XPAR_XGPIOPS_0_DEVICE_ID);
    if (ConfigPtr == NULL)
	{
   
		return XST_FAILURE;
	}

	//初始化
	//根据配置初始化gpio对象
	Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
	if (Status != XST_SUCCESS)
	{
   
		return XST_FAILURE;
	}

	//根据ug1085,EMIO的IO序号为78~173,对应95个EMIO

	//设置8个LED的GPIO方向为输出
	XGpioPs_SetDirectionPin(&Gpio, 78, 1);
	XGpioPs_SetDirectionPin(&Gpio, 79, 1);
	XGpioPs_SetDirectionPin(&Gpio, 80, 1);
	XGpioPs_SetDirectionPin(&Gpio, 81, 
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值