当前位置: 首页 > news >正文

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

一、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引脚  点亮LEDXil_Out32( GPIOPS_BASE_ADDRESS + XGPIOPS_DATA_LSW_OFFSET ,0xfe7e0181);sleep(1);//写数据到GPIO引脚  熄灭LEDXil_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//MIO0XGpioPs 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写高电平      点亮LED1XGpioPs_WritePin(&Gpio, MIO_LED1, 0x1);XGpioPs_WritePin(&Gpio, MIO_LED2, 0x1);XGpioPs_WritePin(&Gpio, MIO_LED0, 0x1);sleep(1);//往GPIO写低电平      熄灭LED1XGpioPs_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 ;
}

六、总结

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 计算机视觉方面的一些模块
  • 可靠传输是什么?是基于UDP实现的吗
  • 根据[国家统计局最新行政区规划]数据库代码
  • 【Redis】Redis 缓存设计:抗住百万并发量的最佳实践
  • oracle 11g写一个判断是否是身份证的函数,函数名称为:FUN_IS_IDENNO
  • C++二叉搜索树学习
  • MySQL篇(存储引擎)(持续更新迭代)
  • HTTP请求与响应相关知识点解读
  • Image matting入门
  • Android14请求动态申请存储权限
  • 双路创新深度学习!TCN-Transformer+LSTM多变量时间序列预测(Matlab)
  • 【学术会议:中国杭州,机器学习和计算机应用面临的新的挑战问题和研究方向】第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)
  • go 读取excel
  • 04 面部表情识别:Pytorch实现表情识别-表情数据集训练代码
  • 数据结构 - 树与二叉树
  • 【EOS】Cleos基础
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • gops —— Go 程序诊断分析工具
  • leetcode386. Lexicographical Numbers
  • MobX
  • Mysql数据库的条件查询语句
  • mysql外键的使用
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Node + FFmpeg 实现Canvas动画导出视频
  • PAT A1050
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 翻译--Thinking in React
  • 基于webpack 的 vue 多页架构
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 悄悄地说一个bug
  • 优化 Vue 项目编译文件大小
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • #NOIP 2014# day.1 T2 联合权值
  • #QT(QCharts绘制曲线)
  • (02)vite环境变量配置
  • (2)STM32单片机上位机
  • (35)远程识别(又称无人机识别)(二)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (PySpark)RDD实验实战——取一个数组的中间值
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (源码分析)springsecurity认证授权
  • (转) ns2/nam与nam实现相关的文件
  • (转)IOS中获取各种文件的目录路径的方法
  • (自用)交互协议设计——protobuf序列化
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .gitignore文件使用
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core WebAPI中封装Swagger配置
  • .net 受管制代码
  • @KafkaListener注解详解(一)| 常用参数详解