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.6 输入数据寄存器
  • 3.7 复用功能输入
  • 3.8 模拟输入输出
  • 4、GPIO 工作模式总结
  • 4.1 输入模式(浮空、上拉、下拉、模拟)
  • 4.2 输出模式(推挽、开漏)
  • 4.3 复用功能(推挽、开漏)
  • 4.4 模拟输入输出(上下拉无影响)
  • 5、GPIO 工作模式代码配置
  • 6、GPIO 寄存器
  • 7、总结
  • 8、参考


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

    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 管的 工作方式命名 的。

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

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

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

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

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

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

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

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

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

  • 在 开漏输出模式 中还有一个特点,引脚具有“线与”关系。即多个 开漏输出模式 的引脚接在一起的总线,只要其中有一个引脚为低电平,总线(其它所有引脚)就为低电平。因此,与 为低电平的 开漏输出模式 引脚 连接在一起的所有 开漏输出模式 引脚 都被拉低为低电平。
  • 只有当所有引脚输出 高阻态 时,这条总线的电平才由 上拉电阻的 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 端口模式寄存器

    2. MODER:(Mode Register)
    3. GPIOx_OTYPER 端口输出类型寄存器

    4. OTYPER:(Output Type Register)
    5. GPIOx_OSPEEDR 输出速度寄存器

    6. OSPEEDR:(Output Speed Register)
    7. GPIOx_PUPDR 端口上拉/下拉寄存器

    8. PUPDR:(Pull Up & Pull Down Register)
    9. GPIOx_IDR 端口输入数据寄存器

    10. IDR:(Input Data Register)
    11. GPIOx_ODR 端口输出数据寄存器

    12. ODR:(Output Data Register)
    13. GPIOx_BSRR 端口置位/复位寄存器

    14. 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 复用功能寄存器

    3. AFRL:(Alternate Function Register Low)
    4. AFRH:(Alternate Function Register High)
    5. 高位 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博客

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 GPIO:一个详细解析

    发表评论