STM32之GPIO(General Purpose Input/Output,通用型输入输出)

news2024/11/24 8:01:59

文章目录

  • 前言
  • 一、GPIO简介
  • 二、GPIO结构
    • 2.1 GPIO基本结构
    • 2.2 GPIO位结构
      • 2.2.1 输入部分
      • 2.2.1 输出部分
  • 四、GPIO模式
    • 4.1 浮空/上拉/下拉输入
    • 4.2 模拟输入
    • 4.3 开漏/推挽输出
    • 4.4 复用开漏/推挽输出


前言

提示:本文主要用作在学习江协科大STM32入门教程后做的归纳总结笔记,旨在学习记录,如有侵权请联系作者

本文主要探讨stm32中GPIO的相关概念以及stm32内部的GPIO外设。


一、GPIO简介

在STM32中,GPIO(General Purpose Input/Output,通用型输入输出)是一个非常重要的概念,它指的是STM32微控制器上的一组引脚,这些引脚可以通过软件配置为输入或输出模式以执行各种数字信号的处理任务。

GPIO引脚的主要功能包括:

  • 输入功能: 用于读取外部设备的信号状态,如按键、传感器等。通过配置为输入模式,GPIO引脚可以检测外部电路的电平状态(高电平或低电平),从而获取外部设备的信息。
  • 输出功能: 用于向外部设备发送控制信号,如控制LED灯的亮灭、驱动电机等。通过配置为输出模式,GPIO引脚可以输出高电平或低电平信号,从而控制外部设备的状态。
  • 复用功能: STM32的GPIO引脚还具备复用功能,即可以作为片上外设的接口引脚,如SPI、I2C、UART等通信接口的引脚。

二、GPIO结构

2.1 GPIO基本结构

如下所示是GPIO的整体结构图,每个GPIO模块内部都包含有寄存器和驱动器。

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

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

在这里插入图片描述

2.2 GPIO位结构

如下所示为GPIO的位结构(某个GPIO引脚上的具体电路结构),整体结构分为输入和输出两部分,上面为输入部分,下面为输出部分。左边三个分别是位设置/清除寄存器以及输入/输出寄存器,中间部分是输入/输出驱动器,右边是某一个IO口的引脚。

在这里插入图片描述

2.2.1 输入部分

我们可以通过读取输入数据寄存器对应某一位的数据,就可以知道端口的输入电平了,这就是输入部分电路的作用。

1. 保护二极管

IO引脚这里接了两个保护二极管,主要的作用就是对输入电压进行限幅从而保护内部电路。

在这里插入图片描述

如果输入电压比3.3v还要高,那么上方这个二极管就会导通,输入电压产生的电流就会直接流入VDD而不会流入内部电路,这样就可以避免过高的电压对内部电路产生伤害。

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

如果输入电压在0 ~ 3.3v之间,那两个保护二极管均不会导通,这时二极管对电路没有影响,这就是保护二极管的用途。

2. 上拉和下拉电阻

上拉和下拉的作用是为了给输入提供一个默认的输入电平。

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

在这里插入图片描述

上拉电阻至VDD,下拉电阻至VSS,这个开关是可以通过程序进行配置的。上面导通、下面断开,就是上拉输入模式。上面断开、下面导通,就是下拉输入模式。上面断开、下面断开,就是浮空输入模式。如果接入上拉电阻,当引脚悬空时,还有上拉电阻来保证引脚的高电平,所以上拉输入是默认为高电平的输入模式,下拉也是同理。

上拉电阻和下拉电阻的阻值都是比较大的,是一种弱上拉和弱下拉 ,目的是尽量不影响正常的输入操作。

3. 斯密特触发器

实际上这个是施密特触发器(应该是一个翻译错误)。

在这里插入图片描述

施密特触发器的作用是对输入电压的进行整形。它的执行逻辑是,如果输入电压大于某一阈值,输出就会瞬间升为高电平。如果输入电压小于某一阈值,输出就会瞬间降为低电平。经过施密特触发器整形的波形就可以直接写入输入数据寄存器了,我们再用程序读取输入数据寄存器对应某一位的数据,就可以知道端口的输入电平了。

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

2.2.1 输出部分

我们可以通过写入输出数据寄存器对应某一位的数据,就可以控制该端口的输出电平从而控制外部设备,这就是输出部分电路的作用。

在这里插入图片描述

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

位设置/清除寄存器:
左边有个叫做位设置/清除寄存器,它可以用来单独操作输出数据寄存器的某一位而不影响到其它位。

因为这个输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写,所以如果想单独控制其中的某一个端口而不影响其它端口的话,就需要一些特殊的操作方式。

第一种方式是先读出这个寄存器,然后用按位与和按位或的方式更改某一位,最后再将更改后的数据写回去。这种方法比较麻烦,效率不高,对于IO口的操作而言不太合适。

第二种方式是通过设置这个位设置/清除寄存器。如果我们要对某一位进行置1的操作,在位设置寄存器的对应位写1即可,剩下不需要操作的位写0,这样它内部就会有电路,自动将输出数据寄存器中对应位置为1,而剩下写0的位则保持不变,这样就保证了只操作其中某一位而不影响其他位,并且这是一步到位的操作。如果想对某一位进行清0操作,就在位清除寄存器的对应位写1即可,这样内部电路就会把这一位清0了。

第三种方式是读写stm32中的“位带”区域。在stm32中专门分配的有一段地址区域,这段地址映射了RAM和外设寄存器所有的位,读写这段地址中的数据,就相当于读写所映射位置的某一位,这就是位带的操作方式。

库函数使用的是读写位设置/清除寄存器的方法,也就是第二种方式。

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

1. 推挽输出

在推挽输出模式下,P-MOS和N-MOS均有效。这种模式下,高低电平均有较强的驱动能力,所以推挽输出模式也叫作强推输出模式。在推挽输出模式下,stm32对IO口具有绝对的控制权,高低电平都由stm32说了算。

当输出数据寄存器写1时,上管导通,下管断开,输出直接接到VDD,输出高电平。

在这里插入图片描述

当输出数据寄存器写0时,上管断开,下管导通,输出直接接到VSS,输出低电平。

在这里插入图片描述

2. 开漏输出

在开漏输出模式下,这个P-MOS是无效的,只有N-MOS在工作。这种模式下,只有低电平有驱动能力,高电平是没有驱动能力的。

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

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

当输出数据寄存器写1时,下管断开,这时输出相当于断开,也就是高阻模式。

在这里插入图片描述

当输出数据寄存器写0时,下管导通,输出直接接到VSS,输出低电平。

在这里插入图片描述

3. 关闭输出

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

在这里插入图片描述

四、GPIO模式

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

模式名称性质特征
浮空输入数字输入可读取引脚电平,若引脚悬空,则电平不确定
上拉输入数字输入可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
下拉输入数字输入可读取引脚电平,内部连接下拉电阻,悬空时默认低电平
模拟输入模拟输入GPIO无效,引脚直接接入内部ADC
开漏输出数字输出可输出引脚电平,高电平为高阻态,低电平接VSS
推挽输出数字输出可输出引脚电平,高电平接VDD,低电平接VSS
复用开漏输出数字输出由片上外设控制,高电平为高阻态,低电平接VSS
复用推挽输出数字输出由片上外设控制,高电平接VDD,低电平接VSS

4.1 浮空/上拉/下拉输入

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

可以看到,在输入模式下,输出驱动器是断开的,端口只能输入而不能输出。上面这两个电阻可以选择位上拉工作、下拉工作或者都不工作。对应的就是上拉输入、下拉输入和浮空输入。然后输入通过施密特触发器进行波形整形后,连接到输入数据寄存器。

在这里插入图片描述

4.2 模拟输入

这个模拟输入,可以说是ADC模数转换器的专属配置了,模拟输入的结构如下。

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

在这里插入图片描述

4.3 开漏/推挽输出

这两个电路结构也基本一样,都可以用于输出高低电平。区别就是开漏输出的高电平呈现的是高阻态,没有驱动能力。而推挽输出的高低电平都是具有驱动能力的。

这两种模式的电路结构如下:
输出是由输出数据寄存器控制的,这个P-MOS无效就是开漏输出。如果P-MOS和N-MOS都有效,就是推挽输出。

在这里插入图片描述

4.4 复用开漏/推挽输出

这两种模式和普通的开漏输出和推挽输出差不多,只不过是复用的输出,引脚电平是由片上外设控制的。

模式结构如下:
通用的输出是没有连接的,引脚的控制权转移到了片上外设,由片上外设控制,在输入部分,片上外设也可以读取引脚的电平,同时普通的输入也是有效的,顺便接收一下电平信号。

在这里插入图片描述

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

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

相关文章

【数据结构-前缀哈希】力扣523. 连续的子数组和

给你一个整数数组 nums 和一个整数 k ,如果 nums 有一个 好的子数组 返回 true ,否则返回 false: 一个 好的子数组 是: 长度 至少为 2 ,且 子数组元素总和为 k 的倍数。 注意: 子数组 是数组中 连续 的部…

SpringBoot快速学习

目录 SpringBoot配置文件 多环境配置 SpringBoot整合junit SpringBoot整合mybatis 1.在创建时勾选需要的模块 2.定义实体类 3.定义dao接口 4.编写数据库配置 5.使用Druid数据源 SpringBoot 是对 Spring 开发进行简化的。 那我们先来看看SpringMVC开发中的一些必须流程…

C++ | Leetcode C++题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; class Solution { public:int partitionAroundPivot(int left, int right, int pivot, vector<int> &nums) {int pivotValue nums[pivot];int newPivot left;swap(nums[pivot], nums[right]);for (int i left; i < right; …

【Buffer Pool】定长内存池的实现

创建一个大块的内存内存 1.内存的类型是什么&#xff1f; char* 方便有多少字节就乘以多少字节 2.如何还回来内存&#xff1f;可以将换回来的小块的内存块链接起来&#xff0c;使用freeList 3.如何链接起来? 让上一个内存块的数据存下一个内存块的地址即可 4.如果内存块的…

Mybatis-plus乐观锁

为什么要用锁 原因是当两个线程并发修改同一条数据时候 例如有条数据 id 1 count(金额/数量) 500 有两个线程都在查询数据库 查出来都是 1 500 现在两个线程都要修改这条数据 在原来基础上20 和30 那么理论来讲应该是550 可是实际有可能是530 原…

点双联通分量和边双联通分量如何选择?

先讲一下 &#xff0c;双联通分量 一定是用于 无向图 考虑什么时候需要用边双联通分量呢&#xff1f;&#xff0c;考虑给你的是一个一般图&#xff0c;需要你把联通的点都缩起来&#xff0c;视作一个点的情况&#xff0c;就是说割点可以反复访问&#xff0c;就是说割点和其他点…

鸿蒙应用服务开发【华为支付服务】 服务端

介绍 华为支付云侧接口 Java SDK Sample。 官方 Java 语言开发库pay-java由 core 和 service 组成&#xff1a; core 为基础库。包含自动签名和验签的 HTTP 客户端、回调处理、加解密库。service 为业务服务。基于业务场景提供不同的业务类&#xff0c;其下的方法为对应的ht…

openai-dotnet:OpenAI官方提供的.NET SDK库!

自从ChatGPT大火以来&#xff0c;针对OpenaAI提供的API接口&#xff0c;封装的SDK库非常多。 之前也推荐过几个.Net版本&#xff0c;今天推荐下OpenAI官方提供的.NET 库&#xff01; 01 项目简介 openai-dotnet是OpenAI 官方提供的 .NET库&#xff0c;用于方便.NET应用程序中…

【Java数据结构】---初始数据结构

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 前言 从今天开始我们就要学习Java…

搭建基于树莓派的Linux学习环境(TODO)

主要是想学一下Linux内核&#xff0c;所以搭一套环境&#xff0c;其实有几个选择&#xff0c;都是我买了板子的。 首先是正点原子的RK3568&#xff0c;最早是想弄安卓&#xff0c;但是SDK的大小真的把我劝退了&#xff0c;动不动几百个G的空间&#xff0c;还有就是保底16个G的…

108 将有序数组转换为二叉搜索树

解题思路&#xff1a; 平衡二叉树&#xff0c;又称自平衡二叉搜索树&#xff08;简称AVL树&#xff09;&#xff0c;其特点如下: 每个子树都为平衡二叉树高度平衡&#xff1a;任意节左子树与右子树高度差不超过1排序树&#xff1a;左子树的所有节点的值小于该节点&#xff0c;…

算法回忆录(3)

11. 假设有7个物品&#xff0c;它们的重量和价值如下表所示。若这些物品均不能被分割&#xff0c;且背包容量M&#xff1d;150&#xff0c;设计算法求解怎么装才能使得获取的价值最大&#xff1f;请写出伪代码。 #include <stdio.h>#define MAX_ITEMS 100 #define …

怎么读取FRM、MYD、MYI数据文件

一、介绍frm、MYD、MYI文件 在MySQL中&#xff0c;使用MyISAM存储引擎时&#xff0c;数据库表会被分割成几个不同的文件文件描述功能扩展名FRM 文件表结构定义文件存储表的结构信息&#xff0c;字段、索引等.FRMMYD 文件数据文件包含表的实际数据.MYD&#xff08;MYData&#x…

Vue3安装ffmpeg做视频截取报错

通过 yarn 安装 ffmpeg 时报错。 即&#xff0c;执行以下指令时报错&#xff1a; yarn add ffmpeg/ffmpeg^0.10.0 yarn add ffmpeg/core^0.10.0错误信息&#xff1a; node_modules\pngquant-bin: Command failed. Error: pngquant failed to build, make sure that libpng-d…

Unity强化工程 之 SpriteRender

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 1.SpriteRenderer是什么 渲染精灵用的&#xff0c;是渲染的核心组件&#xff0c;有许多重要参数所以要详细讲一讲 Spri…

从数据孤岛到一体化平台:PLM系统的变革之路

在当今快速变化的商业环境中&#xff0c;产品生命周期管理&#xff08;Product Lifecycle Management, PLM&#xff09;系统已成为企业提升竞争力、加速产品创新、优化资源配置的关键工具。相较于传统的产品数据管理&#xff08;Product Data Management, PDM&#xff09;系统和…

WPF MVVM模式图片占用问题

在很久以前就遇到这个问题&#xff0c;当时解决了&#xff0c;这过了几年&#xff0c;又遇到这个问题&#xff0c;这里做个总结&#xff0c;防止下次再踩坑了&#xff0c;也顺便帮助一下同样遇到这个问题的朋友 。 出现这个问题的原因是&#xff1a;将文件路径绑定到Image的Sou…

BUUCTF [安洵杯 2019]easy_serialize_php 1

打开题目&#xff0c;看到一串php代码&#xff0c;试着代码审计一下&#xff0c;看一下有用信息 可以看出是通过$_SESSION[img]来读取文件 extract可以将数组中的变量导入当前变量表 也就是说我们可以伪造$_SESSION 数组中的所有数据 这里传递一个参数fphpinfo 先用hackbar进…

软件工程课程实习报告(仅供参考)

一&#xff1a;实习内容设计与实现&#xff1a; 实习一&#xff1a;Git分布式版本控制 本实验的主要目的是学习和掌握Git作为版本控制工具的基本使用方法&#xff0c;特别是在团队协作开发中的重要性。具体目标包括&#xff1a; 1. 理解Git的基本概念和工作原理&#xff0c;…

【AI】可变形卷积Deformable Conv

卷积对大家来说并不陌生了&#xff0c;这里主要描述Deformable Conv。其在论文中也是常见的一个术语&#xff0c;Deformable Convolutional Networks(DCN) 还可以细分成可变形卷积、对候选区域的池化等。 传统卷积操作 将特征图分成一个个与卷积核大小相同的部分&#xff0c;…