• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

STM32 - GPIO

武飞扬头像
浅尝写博客的爽
帮助1

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、参考

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

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgjkkjj
系列文章
更多 icon
同类精品
更多 icon
继续加载