Zynq7020 SDK 初学篇(4)- PL 端 GPIO

news2024/11/14 16:40:16

1.开发背景

       基于 PS 端 GPIO 的基础上,如何调用 PL 端 GPIO 的输入输出

2.开发需求

        PL 端按键控制 PL 端 LED

3.开发环境

        Zynq7020 + Vivado2017.4

4.实现步骤

4.1 设计配置

        这里设置 PIO 数量 3 个

        由于 PL 端不像 PS 端一样绑定 GPIO,所以需要对上面的 3 个 GPIO 绑定引脚 RTL IO 

4.2 代码编辑

        事实上通过 EMIO 复用和 MIO 使用方法一样,唯一需要注意的是 GPIO 的映射关系,所以GPIO从54 - 56

#define XGPIOPS_DEVICE_MAX_PIN_NUM_ZYNQMP	(u32)174 /**< Max pins in the
						  *	Zynq Ultrascale+ MP GPIO device
					      * 0 - 25,  Bank 0
					      * 26 - 51, Bank 1
					      *	52 - 77, Bank 2
					      *	78 - 109, Bank 3
					      *	110 - 141, Bank 4
					      *	142 - 173, Bank 5
					      */
#define XGPIOPS_DEVICE_MAX_PIN_NUM	(u32)118 /**< Max pins in the Zynq GPIO device
					      * 0 - 31,  Bank 0
					      * 32 - 53, Bank 1
					      *	54 - 85, Bank 2
					      *	86 - 117, Bank 3
					      */
#include <xil_printf.h>        	// 包含 xil_printf()函数

#include "xparameters.h"     	// 器件参数信息 系统生成
#include "xstatus.h"         	// 包含 库的故障码 的宏定义
#include "xgpiops.h"        	// 包含 PS、PL GPIO 的函数声明
#include "xplatform_info.h"    	// 获取当前的平台信息
#include "sleep.h"            	// 睡眠延时接口
#include "xtime_l.h"

/* 重新定义 */
#define printf     xil_printf

/* gpio 设备,不知为何为 0 */
#define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID    // 0

/* GPIO 映射 */
#define BOARD_LED0    	(7)
#define BOARD_KEY0    	(12)
#define CORE_LED    	(0)
#define EMIO_LED0 		(54)
#define EMIO_LED1 		(55)
#define EMIO_KEY0 		(56)

static XGpioPs s_psGpio = {0};

/* 毫秒延时 */
void msleep(int ms)
{
    /* 64 bit 记录时间 */
    XTime tEnd;
    XTime tCur;

    /* 获取当前时间 */
    XTime_GetTime(&tCur);

    /* 计算理论结束时间 */
    tEnd  = tCur + ((((XTime) ms) * COUNTS_PER_SECOND) / 1000);

    /* 阻塞一直查询当前时间是否超时,一直占用 CPU */
    do
    {
        XTime_GetTime(&tCur);
    }while (tCur < tEnd);
}

/* main 入口 */
int main()
{
	printf("%s XGetPlatform_Info = %d\r\n", __func__, XGetPlatform_Info());

	/* 通过设备 ID 找到对应的配置指针 */
	XGpioPs_Config *ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);

	/* 通过配置指针初始化GPIO */
	int Status = XGpioPs_CfgInitialize(&s_psGpio, ConfigPtr,
					ConfigPtr->BaseAddr);
	if (Status != XST_SUCCESS)
	{
		return XST_FAILURE;
	}

	/* 设置  GPIO 方向输出,这里为什么会共用一个 GPIO 结构体?参数一致?  */
	XGpioPs_SetDirectionPin(&s_psGpio, BOARD_LED0, 1);
	XGpioPs_SetDirectionPin(&s_psGpio, CORE_LED, 1);
	XGpioPs_SetDirectionPin(&s_psGpio, EMIO_LED0, 1);
	XGpioPs_SetDirectionPin(&s_psGpio, EMIO_LED1, 1);

	XGpioPs_SetDirectionPin(&s_psGpio, BOARD_KEY0, 0);
	XGpioPs_SetDirectionPin(&s_psGpio, EMIO_KEY0, 0);

	/* 使能 GPIO */
	XGpioPs_SetOutputEnablePin(&s_psGpio, BOARD_LED0, 1);
	XGpioPs_SetOutputEnablePin(&s_psGpio, CORE_LED, 1);
	XGpioPs_SetOutputEnablePin(&s_psGpio, EMIO_LED0, 1);
	XGpioPs_SetOutputEnablePin(&s_psGpio, EMIO_LED1, 1);

	/* 点灯 1s改变一次电平 */
	for (int i = 0; i < 3; i++)
	{
		 XGpioPs_WritePin(&s_psGpio, BOARD_LED0, 0);
		 msleep(500);

		 XGpioPs_WritePin(&s_psGpio, BOARD_LED0, 1);
		 msleep(500);
	}

	/* 点灯 0.2s改变一次电平 */
	for (int i = 0; i < 3; i++)
	{
		 XGpioPs_WritePin(&s_psGpio, CORE_LED, 0);
		 XGpioPs_WritePin(&s_psGpio, EMIO_LED1, 0);
		 msleep(200);

		 XGpioPs_WritePin(&s_psGpio, CORE_LED, 1);
		 XGpioPs_WritePin(&s_psGpio, EMIO_LED1, 1);
		 msleep(200);
	}

	/* 定时读取电平控制对应灯的亮灭 */
	unsigned int status = 0;
	while (1)
	{
		msleep(10);
		status = XGpioPs_ReadPin(&s_psGpio, BOARD_KEY0);
		XGpioPs_WritePin(&s_psGpio, BOARD_LED0, status);

		status = XGpioPs_ReadPin(&s_psGpio, EMIO_KEY0);
		XGpioPs_WritePin(&s_psGpio, EMIO_LED0, status);
	}

	return 0;
}

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

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

相关文章

内容营销服务,照亮您的独特优势,助力业务增长

内容营销公司通常会承诺过高但交付不足&#xff0c;而在Digital Commerce Partners&#xff0c;我们走的是相反的方向。我们会调低&#xff08;然后超越&#xff09;预期。 由于我们是Copyblogger的SEO和内容营销代理商&#xff0c;我们知道伟大的事情需要时间——这意味着吸引…

【最新华为OD机试E卷-支持在线评测】通过软盘拷贝文件(200分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试E卷,全、新、准,题目覆盖率达 95% 以上,支持…

人工智能安全治理框架导图

资源链接&#xff1a;《人工智能安全治理框架》1.0版发布_中央网络安全和信息化委员会办公室

【Python机器学习】循环神经网络(RNN)——循环网络的记忆功能

文档中的词很少是完全独立的&#xff0c;它们的出现会影响文档中的其他词或者收到文档中其他词的影响&#xff1a; The stolen car sped into the arena. The clown car sped into the arena. 这两句话可能会产生两种完全不同的情感感受。这两个句子的形容词、名词、动词、介词…

算法入门-深度优先搜索2

第六部分&#xff1a;深度优先搜索 104.二叉树的最大深度&#xff08;简单&#xff09; 题目&#xff1a;给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;ro…

Tomcat配置及Servlet相关

目录 Eclipse配置Tomcat 1.配置服务器运行环境 2.新建服务器 3.新建动态Web项目 4.创建类继承HttpServlet 5.启动服务器 6.测试访问 请求转发与重定向 请求转发 重定向 Servlet的作用域 Servlet生命周期 这里以Eclipse为例&#xff0c;IDEA配置参考&#xff1a;IDE…

若依框架使用MyBatis-Plus中的baseMapper的方法报错Invalid bound statement (not found):

Invalid bound statement (not found): com.ruoyi.system.mapper.hc.HcOrderMapper.selectList 解决方法 MybatisSqlSessionFactoryBean sessionFactory new MybatisSqlSessionFactoryBean(); 使用 MybatisSqlSessionFactoryBean 而非 SqlSessionFactoryBean 的原因 MyBatis-…

卷轴模式系统源码开发之功能技术分析

随着互联网经济的蓬勃发展&#xff0c;电商平台之间的竞争日益激烈。为了吸引和保留用户&#xff0c;许多电商平台开始探索和采用创新的商业模式。其中&#xff0c;“卷轴模式”作为一种结合了积分奖励和任务兑换机制的新颖模式&#xff0c;逐渐受到了业界的关注。本文将从技术…

智能提醒助理系列-小程序分享到朋友圈

本系列文章记录“智能提醒助理”wx公众号 建设历程&#xff0c;记录实践经验、巩固知识点、锻炼总结能力。 本篇介绍微信小程序如何分享到朋友圈&#xff0c;以及遇到的登录无权限问题和解决方案。 一、需求出发点 智能提醒小程序的推广是一个难点&#xff0c;朋友圈是一个必要…

柯桥外语学习生活日语之与台风有关的日语表达

与台风有关的日语表达&#xff1a; 台風が近づいている (たいふうがちかづいている) - 台风正在靠近 台風が上陸する (たいふうがじょうりくする) - 台风登陆 台風の進路 (たいふうのしんろ) - 台风的路径 強い台風 (つよいたいふう) - 强烈的台风 台風の目 (たいふうのめ…

深度学习的模型知识点介绍和总结

关注公众号&#xff1a;『AI学习星球』 算法学习、4对1辅导、论文辅导或核心期刊可以通过公众号滴滴我 文章目录 1. 神经网络基础1.1 人工神经网络&#xff08;ANN&#xff09;1.2 介绍下激活函数 2. 卷积神经网络&#xff08;CNN&#xff09;2.1 卷积层2.2 池化层2.3 全连接层…

GoogleTest安装以及使用

文章目录 介绍Ubuntu安装centos7 安装gtest使用方法包含gtest/gtest.h头文件使用TEST()宏定义测试用例使用Google Test断言进行值检查使用RUN_ALL_TESTS()宏运行测试 测试代码 介绍 Google Test&#xff08;也称为gtest&#xff09;是Google开发的一个用于C的单元测试库。 它允…

OPenCV结构分析与形状描述符(5)查找图像中的连通组件的函数connectedComponents()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 connectedComponents 函数计算布尔图像的连通组件标签图像。 该函数接受一个具有4或8连通性的二值图像&#xff0c;并返回 N&#xff0c;即标签…

算法入门-深度优先搜索3

第六部分&#xff1a;深度优先搜索 112.路径总和&#xff08;简单&#xff09; 题目&#xff1a;给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果…

【QT Creator】基本使用

一、常见问题 解答可见以下链接&#xff1a; https://www.cnblogs.com/xia-weiwen/p/10074882.html#title3.1 ** 有关控制台选择构建套件缺失的解决方法可见以下链接 https://blog.csdn.net/xuxu_123_/article/details/131257928 二、如何创建第一个QT项目 第一步&#xf…

一文解答Swin Transformer + 代码【详解】

文章目录 1、Swin Transformer的介绍1.1 Swin Transformer解决图像问题的挑战1.2 Swin Transformer解决图像问题的方法 2、Swin Transformer的具体过程2.1 Patch Partition 和 Linear Embedding2.2 W-MSA、SW-MSA2.3 Swin Transformer代码解析2.3.1 代码解释 2.4 W-MSA和SW-MSA…

Elasticsearch入门安装

1、下载安装 &#xff08;1&#xff09;安装Elasticsearch 下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch 解压后运行 /bin/elasticsearch.bat 运行后访问 http://127.0.0.1:9200/即可 ps1&#xff1a;若无法访问且控制台打印 received plaintex…

计算机基础之-TCP 别再问我啦

TCP 协议 格式及部分含义根据端口号找到上一层的进程如何解包-整个包长度 ACK应答机制序号-确认序号-实现TCP的可靠传输和流量控制:为什么要有两个字段(序号和确认序号)&#xff1f; 16位窗口大小-缓冲区流量控制16位紧急指针三次握手四次挥手为啥 TIME_WAIT 滑动窗口 协议 格式…

代码随想录冲冲冲 Day40 动态规划Part8

121. 买卖股票的最佳时机 dp[i][0] 代表第i天持有股票手上的金额 dp[i][1] 代表第i天不持有股票手上的金额 初始化&#xff1a; dp[0][0] 持有所以是-prices[0] dp[0][1] 不持有所以是0&#xff1b; 递推公式: dp[i][0] 既然是i天时持有&#xff0c;那么就是之前就持有&…

开放式耳机具备什么特点?2024排行前十的四款百元蓝牙耳机推荐

开放式耳机具有以下特点&#xff1a; 佩戴舒适&#xff1a; 开放式耳机通常不需要插入耳道&#xff0c;能减少对耳道的压迫和摩擦&#xff0c;长时间佩戴也不易产生闷热、疼痛或瘙痒等不适&#xff0c;对于耳道敏感或不喜欢入耳式耳机压迫感的人来说是很好的选择。 这类耳机…