5 - ZYNQ GPIO

文章目录

  • 1 GPIO基本概念
    • 1.1 MIO-EMIO简介
    • 1.2 MIO-EMIO连接
    • 1.3 MIO-EMIO路由
    • 1.4 MIO-EMIO配置
  • 2 GPIO控制寄存器
    • 2.1 输入/输出控制寄存器
    • 2.2 中断控制寄存器
    • 2.3 中断触发设置
  • 3 GPIO在Vivado SDK中的使用

1 GPIO基本概念

在ZYNQ中,GPIO(General Purpose Input/Output,通用输入输出)接口是非常重要的一个部分,它提供了与外部设备交互的能力。

在ZYNQ中,GPIO接口主要分为MIO(Multiplexed I/O,多路复用I/O)和EMIO(Extended Multiplexed I/O,扩展多路复用I/O)两种类型,共118个引脚,分布在4个Bank(0-3)中,如下图所示:

在这里插入图片描述

1.1 MIO-EMIO简介

在ZYNQ中,MIO-EMIO所处位置及连接关系如下图所示:

在这里插入图片描述

  • MIO基本介绍

    • MIO是ZYNQ PS提供的一组引脚,主要用于连接各种标准外设,如SPI、UART、I2C、SD卡等
    • MIO引脚分布在GPIO的Bank 0和Bank 1上,共54个引脚
      • Bank 0包含32个引脚
      • Bank 1包含22个引脚
    • MIO与外设直接连接,PS可直接操作,无需PL参与
  • EMIO基本介绍

    • EMIO是ZYNQ PS提供的一组引脚,主要用于对MIO进行扩展以连接更多外设
    • EMIO引脚分布在GPIO的Bank 2和Bank 3上,共64个引脚
      • Bank 2包含32个引脚
      • Bank 3包含32个引脚
    • EMIO通过PL进行扩展
      • 可以根据需要扩展出1-64个EMIO
      • 可以根据需要将EMIO与PL的任意可用User IO相绑定
    • EMIO通过PL扩展后与外设连接,需要PL对EMIO进行引脚约束,并生成比特流文件烧写PL后,PS方可通过EMIO对外设进行操作

1.2 MIO-EMIO连接

MIO-EMIO在PS内部的连接情况如下图所示:

在这里插入图片描述

MIO-EMIO在PS内部的连接情况决定了MIO-EMIO对外可连接的外设类型和数量:

序号名称MIOEMIO数量
1Quad SPI FlashYesNo1
2SRAM/NOR FlashYesNo1
3NAND FlashYesNo1
4USBYesNo1
5GigEYesYes2
6SD SDIOYesYes2
7UARTYesYes2
8CANYesYes2
9I2CYesYes2
10SPIYesYes2
11TTCYesYes2
12SWDTYesYes1
13PJTAGYesYes1
14TPIUYesYes1
15GPIO-MIOYesNoN/A
16GPIO-EMIONoYesN/A

特别说明

  • Yes表示可与MIO或EMIO连接
  • No表示不可与MIO或EMIO连接
  • GPIO-MIO是指未与任何外设连接的MIO引脚
  • GPIO-EMIO是指未与任何外设连接的EMIO引脚

1.3 MIO-EMIO路由

MIO-EMIO与外设的路由关系如下图所示:

在这里插入图片描述

特别说明

  • 在ug585中只提到SPI连接到EMIO时最高时钟为25MHz,对于SDIO未发现相关限制(初步猜测,当把外设连接到EMIO时,最高时钟频率为25MHz)
  • Ethernet接口连接到EMIO时,只能是MII和GMII接口,需要在PL内部使用桥接电路转换为RMII、RGMII或SGMII接口,如使用Xilinx提供的Ethernet PHY MII to Reduced MII核
  • MIO-EMIO路由再次体现出有些外设可以连接到MIO和EMIO,而有些外设只能连接到MIO

1.4 MIO-EMIO配置

在ug585中,MIO与外设的配置关系如下图所示:

在这里插入图片描述

在Vivado ZYNQ7 Processing System IP中,MIO-EMIO与外设的配置关系如下图所示:

在这里插入图片描述

特别说明

  • MIO是多路复用的,即一个MIO可以被不同外设使用,但同时只能被一个外设使用
  • MIO与外设的对应关系不是任意的,是有一定的配置规则的,一种外设只能使用一些特定位置的MIO
  • MIO-EMIO配置再次体现出有些外设可以连接到MIO和EMIO,而有些外设只能连接到MIO

2 GPIO控制寄存器

GPIO的功能有三种:输入、输出和中断。MIO和EMIO在功能上几乎相同,唯一的区别是EMIO通过PL扩展后与外设连接,而MIO直接与外设连接。需要特别注意的是,MIO7和MIO8只能做输出,这在ZYNQ7000-MIO与EMIO详解中有说明。

GPIO引脚的功能是通过PS侧的寄存器来控制,寄存器为32位,控制一个GPIO Bank的32个MIO/EMIO引脚(Bank 1除外)。

在这里插入图片描述

2.1 输入/输出控制寄存器

  • DATA_RO(Data Read Only,数据只读寄存器)
    • 读取GPIO引脚上的当前值
    • 不论GPIO引脚被配置为输入还是输出,DATA_RO寄存器都能正确反映该引脚上的电平状态
  • DATA
    • 当GPIO引脚被配置为输出模式时,DATA寄存器用于设置该引脚的电平状态
    • 通过向DATA寄存器写入相应的值,可以控制GPIO引脚输出高电平或低电平,从而实现对外部设备的控制
  • MASK_DATA_LSW(MASK DATA Low Significant Word,数据掩码低16位寄存器)
    • 选择性更改:允许有选择地对GPIO的低16位引脚进行输出值的设置和屏蔽;这意味着,开发者可以精确地控制哪些引脚需要更改输出,而无需重新写入整个Bank的输出值
    • 屏蔽功能:对于那些不需要更改的位,允许它们保持其先前的值不变,这避免了不必要的读-修改-写序列,提高了系统效率和响应速度
    • 提高灵活性:通过与DATA和MASK_DATA_MSW寄存器的结合使用,开发者可以根据需要,灵活地设置和屏蔽GPIO引脚的输出值
  • MASK_DATA_MSW(MASK DATA Most Significant Word,数据掩码高16位寄存器)
    • 与MASK_DATA_LSW类似,但MASK_DATA_MSW控制的是GPIO Bank的高16位
  • DIRM(Direction Mode Register,方向模式寄存器)
    • 控制GPIO引脚的方向,即决定引脚是作为输入引脚还是输出引脚
    • 设置为1时,对应的GPIO引脚被配置为输出模式
    • 设置为0时,对应的GPIO引脚被配置为输入模式
  • OEN(Output Enable Register,输出使能寄存器)
    • 当GPIO引脚被配置为输出引脚时,OEN寄存器控制该引脚是否输出信号
    • 设置为1时,表示对应的GPIO引脚输出使能,即该引脚可以输出信号
    • 设置为0时,表示对应的GPIO引脚输出关闭,即该引脚处于三态

2.2 中断控制寄存器

  • INT_TYPE(Interrupt Type,中断类型寄存器)
    • 用于控制GPIO中断是边沿敏感还是电平敏感
  • INT_POLARITY(Interrupt Polarity,中断极性寄存器)
    • 用于控制中断是低电平有效还是高电平有效(或下降沿敏感或上升沿敏感)
  • INT_ANY(Interrupt Any,双边沿寄存器)
    • 当INT_TYPE寄存器被设置为边沿敏感时(无论是上升沿还是下降沿),用于控制中断是否对GPIO信号的上升沿和下降沿都敏感
  • INT_EN(Interrupt Enable,中断使能寄存器)
    • 启用(或取消屏蔽)GPIO引脚的中断
    • GPIO引脚引脚上的信号满足中断触发条件时,能够产生中断请求并触发相应的中断服务例程(ISR)
  • INT_DIS(Interrupt Disable,中断禁用寄存器)
    • 禁用(或屏蔽)GPIO引脚的中断
    • GPIO引脚的中断信号将被屏蔽,即使该引脚上的信号满足中断触发条件,也不会产生中断请求,从而防止中断服务例程(ISR)被不必要地触发
  • INT_MASK(Interrupt Mask,中断屏蔽寄存器)
    • 只读寄存器,用于显示GPIO引脚的中断是否被屏蔽
    • GPIO引脚的中断屏蔽状态由INT_EN和INT_DIS寄存器控制
      • INT_EN寄存器写1,启用(或取消屏蔽)GPIO引脚的中断
      • INT_DIS寄存器写1,禁用(或屏蔽)GPIO引脚的中断
  • INT_STAT(Interrupt Status,中断状态寄存器)
    • 中断状态指示:INT_STAT寄存器用于指示哪些GPIO引脚已经触发中断; GPIO引脚引脚上的信号满足中断触发条件时,能够触发中断,同时相应的中断状态位会被置位
    • 中断状态查询:通过读取INT_STAT寄存器的值,可以查询哪些GPIO引脚的中断请求已被触发,从而进行相应的中断处理
    • 中断状态清除:通常在进入中断服务例程(ISR)后,向INT_STAT寄存器相应的位写入1清除中断状态,以确保中断状态被正确清除,从而允许系统响应后续的中断事件

2.3 中断触发设置

GPIO引脚的中断触发方式是由INT_TYPE、INT_POLARITY和INT_ANY三个寄存器共同决定的,如下图所示:

在这里插入图片描述

特别说明

  • GPIO所有引脚共享一个中断,中断号是52

3 GPIO在Vivado SDK中的使用

实验内容

  • 按下PL侧按键,通过EMIO向PS发送中断
  • PS收到中断后,通过EMIO控制PL侧LED灯亮灭
/***************************** Include Files ********************************/#include "xparameters.h"
#include "xgpiops.h"
#include "xscugic.h"
#include "xil_exception.h"
#include <xil_printf.h>/************************** Constant Definitions ****************************/
#define INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID
#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID
#define GPIO_INTR_ID		XPAR_XGPIOPS_0_INTR#define EMIO_LED			54U
#define EMIO_KEY			58U#define GPIO_DIR_INPUT      0U
#define GPIO_DIR_OUTPUT     1U
#define GPIO_OUTPUT_ENABLE 	1U/**************************** Type Definitions ******************************//***************** Macros (Inline Functions) Definitions *******************//************************** Function Prototypes ****************************/int  GpioInit(XGpioPs *GpioPtr, u32 DeviceId);
int  GpioIntrSetup(XScuGic *IntcPtr, u32 DeviceId, XGpioPs *GpioPtr, u32 IntrID);
void GpioIntrHandler(void *CallbackRef);
void GpioOutputExample(XGpioPs *GpioPtr);/************************** Variable Definitions **************************/XGpioPs Gpio;
XScuGic Intc;int KeyFlag;
int KeyValue;/*****************************************************************************/int main()
{//int Status;//Status = GpioInit(&Gpio, GPIO_DEVICE_ID);if (Status != XST_SUCCESS){xil_printf("GPIO initialization failed.\r\n");return XST_FAILURE;}xil_printf("GPIO initialization success.\r\n");//Status = GpioIntrSetup(&Intc, INTC_DEVICE_ID, &Gpio, GPIO_INTR_ID);if (Status != XST_SUCCESS){xil_printf("GPIO interrupt setup failed.\r\n");return XST_FAILURE;}xil_printf("GPIO interrupt setup success.\r\n");//GpioOutputExample(&Gpio);//return 0;
}/*****************************************************************************/int GpioInit(XGpioPs *GpioPtr, u32 DeviceId)
{//XGpioPs_Config *ConfigPtr;int Status;// Initialize the Gpio driver.ConfigPtr = XGpioPs_LookupConfig(DeviceId);if (ConfigPtr == NULL){return XST_FAILURE;}Status = XGpioPs_CfgInitialize(GpioPtr, ConfigPtr, ConfigPtr->BaseAddr);if (Status != XST_SUCCESS){return XST_FAILURE;}// Run a self-test on the GPIO deviceStatus = XGpioPs_SelfTest(GpioPtr);if (Status != XST_SUCCESS){return XST_FAILURE;}// Set Pin DirectionXGpioPs_SetDirectionPin(GpioPtr, EMIO_LED, GPIO_DIR_OUTPUT);XGpioPs_SetDirectionPin(GpioPtr, EMIO_KEY, GPIO_DIR_INPUT);// Enable Pin OutputXGpioPs_SetOutputEnablePin(GpioPtr, EMIO_LED, GPIO_OUTPUT_ENABLE);// Set Pin Interrupt TypesXGpioPs_SetIntrTypePin(GpioPtr, EMIO_KEY, XGPIOPS_IRQ_TYPE_EDGE_RISING);// Enable Pin InterruptXGpioPs_IntrEnablePin(GpioPtr, EMIO_KEY);//return XST_SUCCESS;
}/*****************************************************************************/
int GpioIntrSetup(XScuGic *IntcPtr, u32 DeviceId, XGpioPs *GpioPtr, u32 IntrID)
{//int Status;XScuGic_Config *IntcConfig; /* Instance of the interrupt controller */// step1. 初始化中断控制器IntcConfig = XScuGic_LookupConfig(DeviceId);if (NULL == IntcConfig){return XST_FAILURE;}Status = XScuGic_CfgInitialize(IntcPtr, IntcConfig, IntcConfig->CpuBaseAddress);if (Status != XST_SUCCESS){return XST_FAILURE;}// step2. 初始化异常处理Xil_ExceptionInit();// step3. 注册异常处理回调函数Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, IntcPtr);// step4. 使能异常处理Xil_ExceptionEnable();// step5. 注册中断Status = XScuGic_Connect(IntcPtr, IntrID, (Xil_ExceptionHandler)GpioIntrHandler, (void *)GpioPtr);if (Status != XST_SUCCESS){return XST_FAILURE;}// step.6 使能中断XScuGic_Enable(IntcPtr, IntrID) ;//return XST_SUCCESS;
}/*****************************************************************************/
void GpioIntrHandler(void *CallbackRef)
{//XGpioPs *GpioInstancePtr = (XGpioPs *)CallbackRef;int Int_val;// Get Interrupt StatusInt_val = XGpioPs_IntrGetStatusPin(GpioInstancePtr, EMIO_KEY);// Clear Interrupt StatusXGpioPs_IntrClearPin(GpioInstancePtr, EMIO_KEY);//if (Int_val == 1){KeyFlag = 1;}//return;
}/*****************************************************************************/
void GpioOutputExample(XGpioPs *GpioPtr)
{//while(1){if (KeyFlag == 1){xil_printf("You pust the button\r\n");XGpioPs_WritePin(GpioPtr, EMIO_LED, KeyValue);KeyValue = ~ KeyValue;KeyFlag = 0;}}//return;
}

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

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

相关文章

读取obj文件中的vt并转成需要的uv数据

先展示效果图 适用场景&#xff1a;加载的obj模型需要发生形变&#xff0c;同时还要展示模型的纹理效果&#xff0c;可以使用到面料模拟或者弹性物体的模拟当中 具体实现方案&#xff1a; 1、读取obj文件中的vt的值&#xff0c;存起来 2、读取f值&#xff0c;存v索引和vt索引 3…

宿舍|基于SprinBoot+vue的宿舍管理系统(源码+数据库+文档)

宿舍管理系统 基于SprinBootvue的私人诊所管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员功能实现 学生功能实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&…

文件包含PHP伪协议利用方法

1.file://协议 使⽤&#xff1a; file:// ⽂件的绝对路径和⽂件名 2.php?cmdfile://D:\phpstudy_pro\WWW\123.txt 2.php://filter协议 ⽤途&#xff1a;常⽤于读取⽂件 / 源码 2.php?cmdphp://filter/readconvert.base64-encode/resource1.php 3.php://input协议 步骤一&…

软考报名临近尾声,接下来干什么?附最新软考报名进度表

软考2023年下半年的报名虽然仅仅过半&#xff0c;但是除了北京之外&#xff0c;其他地区均已经可以报名&#xff0c;而且为数不少的地区已经结束了报名&#xff0c;我相信绝大多数地区的考生应该已经完成了报名&#xff0c;所以从这个意义上讲&#xff0c;软考的报名的确是临近…

sql-labs41-45关通关攻略

第41关 一.查询数据库 http://127.0.0.1/Less-41/?id-1%20union%20select%201,2,database()--http://127.0.0.1/Less-41/?id-1%20union%20select%201,2,database()-- 二.查表 http://127.0.0.1/Less-41/?id-1%20union%20select%201,2,(select%20group_concat(table_name)…

HTB-sequal(mysql)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解sequal这台靶机 渗透过程 信息搜集 服务器开放了3306mysql端口思路&#xff1a;mysql爆破-sC参数会执行 相关的默认脚本 连接mysql数据库 通过空密码连接道mysql数据库flag&#xff1a;7b4bec00d1a39…

本地缓存和分布式缓存有何区别?

缓存是提高服务性能的一把利剑&#xff0c;尤其在高并发、高请求量的服务中性能提升明显。如果后端服务只靠关系型数据库提供支撑&#xff0c;系统会很快达到处理瓶颈。缓存设计无处不在&#xff0c;通常来说可以分为本地缓存与分布式缓存。本地缓存框架主要有Guava cache、Caf…

Java基础——自学习使用(反射)

一、反射的定义 反射是java基础的核心&#xff0c;反射是获取类信息的能力。类信息包括&#xff1a;方法、变量、接口、父类、构造器、类名等。 Java的反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;它允许程序在运行时检查或修改类、接口、字段以及方法…

【书生大模型实战营】MindSearch CPU-only 版部署

MindSearch CPU-only 版部署 MindSearch CPU-only 版部署任务步骤 MindSearch CPU-only 版部署 任务 将 MindSearch 部署到 HuggingFace 并美化 Gradio 的界面&#xff0c;并提供截图和 Hugging Face 的Space的链接。 步骤 按照官方教程&#xff0c;实现在网页上打开MindSe…

Java中等题-盛最多水的容器(力扣)

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 我一开…

继电器实现上下电

一、依赖库 import serial 二、代码 import serialdef batonoff(com,status):继电器开关:param status::return:ser serial.Serial(com, baudrate9600, timeout0.1)if ser.is_open:if status "on":ser.write(data[0xA0, 0x01, 0x01, 0xA2])print(打开继电器)els…

Nginx负载均衡数据流分析

1、各机器ip信息 客户端IP&#xff1a;192.168.3.239 Nginx代理服务器IP&#xff1a;192.168.3.241 服务端IP&#xff1a;192.168.3.238 2、架构图&#xff08;略&#xff09; 3、 下图是在服务端上面的抓包分析。 下图是在客户端上面的抓包分析&#xff1a; 下图是在代理服务…

Python基础笔记

一、python基础1.1 基础知识1.1.1 注释 注释&#xff1a;在程序中对程序代码进行解释说明的文字。 作用&#xff1a;注释不是程序&#xff0c;不能被执行&#xff0c;只是对程序代码进行解释说明&#xff0c;让别人可以看懂程序代码的作用&#xff0c;能够大大增强程序的可读性…

【数论 状态机dp】2572. 无平方子集计数

本文涉及知识点 C动态规划 数论 质数、最大公约数、菲蜀定理 LeetCode 2572. 无平方子集计数 给你一个正整数数组 nums 。 如果数组 nums 的子集中的元素乘积是一个 无平方因子数 &#xff0c;则认为该子集是一个 无平方 子集。 无平方因子数 是无法被除 1 之外任何平方数整…

数据结构,单向链表

数据结构是计算机科学中的一个核心概念&#xff0c;它研究的是数据的组织、管理和存储方式&#xff0c;以及在这些数据上进行操作时的算法。数据结构为数据的高效访问和修改提供了基础。 数组&#xff08;Array&#xff09;&#xff1a;一种线性数据结构&#xff0c;可以存储固…

开源 AI 智能名片 O2O 商城小程序:引入淘汰机制,激发社交电商新活力

摘要&#xff1a;本文深入探讨在社交电商领域中&#xff0c;开源 AI 智能名片 O2O 商城小程序如何通过设置淘汰机制&#xff0c;实现“良币驱逐劣币”&#xff0c;激励士气&#xff0c;为社交电商企业注入新的活力。通过分析缺乏淘汰机制的弊端以及设置淘汰机制的优势&#xff…

一篇入门C语言【文件】

本科期间C语言的课本无论哪个版本都会有【文件】这一章节&#xff0c;不过好多学校基本上不讲或者就出一道选择题&#xff0c;讲得很浅&#xff0c;今天这篇详细总结一下这部分的知识~ 一.原理解析 文件是指存在在外部介质&#xff08;如磁盘、磁带&#xff09;上的数据集合。操…

NPDP|如何在传统行业中做好产品管理的策略与建议

在当今这个快速变化的数字时代&#xff0c;传统行业面临着前所未有的挑战与机遇。产品管理作为连接市场需求与企业生产的核心环节&#xff0c;其重要性不言而喻。对于传统行业而言&#xff0c;做好产品管理不仅意味着保持竞争力&#xff0c;更是实现转型升级、拥抱未来的关键。…

【类模板】成员函数模板

一、成员函数模板的基本含义 不管是普通的类&#xff0c;还是类模板&#xff0c;都可以为其定义成员函数模板&#xff0c;以下的情况就是类模板和成员函数模板都有各自独立的一套参数&#xff1a; template<typename T1> class A { public:T1 m_ic;static constexpr int…

0.3 学习Stm32经历过的磨难

文章目录 用库函数传参 能否按位或STM32库函数XXX_GetFlagStatus和XXX_GetITStatus的区别 用库函数传参 能否按位或 答案是看清况&#xff0c;而不是一股脑的写&#xff01;&#xff08;血泪的经验啊&#xff09; 可行的情况&#xff1a; //如gpio初始化结构体中的gpiopin参…