GPIO之EMIO按键控制LED——ZYNQ学习笔记3

news2024/9/24 21:04:08

一、EMIO简介

        ZYNQ GPIO 接口信号被分成四组,分别是从 BANK0 到 BANK3。其中 BANK0 和 BANK1 中共计 54个信号通过 MIO 连接到 ZYNQ 器件的引脚上,这些引脚属于 PS 端; 而 BANK2 和 BANK3 中共计 64 个信号则通过 EMIO 连接到了 ZYNQ 器件的 PL 端, 如下图所示:

        在大多数情况下, PS 端经由 EMIO 引出的接口会直接连接到 PL 端的器件引脚上, 通过 IO 管脚约束来指定所连接 PL 引脚的位置。 通过这种方式, EMIO 可以为 PS 端实现额外的 64 个输入引脚或 64 个带有输出使能的输出引脚。 EMIO 还有一种使用方式,就是用于连接 PL 内实现的功能模块( IP 核) , 此时 PL 端的 IP 作为 PS 端的一个外部设备, 如图 4.1.2 所示:

EMIO:扩展MIO,是PS与PL端的接口,当PS引脚不够用时,可以拓展EMIO使用PL端引脚

二、实验任务

        本章的实验任务是使用 Z100 底板上的两个用户按键分别控制 PS 端两个 LED 的亮灭。其中一个按键PL_KEY0 连接到了 PL 端, 需要通过 EMIO 进行扩展,另外一个按键是底板上 PS 端的用户按键 PS_KEY0,这两个按键分别控制 PS_LED0 和 PS_LED1,底板上的 PS_KEY0 控制 PS_LED0、 PL_KEY0 控制 PS_LED1。两个 LED 灯在按键按下的时候点亮,释放后熄灭

三、程序设计

1、整体框图:

2、硬件设计

根据实际需要选择位宽

对EMIO进行管脚约束

set_property -dict {PACKAGE_PIN J13 IOSTANDARD LVCMOS18} [get_ports GPIO_0_0_tri_io[0]]

 

 

 代码编写:

注意bank地址!!!

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"


#define GPIO_DEVICE_ID		XPAR_XGPIOPS_0_DEVICE_ID

#define MIO_LED1      7//MIO7
#define MIO_LED2      8//MIO8
#define MIO_LED0      0//MIO0
#define MIO_KEY0      12//MIO12
#define EMIO_KEY0     54//EMIO54

XGpioPs Gpio;	/* The driver instance for GPIO Device. */

int main(){
	XGpioPs_Config *ConfigPtr;
	u32 ps_key;
	u32 pl_key;
	//初始化GPIO驱动配置

	//根据器件ID来查找器件配置信息
	ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
	//对GPIO的驱动进行初始化
	XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);

	//设置引脚方向
	XGpioPs_SetDirectionPin(&Gpio, MIO_LED1, 1);
	XGpioPs_SetDirectionPin(&Gpio, MIO_LED2, 1);
	XGpioPs_SetDirectionPin(&Gpio, MIO_LED0, 1);
	//设置PS_KEY
	XGpioPs_SetDirectionPin(&Gpio, MIO_KEY0, 0);
	//设置PL_KEY
	XGpioPs_SetDirectionPin(&Gpio, EMIO_KEY0, 0);

	//设置输出使能   0:输入    1:输出
	XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED1, 1);
	XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED2, 1);
	XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED0, 1);
	printf("GPIO MIO TEXT!\n");
	while(1){
		ps_key = XGpioPs_ReadPin(&Gpio,MIO_KEY0);
		pl_key = XGpioPs_ReadPin(&Gpio,EMIO_KEY0);
		XGpioPs_WritePin(&Gpio, MIO_LED1, ps_key);
		XGpioPs_WritePin(&Gpio, MIO_LED2, pl_key);
		XGpioPs_WritePin(&Gpio, MIO_LED0, ps_key);

	}
	return 0 ;
}

四、下载验证

五、总结

六、拓展训练

约束管脚

set_property -dict {PACKAGE_PIN J13 IOSTANDARD LVCMOS18} [get_ports GPIO_0_0_tri_io[0]]
set_property -dict {PACKAGE_PIN H13 IOSTANDARD LVCMOS18} [get_ports GPIO_0_0_tri_io[1]]

重新生成硬件信息

代码编写: 

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"


#define GPIO_DEVICE_ID		XPAR_XGPIOPS_0_DEVICE_ID

#define MIO_LED1      7//MIO7
#define MIO_LED2      8//MIO8
#define MIO_LED0      0//MIO0
#define MIO_KEY0      12//MIO12
#define EMIO_KEY0     54//EMIO54
#define EMIO_KEY1     55//EMIO54

XGpioPs Gpio;	/* The driver instance for GPIO Device. */

int main(){
	XGpioPs_Config *ConfigPtr;
	u32 ps_key;
	u32 pl_key1;
	u32 pl_key2;
	//初始化GPIO驱动配置

	//根据器件ID来查找器件配置信息
	ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
	//对GPIO的驱动进行初始化
	XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);

	//设置引脚方向
	XGpioPs_SetDirectionPin(&Gpio, MIO_LED1, 1);
	XGpioPs_SetDirectionPin(&Gpio, MIO_LED2, 1);
	XGpioPs_SetDirectionPin(&Gpio, MIO_LED0, 1);
	//设置PS_KEY
	XGpioPs_SetDirectionPin(&Gpio, MIO_KEY0, 0);
	//设置PL_KEY
	XGpioPs_SetDirectionPin(&Gpio, EMIO_KEY0, 0);
	XGpioPs_SetDirectionPin(&Gpio, EMIO_KEY1, 0);

	//设置输出使能   0:输入    1:输出
	XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED1, 1);
	XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED2, 1);
	XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED0, 1);
	printf("GPIO MIO TEXT!\n");
	while(1){
		ps_key = XGpioPs_ReadPin(&Gpio,MIO_KEY0);
		pl_key1 = XGpioPs_ReadPin(&Gpio,EMIO_KEY0);
		pl_key2 = XGpioPs_ReadPin(&Gpio,EMIO_KEY1);

		XGpioPs_WritePin(&Gpio, MIO_LED1, ps_key);
		XGpioPs_WritePin(&Gpio, MIO_LED2, pl_key1);
		XGpioPs_WritePin(&Gpio, MIO_LED0, pl_key2);
	}
	return 0 ;
}

编译执行:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Security学习

系列文章目录 第一章 基础知识、数据类型学习 第二章 万年历项目 第三章 代码逻辑训练习题 第四章 方法、数组学习 第五章 图书管理系统项目 第六章 面向对象编程&#xff1a;封装、继承、多态学习 第七章 封装继承多态习题 第八章 常用类、包装类、异常处理机制学习 第九章 集…

吸烟行为检测、重点区域吸烟检测、吸烟检测算法样本标注

吸烟检测算法主要用于公共场所、工作场所和家庭环境中的吸烟行为监控&#xff0c;通过图像识别技术来检测和识别吸烟行为&#xff0c;以确保环境卫生和公共安全。这种技术可以帮助管理者实时监控吸烟行为&#xff0c;及时采取措施&#xff0c;减少二手烟的危害。 一、技术实现…

短视频矩阵源码/短视频矩阵系统搭建/源码开发知识分享

集星云推智剪获客系统&#xff0c;通过自主研发的高效发布模式&#xff0c;为企业提供稳定的接口与自动化操作&#xff0c;助力企业实现短视频矩阵的构建。该系统整合了十大核心功能&#xff0c;包括AI辅助文案撰写、视频剪辑、智能去重、内容拆分、文字转语音、文本提取、批量…

2024源代码加密软件TOP10分享|企业源代码加密软件

在现代企业的数字化转型过程中&#xff0c;源代码作为企业核心知识产权之一&#xff0c;至关重要。为了防止数据泄漏、外部攻击以及内部违规操作&#xff0c;企业越来越关注源代码的加密和保护。本文将为大家介绍2024年最受欢迎的十大源代码加密软件&#xff0c;帮助企业更好地…

【信息论基础第三讲】再谈离散信源的信息测度之熵的性质多符号信源的信息测度

一、Piece Of Cake 1、离散信源X的熵是H(X)是一个常数而不是一个变量 解释&#xff1a;离散信源的熵也就是自信息I(X)的数学期望&#xff0c;即H(X) E[I(Xi)]&#xff0c;而通过概率论的知识我们知道数学期望是一个常数&#xff0c;故熵也是一个常数。 2、八元编码系统&…

音频3A——初步了解音频3A

文章目录 前言一、3A使用的场景和原理1.AEC2.AGC3.ANS/ANR4.硬件3A和软件3A的区别1&#xff09;层级不同2&#xff09;处理顺序不同3&#xff09;优缺点 5.处理过程 二、3A带来的问题三、开源3A算法总结 前言 在日常的音视频通话过程中&#xff0c;说话的双端往往会面对比较复…

【后端开发】JavaEE初阶—线程安全问题与加锁原理(超详解)

前言&#xff1a; &#x1f308;上期博客&#xff1a;【后端开发】JavaEE初阶—Theard类及常见方法—线程的操作&#xff08;超详解&#xff09;-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f308;小编会在后端开发的学习中不…

综合体第三题(DHCP报文分析)

DHCP&#xff08;一般情况下&#xff09; 某公司网络DHCP服务器地址为192.168.0.2&#xff0c;可分配IP地址为192.168.0.6-192.168.0.254&#xff0c;缺省网关的地址为192.168.0.1&#xff0c;DNS服务器地址为192.168.0.2。网络中某客户机从服务器获取IP地址后&#xff0c;在客…

初识爬虫8

1.selenium的作用和工作原理 2. 使用selenium&#xff0c;完成web浏览器调用 # -*- coding: utf-8 -*- # 自动化测试工具&#xff0c;降低难度&#xff0c;性能也降低 from selenium import webdriverdriver webdriver.Edge()driver.get("https://www.itcast.cn/")…

Python语言基础教程(上)4.0

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

新规2027年生效 美国禁止中国智能网联汽车软硬件

当地时间9月23日&#xff0c;美国商务部工业和安全局&#xff08;BIS&#xff09;发布了一项拟议规则制定通知&#xff08;NPRM&#xff09;&#xff0c;该通知将禁止销售或进口集成特定硬件和软件的联网车辆&#xff0c;或单独销售这些组件&#xff0c;这些硬件和软件与中国或…

增强网络威胁防御能力的云安全新兴技术

一些行业专家强调了基于云的运营的独特网络安全需求&#xff0c;并指出保护敏感数据与传统的本地网络不同。尽管新兴技术并没有改变网络安全专业人员与犯罪分子之间持续的斗争&#xff0c;但它们提高了赌注&#xff0c;使斗争变得更加复杂。 如今&#xff0c;我们面对的是技术…

CSS | 如何来避免 FOUC(无样式内容闪烁)现象的发生?

一、什么是 FOUC(无样式内容闪烁)? ‌FOUC&#xff08;Flash of Unstyled Content&#xff09;是指网页在加载过程中&#xff0c;由于CSS样式加载延迟或加载顺序不当&#xff0c;导致页面出现闪烁或呈现出未样式化的内容的现象。‌ 这种现象通常发生在HTML文档已经加载&…

为什么数据需要 QA 流程

当有人问我做什么工作时&#xff0c;我会说我是一名数据质量保证 (QA) 工程师。他们并不真正理解我的意思。“嗯&#xff0c;我做数据测试&#xff0c;”我试图解释&#xff0c;但常常无济于事。我有一些从事技术和软件开发的朋友&#xff0c;他们不太了解数据测试是什么&#…

[LLM 学习笔记] Transformer 基础

Transformer 基础 Transformer 模型架构 主要组成: Encoder, Decoder, Generator. Encoder (编码器) 由 N N N 层结构相同(参数不同)的 EncoderLayer 网络组成. In : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{In}: [batch\_sz, seq\_len, d_{model}] I…

【WorldView系列卫星】

WorldView系列卫星 WorldView系列卫星是美国DigitalGlobe公司推出的一系列先进商业遥感卫星&#xff0c;旨在提供高分辨率的地球成像服务。该系列卫星以其卓越的成像能力&#xff0c;如高分辨率、快速重访时间和宽幅扫描能力&#xff0c;引领了地球观测技术的新标准。以下是对…

LCD1602

LCD1602 是一种工业字符型液晶显示屏&#xff0c;能够同时显示 16x2 即 32 个字符。 LCD的显示控制 通过向 LCD1602 发送指令和数据来控制其显示内容。指令包括清屏、设置光标位置、显示模式等&#xff1b;数据则是要显示的字符的 ASCII 码。LCD1602 内部有一个控制器&#x…

el-form动态标题和输入值,并且最后一个输入框不校验

需求&#xff1a;给了固定的label&#xff0c;叫xx单位&#xff0c;要输入单位的信息&#xff0c;但是属性名称都一样的&#xff0c;UI画图也是表单的形式&#xff0c;所以改为动态添加的形式&#xff0c;实现方式也很简单&#xff0c;循环就完事了&#xff0c;连着表单校验也动…

ChatGLM-6B:部署指南与实战应用全解析

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 SD3ComfyUI文生图部署步骤DAMODEL-ChatGLM-6B 服务端部署1.1、实例创建1.2、模型准备1.3、模型启动 SD3ComfyUI文生图部署步骤 Chat…

centos系统配置本地镜像源

今天在安装docker相关的依赖包时&#xff0c;在centos系统上&#xff0c;发现很多原本的镜像地址&#xff0c;拉取rpm依赖包失败&#xff0c;因为我的centos系统&#xff0c;安装的时候使用的是最小化安装&#xff0c;很多rpm包没有安装好&#xff0c;所以在后续安装一些常规命…