在
电子系统设计中,STM32 的 GPIO(通用输入输出)具有至关重要的作用,它可以被配置为多种模式,以满足不同的应用需求。这些模式包括输入浮空、输入上拉 / 下拉、模拟、推挽和开漏输出等。在输入模式里,上拉和下拉电阻的作用十分关键,它们能够确保逻辑电平的确定性,避免信号的不稳定。而输出模式分为推挽和开漏,推挽模式使用两个(一个 PMOS 和一个 NMOS)来驱动输出,能够快速地将输出驱动到适当的电平;开漏模式则需要外部上拉电阻,在一些特定的应用场景中具有独特的优势。复用功能允许 GPIO 与多个外设共享,大大提高了引脚的利用率;模拟配置则用于 ADC、DAC 等模拟信号操作,为处理模拟信号提供了便利。配置这些模式涉及到 GPIOx_PUPDR、GPIOx_OTYPER 等寄存器。
STM32 产品集成了三个主要的 GPIO 基本结构,分别是三伏兼容(缩写为 TC)、三伏容限(缩写为 TT)和五伏容限(缩写为 FT)。图 1 给出了等效的 GPIO 图结构,图 2 给出了 TT 或 FT 等效的 GPIO 图结构。


当 STM32 器件 I/O 引脚配置为输入时,有三种选项可供选择:
- 带内部上拉的输出:在 STM32 器件中使用上拉电阻,能确保在浮动输入信号的情况下具有良好定义的逻辑电平。根据应用要求,还可以使用外部上拉电阻。
- 带内部下拉的输入:使用下拉电阻,同样是为了确保在浮动输入信号时逻辑电平的确定性。也可根据需要使用外部下拉电阻。
- 浮空输入:信号电平跟随外部信号。但当没有外部信号时,施密特触发器会在由外部噪声引起的逻辑电平之间随机切换,这会增加总体消耗。
编程为输入时,I/O 端口具有以下特征:
- 输出被关闭;
- 施密特触发器输入被打开;
- 根据 GPIOx_PUPDR 寄存器中的值决定是否激活上拉或下拉电阻;
- 输入数据寄存器每隔 1 个 AHB 时钟周期对 I/O 引脚上的数据进行一次采样;
- 通过读取 GPIOx_IDR 输入数据寄存器可获取 I/O 状态。
当 STM32 器件 I/O 引脚配置为输出时,有两种选项:
- 推挽输出模式:推挽输出使用两个晶体管(一个 PMOS 和一个 NMOS)。当输出必须驱动为高电平状态时,顶部晶体管(PMOS)导通;当输出必须驱动为低电平状态时,底部晶体管(NMOS)导通。两个晶体管的控制通过 GPIO 端口输出类型寄存器(GPIOx_OTYPER)完成。将输出寄存器(GPIOx_ODR)的相关位写 0 可激活 NMOS 晶体管,强制 I/O 引脚接地;写 1 可激活 PMOS 晶体管,强制 I/O 引脚接通 VDD。
- 开漏输出模式:开漏输出模式不使用 PMOS 晶体管,而是需要一个上拉电阻。当输出必须变为高电平时,必须关闭 NMOS 晶体管,仅通过上拉电阻将电平拉高。该上拉电阻可以是内部的,典型值为 40kOhm,并通过 GPIO 端口上拉 / 下拉寄存器(GPIOx_PUPDR)激活。
编程为输出时,I/O 端口具有以下特征:
- 可将输出缓冲器配置为开漏或推挽模式;
- 施密特触发器输入被打开;
- 根据 GPIOx_PUPDR 寄存器中的值决定是否激活上拉或下拉电阻;
- 写入输出数据寄存器 GPIOx_ODR 的值将 I/O 引脚状态置位;
- GPIOx_ODR 中的写入数据可从 GPIOx_IDR 中读取,该寄存器每个 AHB 时钟周期更新一次。
在一些 STM32 GPIO 引脚上,用户可以选择复用功能输入 / 输出。每个引脚可与多达 16 个外设功能复用,例如通信接口(SPI,UART,I2C,USB,CAN,LCD 等)、、调试接口等。所选引脚的复用功能通过两个寄存器配置:GPIOx_AFRL(引脚 0 到 7)和 GPIOx_AFRH(引脚 8 到 15)。
对 I/O 端口进行编程作为复用功能时:
- 可将输出缓冲器配置为开漏或推挽模式
- 输出缓冲器由来自外设的信号驱动(使能和数据)
- 施密特触发器输入被打开
- 根据 GPIOx_PUPDR 寄存器中的值决定是否激活上拉或下拉电阻
- 输入数据寄存器每隔 1 个 AHB 时钟周期对 I/O 引脚上的数据进行一次采样。
- 对输入数据寄存器的读访问可获取 I/O 状态。
有一些 STM32 GPIO 引脚可以配置为模拟模式,允许使用 ADC、DAC、OPAMP 和 COMP 内部外设。要在模拟模式下使用 GPIO 引脚,需要考虑以下寄存器:
- GPIOx_MODER,用于选择模式(输入,输出,复用,模拟)
- GPIOx_ASCR,用于选择所需的功能,如 ADC,DAC,OPAMP 或 COMP
对 I/O 端口进行编程作为模拟配置时:
- 输出缓冲器被关闭
- 施密特触发器输入被禁用,因此 I/O 引脚的每个模拟值零消耗。施密特触发器的输出被强制为恒定值(0)。
- 上拉和下拉电阻被硬件关闭
- 对输入数据寄存器的读访问值为 “0”。

0次