STM32 - GPIO 详解

2023-10-27

GPIO - 详解




提示:以下是本篇文章正文内容,下面案例可供参考

1、GPIO 是什么

​ GPIO(General-Purpose input/output):通用输入输出端口的简称。是 外设 与 微控制器 (STM32等单片机)通信的通道,俗称 常用引脚。

  • 必须使能 GPIO 时钟才能打开通信通道。
  • 可以通过软件控制 GPIO 的 输出 与 输入。即 这些常用引脚可以供使用者由 程序 自由使用,变为 输入(GPI)、输出(GPO)或 通用输入输出(GPIO),如 clk、generator,chip,select等。
  • 每个引脚 必须通过 寄存器 才能实现 输入、输出 或 其它特殊功能。
    • 对于输入,一定是通过 读取 某个寄存器来确定引脚电位的高低;
    • 对于输出,一定是通过 写入 某个寄存器来使得引脚输出为 高电平 或 低电平;
    • 对于其它特殊功能,则有 另外的寄存器来控制。
  • STM32 的 GPIO 引脚与外部设备连接 起来,从而实现与外部 通信控制 以及 数据采集 功能。

2、STM32 引脚分类

​ STM32 芯片引脚可分为六种引脚: 电源管脚、晶振管脚、复位管脚、下载管脚、BOOT 管脚 和 GPIO 管脚

  • 我们接下来就是 专注于 GPIO 引脚的学习。

3、GPIO 内部结构

下图为 GPIO 的基本结构图:
在这里插入图片描述

  • 最右端 I/O 端口是 STM32 芯片的引脚,剩余的左侧所有部分都在 STM32 芯片内部。
  • GPIO 引脚经过两个保护二极管后就分成两路,上面一路是 “输入模式”,下面一路是 “输出模式”。

接下来,就是对结构图各个模块进行分析了,Go

3.1 保护二极管

​ 模块 1 :为 保护二极管。防止引脚外部 过高 或 过低 的电压输入。

  • 当引脚电压 高于 VDD_FT(VDD)时,上方的二极管导通吸收这个高电压。
  • 当引脚电压 低于 VSS 时,下方的二极管导通,防止不正常电压引入芯片。

3.2 上下拉电阻

​ 模块 2:为带有电阻开关的上下拉电阻。通过配置上下拉电阻开关,控制引脚的默认状态电平。

  • 当开启 上拉 时,引脚默认电压为 高电平
  • 当开启 下拉 时,引脚默认电压为 低电平

​ STM32 内部的上拉起始就是一个 弱上拉,即通过此上拉电阻输出的电流很小,如果想要输出一个大电流,那么就需要外接 上拉电阻 了。

浮空模式:将上拉和下拉的开关都关断。此模式下,引脚的电压是不确定的。

  • STM32 上下拉浮空模式 的配置是通过 GPIOx_CRLGPIOx_CRH 寄存器控制的。
  • 浮空模式 下,如果用万用表测量此模式下管脚电压时发现只有 1点几伏,而且还不时改变。所以一般情况下我们都会给引脚设置成 上拉下拉 模式,使引脚有一个默认状态。

因此 我们就可以明白 GPIO 八种工作模式的其中三种:

  • GPIO 的输入工作模式 1 - 输入浮空模式
    在这里插入图片描述
  • GPIO 的输入工作模式 2 - 输入上拉模式
    在这里插入图片描述
  • GPIO 的输入工作模式 3 - 输入下拉模式
    在这里插入图片描述

3.3 P-MOS 和 N-MOS

输出模式下,线路经过由 P-MOS 和 N-MOS管组成的单元电路。这让 GPIO 引脚具有了 推挽开漏 两种输出模式。

  1. 推挽 输出模式

    推挽输出模式,是根据 P-MOS 和 N-MOS 管的 工作方式命名 的。

    • 在该结构单元 输入一个高电平时,P-MOS 管导通,N-MOS 管截止,对外输出高电平(3.3V)。

    • 在该结构单元 输入一个低电平时,P-MOS 管截止,N-MOS 管导通,对外输出低电平(0V)。

当引脚高低电平切换时,两个 MOS 管将轮流导通。一个负责灌电流(电流输出到负载),一个负责拉电流(负载电流流向芯片),使其 负载能力开关速度 都比普通方式由很大的提高。下图为 推挽输出模式 的等效电路:

在这里插入图片描述

  • 推挽输出模式 一般应用在 输出电平为 0~3.3V 而且需要高速切换开关状态的场合。除了必须要用 开漏输出模式 的场合,我们一般选择 推挽输出模式。要配置引脚是 开漏输出模式 还是 推挽输出模式,需要通过 GPIOx_CRLGPIOx_CRH 寄存器控制。
  1. 开漏 输出模式

    开漏输出模式 时,不论输入是 高电平 还是 低电平,P-MOS 管总处于关闭状态

    • 当输入 低电平 时,N-MOS 管导通,输出即为 低电平

    • 当输入 高电平 时,N-MOS 管截止,这个时候引脚状态既不是高电平,也不是低电平,我们称之为 高阻态

    • 如果想让引脚输出 高电平,那么引脚必须外接一个上拉电阻,由上拉电阻提供高电平。

      开漏输出模式 等效电路,如下图所示:

在这里插入图片描述

  • 在 开漏输出模式 中还有一个特点,引脚具有“线与”关系。即多个 开漏输出模式 的引脚接在一起的总线,只要其中有一个引脚为低电平,总线(其它所有引脚)就为低电平。因此,与 为低电平的 开漏输出模式 引脚 连接在一起的所有 开漏输出模式 引脚 都被拉低为低电平。
  • 只有当所有引脚输出 高阻态 时,这条总线的电平才由 上拉电阻的 VDD 决定。如果 VDD 连接的是 3.3V(5V),那么引脚输出的就是 3.3V(5V)。因此,如果想要让 STM32 引脚(默认这个 STM32 引脚是容忍 5V 的)输出 5V,就可选择 开漏输出模式,然后外接上拉电阻的电源 VDD 选择 5V 即可。

开漏输出模式 一般应用在 I2C、SMBUS 通信等需要 ”线与“ 功能的总线电路中。还可以用在电平不匹配的场合中,就如上面说的输出 5V 一样。

​ 因此 我们就可以明白 GPIO 八种工作模式的其中两种:

  • GPIO 的输出工作模式 4 - 推挽输出模式

在这里插入图片描述

  • GPIO 的输出工作模式 5 - 开漏输出模式

在这里插入图片描述

注:此处为什么在输出模式下,输入路上的 TTL 施密特触发器是处于开启状态呢 ?

  • 输出模式 时,TTL 施密特触发器打开(即输入可用),是为了通过 输入数据寄存器 GPIOx_IDR 来读取 I/O 的实际状态。

3.4 输出数据寄存器

双 MOS 管结构电路的输入信号,是由 GPIO“输出数据寄存器 GPIOx_ODR”提供的。因此我们通过修改输出数据寄存器的值就可以修改 GPIO 引脚的输出电平。而**“(位设置/清除寄存器)置位/复位寄存器 GPIOx_BSRR”**可以通过修改输出数据寄存器的值从而影响电路的输出。

3.5 复用输出功能

由于 STM32 的 GPIO 引脚具有第二引脚。因此当使用复用功能的时候,也就是通过其它外设复用功能输出信号GPIO 输出数据寄存器 一起通过梯形结构连接到双 MOS 管电路的输入,其中梯形结构是用来选择使用 复用功能 还是 普通 I/O 口功能

​ 例如:当使用 USART 串口通信时,需要用到某个 GPIO 引脚作为 通信发送引脚(此时为发送数据)。此时,就可以把这个 GPIO 引脚配置成 USART 串口复用功能,由串口外设控制该引脚 发送数据

由于输出模式分为 开漏输出 和 推挽输出。 我们就可以明白 GPIO 八种工作模式的其中两种:

  • GPIO 的输出工作模式 6 - 推挽复用输出模式
    在这里插入图片描述
  • GPIO 的输出工作模式 7 - 开漏复用输出模式
    在这里插入图片描述

3.6 输入数据寄存器

输入数据寄存器 是由 I/O 口经过上下拉电阻、TTL 施密特触发器引入。当信号经过 TTL 施密特触发器,模拟信号将变为数字信号“0”或“1”,然后存储在 输入数据寄存器 中。通过读取 输入数据寄存器 GPIOx_IDR 就可以知道 I/O 口的电平状态。

3.7 复用功能输入

此模式与 复用功能输出 类似。在 复用功能输入 模式时,GPIO 引脚的信号传输到 STM32 其它片上外设,由该外设读取引脚的状态。

​ 同样例如,我们使用 USART 串口通信时,需要用到某个 GPIO 引脚作为 通信接收引脚,此时就可把该 GPIO 引脚配置成 USART 串口复用功能。从而使得 USART 可以通过该通信引脚接收远端数据。

  • 3.3.5 复用功能输出 对应,有输出也有输入。

3.8 模拟输入输出

当 GPIO 引脚设置为**“模拟输入”**时, 用于 ADC 采集电压的输入通道 。并且,此时信号时不经过 TTL 施密特触发器的。因为 经过 TTL 施密特触发器后信号只有 “0”和“1”两种状态,所以 ADC 作为外设要采集到原始的模拟信号时,其信号源输入必须在 TTL 施密特触发器之前。

​ 当 GPIO 引脚设置为**”模拟输出“**时,用于 DAC 作为模拟电压输出通道。DAC 的模拟信号输出就不经过双 MOS 管结构了,模拟信号直接通过管脚输出。

我们就可以明白 GPIO 八种工作模式的其中一种:

  • GPIO 的输出工作模式 8 - 模拟模式
    在这里插入图片描述

4、GPIO 工作模式总结

通过 3. GPIO 内部结构 了解了 GPIO 内部的结构关系,决定了 GPIO 可以配置成以下几种模式:

4.1 输入模式(浮空、上拉、下拉、模拟)

GPIO 的输入工作模式 1 - 输入浮空模式:浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候可以使用这个模式。
(上拉下拉很好理解,默认的电平由上拉或者下拉决定)
GPIO 的输入工作模式 2 - 输入上拉模式
GPIO 的输入工作模式 3 - 输入下拉模式
GPIO 的输出工作模式 8 - 模拟模式:模拟输入则用于 ADC 采集。

  • 在输入模式时,施密特触发器打开,输出被禁止。
  • 可通过 输入数据寄存器 GPIOx_IDR 读取 I/O 状态。
  • 输入模式可以配置为 浮空上拉下拉 以及 模拟 模式。

4.2 输出模式(推挽、开漏)

GPIO 的输出工作模式 4 - 推挽输出模式
GPIO 的输出工作模式 5 - 开漏输出模式

  • 推挽模式时,双 MOS 管以推挽方式(高低电平切换输出)工作。
    • 输出速度可配置,只有 2MHz、25MHz 和 50MHz 的选项。此处的输出速度即 I/O 支持的高低电平状态最高切换频率。支持的频率越高,功耗越大。如果功耗要求不严格,把速度设置成最大即可。
    • 输出数据寄存器 GPIOx_ODR 可控制 I/O 输出高低电平。
  • 开漏模式时,只有 N-MOS 管工作,输出数据寄存器可控制 I/O 输出 高阻态低电平
  • 上面也提到过,在输出模式时,TTL 施密特触发器是打开的。即输入可用,通过 输入数据寄存器 GPIOx_IDR 可读取 I/O 的实际状态。

4.3 复用功能(推挽、开漏)

GPIO 的输出工作模式 6 - 推挽复用输出模式
GPIO 的输出工作模式 7 - 开漏复用输出模式

  • 复用功能模式中,输出使能,输出速度可配置。
  • 可工作在 开漏推挽 模式。
  • 但是 输出信号 源于其它外设,输出数据寄存器 GPIOx_ODR 无效。
  • 输入可用,通过 输入数据寄存器 GPIOx_IDR 可获取 I/O 实际状态,但一般直接用 外设的寄存器 来获取该数据信号。

4.4 模拟输入输出(上下拉无影响)

GPIO 的输出工作模式 8 - 模拟模式

  • 模拟输入输出模式中,双 MOS 管 结构被 关闭TTL 施密特触发器停用上/下拉也被禁止
  • 其它外设通过 模拟通道 进行输入输出。
  • 通过对 GPIO 寄存器 写入不同的参数,就可以改变 GPIO 的 应用模式。(如果要具体了解寄存器时,一定要查阅《STM32Fxxx 参考手册》中对应外设的寄存器说明。可参考这篇 【7】
  • 在 GPIO 外设中,通过设置 “端口配置寄存器 GPIOx_CRLGPIOx_CRH ”可配置 GPIO 的工作模式和输出速度。CRH 控制端口高八位,CRL 控制端口的低八位。

5、GPIO 工作模式代码配置

GPIO_Mode_AIN			// 模拟输入
GPIO_Mode_IN_FLOATING   // 浮空输入
GPIO_Mode_IPD 			// 下拉输入
GPIO_Mode_IPU			// 上拉输入
GPIO_Mode_Out_OD        // 开漏输出
GPIO_Mode_Out_PP        // 推挽输出
GPIO_Mode_AF_OD         // 复用开漏输出
GPIO_Mode_AF_PP         // 复用推挽输出
    
typedef enum     
 {      
    GPIO_Mode_AIN = 0x0, //  模拟输入          
    GPIO_Mode_IN_FLOATING  = 0x04, // 浮空输入          
    GPIO_Mode_IPD  = 0x28, // 下拉输入         
    GPIO_Mode_IPU  = 0x48, // 上拉输入          
    GPIO_Mode_Out_OD  = 0x14, // 开漏输出          
    GPIO_Mode_Out_PP  = 0x10, // 推挽输出          
    GPIO_Mode_AF_OD  = 0x1C, // 复用开漏输出         
    GPIO_Mode_AF_PP = 0x18 // 复用推挽输出        
 } GPIOMode_TypeDef; 

6、GPIO 寄存器

GPIO 共有 10 个寄存器,分别为:

  • 4 个 32 位配置寄存器
  • 2 个 32 位数据寄存器
  • 1 个 32 位置位/复位寄存器
  • 1 个 32 位锁存寄存器
  • 2 个 32 位复用功能寄存器

如下图:
在这里插入图片描述

  1. GPIOx_MODER 端口模式寄存器

    • MODER:(Mode Register)
      在这里插入图片描述
  2. GPIOx_OTYPER 端口输出类型寄存器

    • OTYPER:(Output Type Register)
      在这里插入图片描述
  3. GPIOx_OSPEEDR 输出速度寄存器

    • OSPEEDR:(Output Speed Register)
      在这里插入图片描述
  4. GPIOx_PUPDR 端口上拉/下拉寄存器

    • PUPDR:(Pull Up & Pull Down Register)
      在这里插入图片描述
  5. GPIOx_IDR 端口输入数据寄存器

    • IDR:(Input Data Register)
      在这里插入图片描述
  6. GPIOx_ODR 端口输出数据寄存器

    • ODR:(Output Data Register)
      在这里插入图片描述
  7. GPIOx_BSRR 端口置位/复位寄存器

    • BSRR:(Bit Set Reset Register)
      在这里插入图片描述
  • 0-15,输入1则输出1,输入0则不作任何改变
  • 16-32,输入1则输出0,输入0则不作任何改变
  • 与 ODR 的区别就是,ODR 需要先读取再全部输出,BSRR 则只需要确定修改位为1,其他 0 输入即可。不需要读取,但是 BSRR 的实质也是操控 ODR
  1. GPIOx_LCKR 端口配置锁存寄存器
    - LCKR:(Lock Register)
    在这里插入图片描述

  2. GPIOx_AFRL、AFRH 复用功能寄存器

    • AFRL:(Alternate Function Register Low)
    • AFRH:(Alternate Function Register High)
    • 高位 AFRH 和 地位 AFRL 分别控制 8 个 I/O 口,共 16 个 I/O 口。即如果一个 64 位数据会分配到这 16 个 I/O 口,那么 每个 I/O 口控制 4 个位。
      在这里插入图片描述

7、总结

  • GPIO 是统用 I/O 口,对于 stm32 来说,I/O 的输入与输出需要一定的寄存器来进行一些控制。
  • GPIO 口的设置在 stm32 固件库里有直接设置的函数,可以调用。
  • 初始化 GPIO 前必须使能 GPIO 的时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);	

8、参考

【1】GPIO简介_旭日初扬的博客-CSDN博客_gpio

【2】嵌入式单片机基础篇(一)之stm32F1GPIO详解_lostlll的博客-CSDN博客

【3】RCC_APB2Periph_AFIO的理解。。。重映射的一点心得 - Cold_water - 博客园 (cnblogs.com)

【4】gpio_百度百科 (baidu.com)

【5】STM32学习——GPIO_m0_65734791的博客-CSDN博客_stm32引脚分类

【6】(1条消息) STM32外设之GPIO的推挽输出和开漏输出模式详解_SlowIsFastLemon的博客-CSDN博客_stm32 开漏输出

【7】如何下载STM32的各种参考资料和手册_小熊@XiaoXiong的博客-CSDN博客

【8】STM32GPIO简介_oasis1500的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 - GPIO 详解 的相关文章

  • 接口的静态方法

    静态接口方法 从java开始 接口当中允许使用静态方法 public static 返回值类型 方法名称 参数列表 方法体 提示 就是将abstract或者default换成static即可 带上方法体 方法样式 public interf
  • 老版本的 mybatis-generator 使用示例

    文章目录 main 入口 generatorConfig xml log4j properties main 入口 import java io File import java util ArrayList import java uti

随机推荐

  • c++返回数组引用的函数(4种方法)

    分享返回数组引用的4种方法 普通法 类型别名 尾置返回类型 decltype include
  • CSS层叠上下文

    在学习z index属性的时候 限制了能够使用z index属性的元素 那么为什么有的元素能够使用z index 因为他创建了一个层叠上下文 对于这个词的理解首先要理解上下文 上下文这个名词的出现有很多地方 块级格式上下文 执行上下文 在不
  • 【转载】VC常用小技巧(2)

    项目 如何干净的删除一个类 1 先删除项目中对应的 h和 cpp文件 选中后用 Delete键删除 2 保存后退出项目 到文件夹中删除实际的 h和 cpp文件 3 删除 clw文件 4 重新进入项目 进行全部重建 rebuild all 如
  • 批处理常用命令及用法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 批处理常用命令及用法大全 阅读本文需要一定的dos基础概念 象 盘符 文件 目录 文件夹 子目录 根目录 当前目录每个命令的完整说明请加 参数参考微软的帮助文档可以看到 在
  • 前端 - 实习两个星期总结

    文章目录 吐槽 总结 新人建议 项目学习到的 今天已经是菜鸟实习的第二个星期了 怎么说呢 反正就是进的一个不大不小的厂 做着不难不易的事 菜鸟现在主要做的就是适配 现在就来总结一下 不过这之前 菜鸟不得不吐槽一波 吐槽 1 菜鸟进的是一家国
  • kvm常见故障及解决

    一 启动虚拟机Connection reset by peer virsh start vmhost1error Failed to start domain vmhost1error Unable to read from monitor
  • 浙江大学计算机学院最权威的老师,浙江大学计算机科学与技术专业导师介绍:郑能干...

    姓名 郑能干 性别 男 职称 副教授 在岗性质 全职在岗 学院 系 计算机科学与技术学院 招生资格类别 硕士生导师 研究方向 人工智能嵌入式系统神经信息工程普适计算 Email zng cs zju edu cn 个人简介 郑能干 男 19
  • 【计算机视觉】深度学习框架-Keras

    文章目录 1 从零开始训练网络 1 1 搭建网络基本架构 1 2 构建训练网络 1 3 启动训练网络并测试数据 2 用Keras实现一个简单神经网络 2 1 Keras简介 2 2 MNIST手写数字识别 详细解释步骤 2 2 1 数据的加
  • C++内存管理(3)——内存池

    1 默认内存管理函数的不足 为什么使用内存池 利用默认的内存管理操作符 new delete 和函数 malloc free 在堆上分配和释放内存会有一些额外的开销 系统在接收到分配一定大小内存的请求时 首先查找内部维护的内存空闲块表 并且
  • [tensorflow] eval和run的区别

    在tensorflow中 eval和run都是获取当前结点的值的一种方式 在使用eval时 若有一个 t 是Tensor对象 调用t eval 相当于调用sess run t 一下两段代码等效 float tensor tf cast tf
  • 毕设系列 - java web 项目获取方式说明

    文章目录 1 项目获取地址 2 项目包含内容 2 1 整体项目内容 3 样例 基于java web的网上招聘系统的设计与实现 3 1 系统研究背景 3 2 系统研究意义 3 3 开发环境 3 4 系统设计 3 4 1 系统设计模块 3 4
  • AOSP>设计>测试>(第三节)兼容性测试套件CTS

    AOSP gt 设计 gt 测试 gt 兼容性测试套件CTS 第三节 兼容性测试套件 CTS 概览 工作流程 测试用例的类型 涵盖的领域 设置CTS 物理环境 蓝牙 LE 信标 相机 GPS GNSS WLAN 和 IPv6 Wi Fi R
  • 基于MATLAB实现语音信号加噪与去噪的低通滤波器

    基于MATLAB实现语音信号加噪与去噪的低通滤波器 一 概述 在语音信号处理中 由于外界环境的干扰或传输过程中的噪声引入 可能导致语音信号质量下降 为了提高语音信号的清晰度和可懂度 需要对信号进行去噪处理 本文将介绍如何使用MATLAB实现
  • 启明智显分享

    提示 启明智显专为智能产品提供一站式彩屏显示 连接 云端服务 APP软件开发 维护等解决方案 帮厂商快速实现硬件的智能化 作为启明云端旗下方案公司 我们用心整理了开发小伙伴在开发过程中可能会遇到的问题以及快速上手的简明教程 同时也用心整理了
  • 最小二乘法 python实现

    最小二乘法适用于对处理的一堆数据 不必精确的经过每一点 而是根据图像到每个数据点的距离和最小确定函数 最小二乘法逼近的最简单的例子是根据一组观测值对 x1 y1 x2 y2 xn yn 来拟合一条直线 直线的数学表达式为 下面是一元线性拟合
  • Qt版本的选择与安装

    Qt简介 Qt是当下最流行的C 开发库 也是当下最流行的跨平台开发框架之一 可开发桌面端应用 移动端应用以及嵌入式端应用 可以说能支持的系统基本都支持 它可以做GUI但功能远不止GUI 我们用的最多的还是桌面端和嵌入式端的应用 移动端应用流
  • 最新Android Studio解决> No cached version of org.javailable for offline mode.

    问题 A problem occurred configuring root project kaikeba gt Could not resolve all artifacts for configuration classpath gt
  • 报错:Dependency annotations: {@org.springframework.beans.fact}

    我当时检查了下面的所有内容发现都没有错 最后在第五个监听器打错了 这给我气的 大家自己对照下面的内容仔细看看自己哪里错了吧 类检查方面 1 是否在加了 Controller Repository Service 注解 Controller
  • MySQL JDBC编程

    文章目录 什么是JDBC编程 JDBC的工作原理 JDBC的优点 JDBC的使用 插入操作 修改操作 删除操作 查询操作 什么是JDBC编程 JDBC编程就是用Java代码来操作数据库 JDBC即Java Database Connecti
  • STM32 - GPIO 详解

    GPIO 详解 文章目录 GPIO 详解 1 GPIO 是什么 2 STM32 引脚分类 3 GPIO 内部结构 3 1 保护二极管 3 2 上下拉电阻 3 3 P MOS 和 N MOS 3 4 输出数据寄存器 3 5 复用输出功能 3