GPIO与MIO控制LED——ZYNQ学习笔记2

news2024/11/16 20:56:05

一、GPIO简介

        ZYNQ 分为 PS 和 PL 两部分,那么器件的引脚( Pin)资源同样也分成了两部分。 ZYNQ PS 中的外设可以通过 MIO( multiplexed I/O,多路复用 I/O)模块连接到 PS 端的引脚上,也可以通过 EMIO( extended multiplexed I/O interface, 扩展多路 I/O 接口) 连接到 PL 端的引脚。 Zynq-7000 系列芯片一般有 54 个 MIO,个别芯片如 7z007s 只有 32 个。        

        GPIO 是英文“general purpose I/O”的缩写,即通用的输入/输出。它是 ZYNQ PS 中的一个外设,用于观测和控制器件引脚的状态。 图 3.1.1 是 GPIO 的框图,从中我们可以看到 GPIO 分为 4 个 Bank,其中 Bank0和 Bank1 连接到 MIO;而 Bank2 和 Bank3 连接到 EMIO。

MIO是什么:多路复用IO,为ZYNQ PS端的与一个IO外设,用于观测(Input)和控制(Output)器件的引脚状态。

bank502、500、501为PS端,bank34、34、35、13(7010无bank13)为PL端

bank502专用于连接DDR3、bank500、501为MIO接口(实际用户IO有54个)

EMIO是什么:扩展的IO 连接PL端引脚

1、当PS端引脚不够用时,可以使用EMIO来进行扩展,从而使用PL端IO;

2、当某个设配硬件已经连接到PL端,但是通过Verilog代码实现较复杂的时候,可以使用EMIO让PS来驱动

二、GPIO分组

        除 Bank1 之外的 Bank 都具有 32bit, Bank1 只具有 22bit 是因为总共只有 54 个 MIO,其中 32bit 的 Bank0控制了 MIO[0~31],剩下的 MIO[31~53]就由 22bit 的 Bank1 控制。 Bank2 和 Bank3 用于控制扩展的 MIO 即EMIO,也就是说总共可以有 32+32=64 个 EMIO。

DATA_RO 是数据只读寄存器,通过该寄存器能够观察器件引脚上的值。如果 GPIO 信号配置为输出,则通常会反映输出上驱动的值,写入此寄存器将被忽略。

DATA 是数据寄存器,该寄存器控制 GPIO 信号配置为输出时要输出的值。该寄存器的所有 32 位都是一次写入的。读取该寄存器返回写入 DATA 或 MASK_DATA_ {LSW, MSW}的先前值,它不会返回器件引脚上的当前值。

MASK_DATA_LSW 和 MASK_DATA_MSW 是数据掩码寄存器,该寄存器使软件能够有选择地一次更改所需的输出值。可以写入最多 16 位的任意组合, MASK_DATA_LSW 控制 Bank 的低 16 位, MASK_DATA_MSW 控制高 16 位。未写入的那些位保持不变并保持其先前的值。读取该寄存器返回写入DATA 或 MASK_DATA_ {LSW, MSW}的先前值;它不会返回器件引脚上的当前值。该寄存器避免了对未更改位的读-修改-写序列的需要。

DIRM 是方向模式寄存器,用于控制 I/O 引脚是用作输入还是输出。当 DIRM [x] == 0 时,输出驱动器被禁用,该引脚作为输入引脚使用。

OEN 是输出使能寄存器。将 I/O 配置为输出时,该寄存器控制是否启用输出。禁用输出时,引脚为 3态。当 OEN [x] == 0 时,输出被禁用。

 

 三、试验任务

        本章的实验任务是使用 GPIO 通过两个 MIO 引脚控制 PS 端两个 LED 的亮灭,实现底板上 PS_LED0、PS_LED1 两个 LED 灯同亮同灭的效果。

四、程序设计

1、系统框图:

2、整体设计思路: 

 3、UG585手册阅读

 按照手册提供步骤:重置、时钟步骤在建立工程初期已经完成

配置引脚:查看硬件设计:

LED挂载在MIO0、7、8引脚上,因此我们要配置这些引脚,

首先写配置方向模式寄存器,通过计算0000_0001_1000_0001 -- > 0x00000181

其次写配置输出寄存器,通过计算000_0001_1000_0001 -- > 0x00000181

最后写数据到引脚,使用带屏蔽的方式写入

        mask数据为:1111_1110_0111_1110  --> 0xfe7e

        data数据为:0000_0001_1000_0001  --> 0x0181   

        因此写入数据为:  0xfe7e0181

4、查阅寄存器地址

根据配置过程,我们要依次查阅GPIO基地址、GPIO方向控制偏移、GPIO输出使能偏移、GPIO写数据低16位偏移

#define GPIOPS_BASE_ADDRESS   	0xE000A000	//GPIO基地址
#define XGPIOPS_DIRM_OFFSET   	0X00000204	//GPIO方向控制偏移
#define XGPIOPS_OUTEN_OFFSET  	0X00000208	//GPIO输出使能偏移
#define XGPIOPS_DATA_LSW_OFFSET 0X00000000	//GPIO写数据低16位偏移
#define XGPIOPS_DATA_MSW_OFFSET 0x00000004	//GPIO写数据高16位偏移

  5、寄存器版本编写代码

#include <stdio.h>
#include "xil_io.h"
#include "sleep.h"

#define GPIOPS_BASE_ADDRESS   	0xE000A000	//GPIO基地址
#define XGPIOPS_DIRM_OFFSET   	0X00000204	//GPIO方向控制偏移
#define XGPIOPS_OUTEN_OFFSET  	0X00000208	//GPIO输出使能偏移
#define XGPIOPS_DATA_LSW_OFFSET 0X00000000	//GPIO写数据低16位偏移
#define XGPIOPS_DATA_MSW_OFFSET 0x00000004	//GPIO写数据高16位偏移

int main(){
	printf("GPIO MIO TEXT!\n");

	//对GPIO引脚进行配置(MIO7、8、0)
	//配置方向模式寄存器
	Xil_Out32( GPIOPS_BASE_ADDRESS + XGPIOPS_DIRM_OFFSET ,0x00000181);
	//配置输出使能寄存器
	Xil_Out32( GPIOPS_BASE_ADDRESS + XGPIOPS_OUTEN_OFFSET ,0x00000181);

	while(1){
	sleep(1);
	//写数据到GPIO引脚  点亮LED
	Xil_Out32( GPIOPS_BASE_ADDRESS + XGPIOPS_DATA_LSW_OFFSET ,0xfe7e0181);

	sleep(1);
	//写数据到GPIO引脚  熄灭LED
	Xil_Out32( GPIOPS_BASE_ADDRESS + XGPIOPS_DATA_LSW_OFFSET ,0xfe7e0000);

	}
	return 0;
}

6、库函数开发

 导入平台工程

五、下载验证

#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

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

int main(){
	XGpioPs_Config *ConfigPtr;

	//初始化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);
	//设置输出使能   0:输入    1:输出
	XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED1, 1);
	XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED2, 1);
	XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED0, 1);
	while(1){
	//往GPIO写高电平      点亮LED1
	XGpioPs_WritePin(&Gpio, MIO_LED1, 0x1);
	XGpioPs_WritePin(&Gpio, MIO_LED2, 0x1);
	XGpioPs_WritePin(&Gpio, MIO_LED0, 0x1);
	sleep(1);
	//往GPIO写低电平      熄灭LED1
	XGpioPs_WritePin(&Gpio, MIO_LED1, 0x0);
	XGpioPs_WritePin(&Gpio, MIO_LED2, 0x0);
	XGpioPs_WritePin(&Gpio, MIO_LED0, 0x0);
	sleep(1);
	}
	printf("GPIO MIO TEXT!\n");
	return 0 ;
}

六、总结

 

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

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

相关文章

HTML讲解(三)通用部分

目录 1.空格标记 2.特殊文字的标记 3.注释语句 4.对文字字体的设置 5.修改文字形态 6.换行标记 7.居中标记 8.水平线标记 9.设置滚动弹幕 1.空格标记 在HTML中&#xff0c;我们想打印空格并不能直接敲一个空格键&#xff0c;因为如果是敲空格键&#xff0c;那无论你敲…

【JUC并发编程系列】深入理解Java并发机制:Volatile从底层原理解析到高级应用技巧(六、Volatile关键字、JMM、重排序、双重检验锁)

文章目录 【JUC并发编程系列】深入理解Java并发机制&#xff1a;Volatile从底层原理解析到高级应用技巧(六、Volatile关键字、JMM、重排序、双重检验锁)1. Volatile的特性2. Volatile的用法3. CPU多核硬件架构剖析4. JMM内存模型4.1 主要特性4.2 JMM 的工作原理4.3 实现机制 5.…

Leetcode面试经典150题-39.组合总数进阶:40.组合总和II

本题是扩展题&#xff0c;真实考过&#xff0c;看这个题之前先看一下39题 Leetcode面试经典150题-39.组合总数-CSDN博客 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数…

Docker:解决开发运维问题的开源容器化平台

云计算de小白 Docker是一个开源的容器化平台&#xff0c;可以将应用程序及其依赖的环境打包成轻量级、可移植的容器。 Docker为什么这么受欢迎呢?原因很简单&#xff1a;Docker可以解决不同环境一致运行的问题&#xff0c;而且占用资源少&#xff0c;速度快。 所以好的东西…

链式队列操作

文章目录 &#x1f34a;自我介绍&#x1f34a;概述&#x1f34a;链式队列代码linkstack.clinkstack.hmain.c 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&…

OmniPeek 空口抓包软件安装指导

OmniPeek 空口抓包软件安装指导 1 双击omnp75安装包---Unzip解压缩 生成install包 2 进入install文件夹点击setup开始进入安装界面 3 点击install Omnipeek 4 点击next,勾选手动安装

云原生虚拟化kubevirt安装

kubevirt 介绍 Kubevirt 是 Redhat 开源的一套以容器方式运行虚拟机的项目&#xff0c;通过 kubernetes 云原生方式来管理虚拟机生命周期。它通过使用自定义资源&#xff08;CRD&#xff09;和其它 Kubernetes 功能来无缝扩展现有的集群&#xff0c;以提供一组可用于管理虚拟机…

9.23作业

仿照string类&#xff0c;自己手动实现 My_string 代码如下 MyString.h #ifndef MYSTRING_H #define MYSTRING_H #include <iostream> #include <cstring>using namespace std;class My_string { private:char *ptr; //指向字符数组的指针int size; …

socket.io-client实现实前后端时通信功能

这里我使用的后端 基于node.js的koa框架 前端使用的是vite {"name": "hou","version": "1.0.0","description": "","main": "app.js","scripts": {"test": "echo …

Pointnet++改进59:全网首发MogaBlock(2024最新模块)|用于在纯基于卷积神经网络的模型中进行判别视觉表示学习,具有良好的复杂性和性能权衡

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入MogaBlock,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.…

GreenPlum与PostgreSQL数据库

*** Greenplum*** 是一款开源数据仓库。基于开源的PostgreSQL改造&#xff0c;主要用来处理大规模数据分析任务&#xff0c;相比Hadoop&#xff0c;Greenplum更适合做大数据的存储、计算和分析引擎 它本质上是多个PostgreSQL面向磁盘的数据库实例一起工作形成的一个紧密结合的数…

微软宣布弃用面向企业的WSUS更新服务 仍然保留该服务但不再添加任何新功能

Windows Server Update Services 是微软面向企业推出的一项更新服务&#xff0c;该服务已经存在很多年&#xff0c;允许 IT 管理员控制内网设备的更新节奏。今年早些时候微软宣布将在 2025 年 4 月 18 日开始弃用 WSUS 驱动程序同步功能&#xff0c;因为大约只有 1/3 的 IT 管理…

生成PPT时支持上传本地的PPT模板了!

制作 PPT 时想要使用特定的 PPT 模板&#xff1f; 现在&#xff0c;歌者 PPT 的「自定义模板功能」已全面升级&#xff01;你可以轻松上传自己的本地 PPT 模板&#xff0c;无论是公司统一风格的模板&#xff0c;还是带有个人设计风格的模板&#xff0c;都能无缝导入歌者 PPT。…

单链表:学生信息管理系统

一、头文件 #ifndef __LINK_H__ #define __LINK_H__ #include <myhead.h> #define MAX 30 // 建立学生结构体 typedef struct student {int id; //学号char name[20]; //姓名float score; //分数 }stu;typedef struct node {union{int len;stu data;};struct node * nex…

玄机--哥斯拉流量

1、黑客的ip 过滤http&#xff0c;观察哪个ip一直在发送请求包 2、什么漏洞 因为是哥斯拉&#xff0c;那么黑客在连接成功之前一定上传这个木马文件到服务端 hello.jsp是木马文件&#xff0c;过滤http contains “hello.jsp” 最早是PUT这个方法 3、文件名 hello.jsp 保存…

让AI激发创作力:OpenAI分享5位专业作家利用ChatGPT写作的案例技巧

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

GPU硬件如何实现光栅化?

版权声明 本文为“优梦创客”原创文章&#xff0c;您可以自由转载&#xff0c;但必须加入完整的版权声明文章内容不得删减、修改、演绎本文视频版本&#xff1a;见文末 引言 大家好&#xff0c;我是老雷&#xff0c;今天我想从GPU硬件原理出发&#xff0c;给大家分享在图形渲…

JS防抖和节流函数

节流和防抖函数的定义 防抖&#xff1a;只有在最后一次事件发生后的一定时间间隔内没有新的事件触发时&#xff0c;才执行相应的处理函数。节流&#xff1a;在规定的时间间隔内最多只能执行一次相应的处理函数。 效果图 示例图 示例图运行结果如下&#xff1a; 代码 &l…

远程升级,你成功了吗?

最近又遇到了远程升级失败的情况&#xff0c;而且是不明原因的多次接连失败。。。 事情是这样的&#xff1a;最近有客户反馈在乡村里频繁出现掉线的情况。通过换货、换SIM卡对比排查测试&#xff0c;发现只有去年5月22号采购的那批模块在客户环境附近会出现掉线的情况&#xf…

【深度学习】03-神经网络3-1梯度下降网络优化方法

每一条线是一个权重&#xff0c;每个神经元由一个加权和还有一个 激活函数组成。每一层可以理解是一个函数&#xff0c;最终形成一个复合函数&#xff0c;因此求梯度的时候&#xff0c;是一层一层的求解&#xff0c;所以叫做反向传播。 只会考虑当前数据之前的数据&#xff0c;…