GPIO实现的功能

  • 输出相关
    • 输出状态:推挽或者开漏 + 上下拉
    • 输出数据可以来自于输出数据寄存器(GPIOx_ODR)或外设(复用功能的输出)
    • 每个I/O都可以选择输出的速度
  • 输入相关
    • 输入状态:浮空、上下拉和模拟
    • 输入数据可以来自于输入数据寄存器(GPIOx_IDR)或外设(复用功能的输入)
  • 模拟功能
    • ADC输入
    • DAC输出输入
  • 模拟比较器
  • 复用功能的选择寄存器
  • 早期stm32 GPIO的种工作模式, 如_STM32F103xx_
    • 浮空输入模式
    • 上拉输入模式
    • 下拉输入模式
    • 模拟输入模式
    • 开漏输出模式
    • 推挽输出模式
    • 复用开漏输出模式
    • 复用推挽输出模式

GPIO的工作模式

GPIO的输出

输出类型

推挽输出
  • 输出寄存器ODR为1时,P-MOS管导通,N-MOS管截止(断开),引脚高电平

  • 输出寄存器ODR为0时,P-MOS管截至,N-MOS管导通,引脚低电平

开漏输出
  • 输出寄存器ODR为1时,N-MOS管截止,引脚高阻态/悬空

  • 输出寄存器ODR为0时,N-MOS管导通,引脚输出低电平

内部上下拉电阻

  • 在输出模式下,输出类型为推挽输出,不管如何设置内部上下拉电阻(内部上下拉电阻是无效的或者说被旁路了),引脚输出是受ODR输出寄存器控制,推挽输出不配置上拉电阻
  • 在输出模式下,输出类型为开漏输出,引脚输出是受ODR输出寄存器控制同时也受上下拉电阻控制
    • 开漏 + ODR(1) = 悬空
    • 开漏 + ODR(1) + 上拉 = 高电平
    • 开漏 + ODR(1) + 下拉 = 低电平

- 开漏 +  ODR(0)  + 上拉/下拉= 低电平

输出速度

速度挡位
模式 速度描述 速度 @2.7-3.6V (MHz) 速度 @1.58-2.7V (MHz)
0 Low speed 12.5 5
1 Medium speed 55 12.5
2 High speed 100 33
3 Very-high speed 100 33
速度的影响
  • 速度越高,GPIO翻转的时间越短,对高速信号造成的影响越小
  • 速度越高,产生的电磁干扰越强,功耗越大

比喻:允许速度越快的路,越直,越平坦,但路占地面积越大,修建成本越高!

常见接口速度
  • 驱动LED等,低速
  • UART,115200bps以内,低速
  • I2C,400k,中速
  • SPI,20M,高速

GPIO口的输入

  • 输入模式下没有推挽、开漏一说
  • 在不配置上下拉电阻的情况下,引脚是浮空状态
  • 一般情况下根据所接外设的默认输出状态决定配置上下拉电阻

上拉输入

  • 在输入模式下,配置为上拉电阻,引脚默认是高电平,即输入寄存器IDR为1

下拉输入

  • 在输入模式下,配置为下拉电阻,引脚默认是低电平,即输入寄存器IDR为0

GPIO口的复用

  • 为了在有限的引脚上实现尽量多的外设接口,目前几乎所有的MCU都采用IO口可配置模式,让每个IO口拥有多种接口能力
  • I2C总线
    • I2C总线,在一组总线上可以连接多个外设,同一个时刻,MCU只能和一个外设进行通信, 其他外设不能参与通信。这样,就要求同一时刻,只能由1个外设控制总线的高、低电平变 化,这样需要线与功能 两根数据线,因为硬件上已经有外置的上拉电阻,所以配置成不带上下拉的开漏输出,复用 模式,速度选择高速或超高速
  • SPI总线
  • UART接口
  • Timer

GPIO口的模拟

  • ADC
  • DAC输出输入
  • 模拟比较器

GPIO的复位状态

普通GPIO口的复位状态

  • 是模拟输入模式

调试口

  • 下述接口,复位后,不是普通GPIO口状态,是特殊的调试相关接口状态
    • PA15: JTDI in pull-up
    • PA14: JTCK/SWCLK in pull-down
    • PA13: JTMS/SWDIO in pull-up
    • PB4: NJTRST in pull-up
    • PB3: JTDO/TRACESWO in floating state no pull-up/pull-down

引导配置接口

  • PH3/BOOT0:根据在用户选择配置字(user option byte)中的nSWBOOT0 位配置,可以被用作boot 引脚 (BOOT0) 或一个 GPIO(nSWBOOT0 = 0为GPIO功能)
  • 如果是用作boot引脚,上电时的高低电平,可以结合其他用户选择字节配置位,影响代码从什么位置来运行

外部晶体振荡器接口

  • 外部高速晶体振荡器接口、外部低速(32.768kHz)晶体振荡器接口在没有使用相应的外部振荡器时,可以被用作普通的GPIO

GPIO寄存器简介

  • 实际偏移地址因内型号而定
/**
* @brief General Purpose I/O
*/
typedef struct
{
__IO uint32_t MODER;   /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint32_t OTYPER;  /*!< GPIO port output type register, Address offset: 0x04 */
__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
__IO uint32_t PUPDR;   /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
__IO uint32_t IDR; 	   /*!< GPIO port input data register, Address offset: 0x10 */
__IO uint32_t ODR;     /*!< GPIO port output data register, Address offset: 0x14 */
__IO uint32_t BSRR;    /*!< GPIO port bit set/reset register, Address offset: 0x18 */
__IO uint32_t LCKR;    /*!< GPIO port configuration lock register, Address offset: 0x1C */
__IO uint32_t AFR[2];  /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */
__IO uint32_t BRR;     /*!< GPIO Bit Reset register, Address offset: 0x28 */
__IO uint32_t HSLVR;   /*!< GPIO high-speed low voltage register, Address offset: 0x2C */
__IO uint32_t SECCFGR; /*!< GPIO secure configuration register, Address offset: 0x30 */
} GPIO_TypeDef;
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐