GPIO结构

GPIO简介

GPIO(General Purpose Input Output)通用输入输出口

可配置为8种输入输出模式

引脚电平:0V~3.3V,部分引脚可容忍5V

输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等

输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

GPIO基本结构

在STM32中,所有的GPIO都是挂载在APB2外设总线上的,其中GPIO外设的名称是按照GPIOA、GPIOB、GPIOC等等这样来命名的。每个GPIO外设,总共有16个引脚,标号是从0到15。GPIO的第0号引脚,我们一般把它称作PA0,接着1号就是PA1,然后PA2,以此类推,一直到PA15。GPIOB也是一样。

在每个GPIO模快内,主要包含了寄存器和驱动器这些东西,寄存器就是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,这样就可以完成输出电平和读取电平的功能了,这个寄存器的每一位对应一个引脚,其中输出寄存器写1,对应的引脚就会输出高电平,写0,就输出低电平。输入寄存器读取为1,就证明对应的端口目前是高电平,读取为0,就是低电平。

因为STM32是32位的单片机,所以STM32内部的寄存器都是32位的,但这个端口只有16位,所以这个寄存器只有低16位对应的有端口,高16位是没有用到的。

驱动器是用来增加信号的驱动能力的,寄存器只负责存储数据,如果要进行点灯这样的操作的话,还是需要驱动器负责增大驱动能力的。

GPIO位结构

整体结构可以分为两个部分,上面是输入部分,下面是输出部分。

输入部分

首先是这个IO引脚,这里接了两个保护二极管,这个是对输入电压进行限幅的,上面二极管接VDD,3.3V,下面二极管接VSS,0V;如果输入电压比3.3v还要高,那上方这个二极管就会导通,输入电压产生的电流就会直接流入VDD而不会流入内部电路,这样就可以避免过高的电压对内部电路产生伤害。

如果输入电压比0v还要低,这个电压是相对与VSS的电压,所以是可以有负电压的,那这时下方这个二极管就会导通,电流会从VSS直接流出来,电流会从VSS直接流出去,而不会从内部电路汲取电流,也是可以保护内部电路的。

这里连接了一个上拉电阻和一个下拉电阻,上拉电阻至VDD,下拉电阻至VSS,这个开关可以通过程序进行配置。

如果上面导通、下面断开,就是上拉输入模式;如果是下面导通、上面断开,就是下拉输入模式;如果两个都断开,就是浮空输入模式。

上拉和下拉的作用:是为了给输入提供一个默认的输入电平,因为对应一个数字的端口,输入不是高电平就是低电平;如果输入引脚哈都不接,这时输入就会处于一个浮空状态,引脚的输入电平极易受外界干扰而改变;为了避免引脚悬空导致的输入数据不稳定,我们就需要在这里加上上拉或下拉电阻

施密特触发器的作用:是对输入电压进行整形

它的执行逻辑是:如果输入电压大于某一阈值,输出就会瞬间升为高电平,如果输入电压小于某一阈值,输出就会瞬间降为低电平。

对于施密特触发器来说,只有高于上限或者低于下限,输出才会变化

接下来经过施密特触发器整形的波形就可以直接写入输入数据寄存器了,我们再用程序读取输入数据寄存器对应某一位的数据,就可以知道端口的输入电平了。

上面还有两路线路,是连接到片上外设的一些端口;其中一个是模拟输入,这个可以连接到ADC上,因为ADC需要接受模拟量,所以这根线是接到施密特触发器前面的,另一个是复用功能输入,这个是连接到其他需要读取端口的外设上的(比如,串口的输入引脚等),这根线接受的是数字量,所以在施密特触发器后面。

输出部分

输出部分由输出数据寄存器或片上外设控制,两种控制方式通过这个数据选择器接到输出控制部分;如果选择通过输出数据寄存器进行控制,就是普通的IO口输出,写这个输出数据寄存器的某一位就可以操作对应的某个端口了。

位设置/清除寄存器,这个可以用来单独操作输出数据寄存器的某一位,而不影响其他位,因为这个输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写,所以如果想单独控制其中某一个端口而不影响其他端口的话,就需要一些特殊的操作方式。第一种方式:先读出这个寄存器,然后按位与和按位或的方式更改某一位,最后再将更改后的数据写回去,在C语言中就是&=和|=的操作,这种方式比较麻烦,效率不高,对于IO口的操作而言不太合适。第二种方式:通过位设置/位清楚寄存器,如果我们对于某一位进行置1的操作,在位设置寄存器的对应位写1即可,剩下不要操作的位写0,这样内部就会有有电路,自动将输出数据寄存器中对应位置为1,而剩下写0的位则保持不变。如果想对某一位进行清0的操作,就在位清除寄存器的对应位写1即可,这样内部电路就会把这一位清0了。第三种方式:读写STM32“位带”区域,在STM32中,专门分配的有一段地址区域,这段地址映射了RAM和外设寄存器所有的位,读写这段地址中的数据,就相当于读写映射位置的某一位。

上面是P-MOS,下面是N-MOS,这个MOS管就是一种电子开关,我们的信号来来控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS,在这里可以选择推挽、开漏或关闭三种输出方式。

推挽输出模式下

这种模式下,高低电平均有较强的驱动能,所以推挽输出模式也可以叫强推输出模式,在推挽输出模式下,STM32对IO口具有绝对的控制权,高低电平都由STM32说的算。

在推挽输出模式下,P-MOS和N-MOS均有效。数据寄存器为1时,上管导通,下管断开,输出直接接到VDD,就是输出高电平。数据寄存器为0时,上管断开,下管导通,输出直接接到VSS,就是输出低电平。

在开漏输出模式下

  1. MOS是无效的,只有N-MOS在工作。数据寄存器为1时,下管断开,这时输出相当于断开,也就是高阻模式;数据寄存器为0时,下管导通,输出直接接到VSS,也就是输出低电平。在开漏输出模式下,只有低电平有驱动能力,高电平没有驱动能力。

这个模式的用处在于可以作为通信协议的驱动方式,比如IIC通信的引脚,就是使用开漏模式。在多机通信的情况下,这个模式可以避免各个设备的相互干扰。

开漏模式还可以用于输出5v的电平信号,比如在IO口外接一个上拉电阻到5v的电源,当输出低电平时,由内部的N-MOS直接接VSS,当输出高电平时,由外部的上拉电阻拉高至5v,这样就可输出5v的电平信号,用于兼容一些5v电平的设备,以上就是开漏输出的主要用途。

关闭状态输出方式

这个是当引脚配置为输入模式的时候,这两个MOS管都无效,也就是输出关闭,端口的电平由外部信号来控制。

GPIO模式

通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式

浮空输入、上拉输入、下拉输入

这三个模式的电路结构基本是一样的,区别就是上拉电阻和下拉电阻的连接,它们都属于数字的输入口,特征就是,都可以读取端口的高低电平;当使用浮空输入时,端口一定要接上一个连续的驱动源,不能出现悬空状态。

这三种模式的电路结构如下,可以看到,在输入模式下,输出驱动器是断开的,端口只能输入而不能输出;上面这两个电阻可以选择位上拉工作、下拉工作或者都不工作,对应的就是上拉输入、下拉输入和浮空输入,然后输入通过施密特触发器进行波形整形后,连接到输入数据寄存器,另外这个输入保护这里写的是VDD或VDD_FT(这就是3.3v端口和容忍5v端口(它的上面保护二极管要做一下处理,要不然直接接VDD3.3v的话,外部再接入5v电压就会导致上边二极管开启,并且产生比较大的电流,这个是不太妥当的)的区别。

模拟输入(ADC模数转换器的专属配置)

这里输出是断开的,输入的施密特触发器也是关闭的无效状态,所以整个GPIO大部分都是无效的,只有下图的红色线有效,也就是从引脚直接接入片上外设,也就是ADC,所以当我们使用ADC的时候,将引脚配置位模拟输入就行了,其他时候吗,一般用不到模拟输入。

开漏输出和推挽输出

这两个电路结构也基本一样,数字输出,可以用于输出高低电平,区别就是开漏输出的高电平呈现的是高阻态,没有驱动能力,而推挽输出的高低电平都是具有驱动能力的。输出是由输出数据寄存器控制的,这个P-MOS无效就是开漏输出如果P-MOS和N-MOS都有效,就是推挽输出;另外,在输出模式下,输入模式也是有效的(在上面电路,在输入模式下,输出无效;因为,一个端口只能有一个输出,但可以有多个输入,所以当配置成输出模式时,内部也可以顺便输入一下)。

复用开漏输出和复用推挽输出

这两模式和普通的开漏输出和推挽输出差不多,只不过是复用的输出,引脚电平是由片上外设控制的。通用的输出是没有连接的,引脚的控制权转移到了片上外设,由片上外设控制,在输入部分,片上外设也可以读取引脚的电平,同时普通的输入也是有效的,顺便接收一下电平信号。

参考手册

 当使用片上外设的引脚时,可以参考这个表里给的配置。

可以看一下GPIO寄存器描述

首先是GPIO配置寄存器,每一个端口的模式由4位进行配置,16个端口就需要64位,所以这里的配置寄存器有两个,一个是端口配置低寄存器,一个是端口配置高寄存器,可以看介绍进行配置。

GPIO的输出速度可以限制输出引脚的最大翻转速度,这个设计出来,是为了低功耗和稳定性的,我们一般要求不高时一般配置成50MHz就可以了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux实验记录:使用DHCP动态管理主机地址

前言: 本文是一篇关于Linux系统初学者的实验记录。 参考书籍:《Linux就该这么学》 实验环境: VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注: 动态主机配置协议(DHCP&…

MongoDB从入门到实战之Docker快速安装MongoDB

前言 在上一篇文章中带领带同学们快速入门MongoDB这个文档型的NoSQL数据库,让大家快速的了解了MongoDB的基本概念。这一章开始我们就开始实战篇教程,为了快速把MongoDB使用起来我将会把MongoDB在Docker容器中安装起来作为开发环境使用。然后我这边MongoD…

关于RabbitMQ面试题汇总

什么是消息队列?消息队列有什么用? 消息队列是一种在应用程序之间传递消息的通信机制。它是一种典型的生产者-消费者模型,其中生产者负责生成消息并将其发送到队列中,而消费者则从队列中获取消息并进行处理。消息队列的主要目的是…

【无标题】卫星数据链开发平台设计方案:522-基于AD9988的四通道1G带宽卫星数据链开发平台基于AD9988的四通道1G带宽卫星数据链开发平台

卫星数据链开发平台设计方案:522-基于AD9988的四通道1G带宽卫星数据链开发平台 基于AD9988的四通道1G带宽卫星数据链开发平台 一、卫星数据链综 卫星通信是卫星互联网的重要应用之一,主要指通过或借助卫星进行数据通信,可广泛应用于移…

紫光展锐摘得多项行业桂冠,综合实力获认可

近期,紫光展锐凭借在技术和产品创新领域的实力和成果,接连斩获多项行业重要荣誉。 紫光展锐首颗5G NTN-IoT卫星通信SoC芯片V8821荣获第11届手机设计大赛天鹅奖“2023年度最佳终端解决方案奖”、2023年度ICT产业龙虎“2023年度最佳5G技术创新”、2023年度…

【机器学习】基于集成学习的 Amazon 用户评论质量预测

实验六: 基于集成学习的 Amazon 用户评论质量预测 1 案例简介 ​ 随着电商平台的兴起,以及疫情的持续影响,线上购物在我们的日常生活中扮演着越来越重要的角色。在进行线上商品挑选时,评论往往是我们十分关注的一个方面。然而目前电商网站的…

论文阅读——MP-Former

MP-Former: Mask-Piloted Transformer for Image Segmentation https://arxiv.org/abs/2303.07336 mask2former问题是:相邻层得到的掩码不连续,差别很大 denoising training非常有效地稳定训练时期之间的二分匹配。去噪训练的关键思想是将带噪声的GT坐标…

对象存储minio

参考Linux搭建免费开源对象存储 wget https://dl.minio.io/server/minio/release/linux-amd64/minio yum install -y wget yum install -y wget wget https://dl.minio.io/server/minio/release/linux-amd64/minio chmod x minio sudo mv minio /usr/local/bin/ minio --vers…

编译DuiLib库遇到的变量定义位置问题

C89 规定,所有局部变量都必须定义在函数开头,在定义好变量之前不能有其他的执行语句; C99 标准取消这这条限制,但是 VC/VS 对 C99 的支持不是很积极; C99 是 C89 的升级版; 如图是修改之后的代码&#xff1…

海光--性能领先实干者

这是ren_dong的第26篇原创 1、概述 国产X86 CPU领航者 海光信息是一家从事高端处理器、加速器等计算芯片产品和系统研发的公司 ,是国产X86 CPU领航者海光处理器兼容市场主流的 X86 指令集,具有成熟而丰富的应用生态环境公司股权结构合理 ,聚集…

python复制别人的虚拟环境

虚拟环境的结构 一个项目的虚拟环境是由以下组成的,如下图: 其中Lib文件夹里存放的就是我们安装的一些第三方库,Scripts文件夹很重要,它里面的activate文件是用于激活虚拟环境的,还有pyvenv.cfg文件是这个虚拟环境的…

第8节、双电机多段直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】,查看本系列全部文章 摘要:前面章节主要介绍了bresenham直线插值运动,本节内容介绍让两个电机完成连续的直线运动,目标是画一个正五角星 一、五角星图介绍 五角星总共10条直线,10个顶点。设定左下角为原点…

seata分布式事务

文章目录 1、分布式事务1.1 事务的ACID原则原子性一致性隔离性持久性 1.2 分布式事务的问题示例代码准备环境1. seata_demo数据库2. 启动nacos seata-demo父工程pom.xml order-servicepom.xmlapplication.ymlOrderApplicationOrderControllerOrderServiceImplAccountClientStor…

leetcode1079:游戏玩法分析——求留存率

求留存率 题目描述题解 题目描述 表:Activity --------------------- | Column Name | Type | --------------------- | player_id | int | | device_id | int | | event_date | date | | games_played | int | --------------------- (player_id&…

用的到的linux-删除文件-Day3

前言: 上一节,我们讲到了怎么去移动文件,其中使用到两大类的脚本命令即cp和mv。各两种命令都可以完成移动,但是cp是复制粘贴的方式,可以选择原封不动的复制粘贴过来,即不修改文件及文件夹的创建时间等&…

项目 高并发内存池

目录 项目背景 项目介绍 定长内存池 定长内存池整体架构 New 方法 Delete 方法 线程缓存 TLS 线程缓存整体结构 FreeList 设计 线程缓存模型 Allocate 申请内存 计算对齐大小 计算映射位置 申请内存流程 申请内存时创建线程缓存 中心缓存 中心缓存模型 中心…

从零开始手写mmo游戏从框架到爆炸(一)— 开发环境

一、创建项目 1、首先创建一个maven项目&#xff0c;pom文件如下&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

LeetCode 热题 100 | 链表(中下)

目录 1 19. 删除链表的倒数第 N 个节点 2 24. 两两交换链表中的节点 3 25. K 个一组翻转链表 4 138. 随机链表的复制 菜鸟做题第三周&#xff0c;语言是 C 1 19. 删除链表的倒数第 N 个节点 到底是节点还是结点。。。 解题思路&#xff1a; 设置双指针 left 和 ri…

Vue代理模式和Nginx反向代理(Vue代理部署不生效)

在使用axios时&#xff0c;经常会遇到跨域问题。为了解决跨域问题&#xff0c;可以在 vue.config.js 文件中配置代理&#xff1a; const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServer: {port: 7070,prox…

Unity3D实现项目限制功能(使用次数限制和时间限制)

系列文章目录 unity工具 文章目录 系列文章目录前言一、时间限制1-1、代码如下&#xff1a; 二、次数限制2-1、 在Unity项目中需要对注册表进行操作&#xff0c;还需要设置一下API兼容级别设置成 .NET Framework2-2、设置如下图 Player里面2-3、代码如下&#xff1a; 三、同时…