Skip to main content

03 GPIO

General Purpose Input/Output 通用输入输出端口

up的视频讲解: https://space.bilibili.com/1455872040

1 ⭐️GPIO简介​

图片

GPIO(General Purpose Input Output)通用I/O端口, 是STM32芯片与外部设备的电气接口

  • STM32F103C8T6的LQFP48封装主要引出GPIOA、GPIOB、GPIOC,另外PD0/PD1与外部高速晶振功能相关;实际可用脚以封装引脚表为准

  • 每组标准 16 个引脚(编号 0~15,标注 PAx/PBx/PCx)

  • C8T6属于中容量器件,采用48引脚封装,并不是每组16个脚都全部引出。

    • 输入
      • Input floating 浮空
      • Input pull-up 上拉
      • Input-pull-down 下拉
      • Analog 模拟输入
    • 输出
      • Output push-pull 推挽
      • Output open-drain 开漏
      • Alternate function push-pull 复用推挽
      • Alternate function open-drain 复用开漏
    • 输出速度(3档)

      • 低速 2MHz
      • 中速 10MHz
      • 高速 50MHz
上下拉输入

上下拉在输入悬空或外部未主动驱动时提供默认电平,不是只在初始化瞬间有效;外部电路正常驱动时还要满足输入阈值。

2 ➡️GPIO四种输入​

2.1 输入结构​

图片

保护二极管: IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入

上拉、下拉电阻:开启上拉的时候引脚初始状态为高电平,开启下拉的时候引脚初始状态为低电平

TTL施密特触发器:IO口信号经过触发器后,模拟信号转化为0和1的数字信号

  • IDR - Input data register(输入数据寄存器):锁存引脚的实时电平状态, 供 CPU 读取

2.2 浮空输入​

图片
  • 浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器
  • MCU直接读取I/O口电平,I/O的初始电平状态是不确定的,完全由外部输入决定

2.3 上拉输入​

图片
  • IO内部接上拉电阻 此时IO口默认为高电平

2.4 下拉输入​

图片
  • IO内部接下拉电阻 此时IO口默认为低电平
弱 上/下拉

STM32的内部上拉是"弱上拉",因为有上/下拉电阻的存在,通过此上/下拉输出的电流是很弱的,所以有外部输入是, 电平由外部决定

2.5 模拟输入​

图片
  • 模拟输入模式下,外部电平信号没有流入输入数据寄存器,而是直接流入模拟输入部分

  • 当GPIO引脚用于ADC采集电压的输入通道时,用作"模拟输入"功能,此时信号不经过施密特触发器,直接直接进入ADC模块

  • 当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出

  • 除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置为复用功能模式

3 ⬅️GPIO四种输出​

3.1 输出结构​

图片

P-MOS管和N-MOS管:通过P-MOS管和N-MOS管的互补配合 实现IO口输出高低电平

  • ODR - Output data register (输出数据寄存器):存储 CPU 要输出的目标电平状态

  • BSRR/BRR - Bit set/reset registers ( 置位 / 复位寄存器):原子操作置位 / 复位引脚, 避免多任务冲突

剩下三个在GPIO的框架图里面没有标注出来

  • GPIOx_CRL - Port configuration register Low(端口配置低寄存器): 用于配置低八位引脚的模式(PIN0到PIN7引脚)

  • GPIOx_CRH - Port configuration register High (端口配置高寄存器) 该寄存器配置信息和上面的一样, 用于配置高八位引脚(PIN8到PIN15)

寄存器怎么看?
  • 该寄存器使用了32位, 每个引脚对应4位去配置, 所以一个寄存器对应8个引脚

  • 四位中, 低两位叫MODE, 高两位叫CNF

  • 低两位MODE的信息分别控制引脚的输入输出方向, 和输出速度

  • 高两位CNF的信息分别控制 输入/输出方向下的 四种模式

3.2 推挽输出​

图片
  • 推挽模式下, P-MOS 和 N-MOS 都受输出控制逻辑驱动

  • 如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平

  • 若控制输出为1 高电平,则P-MOS管导通N-MOS管关闭,使输出高电平,I/O端口的电平就是高电平

  • 此时施密特触发器是打开的,即输入可用

3.3 开漏输出​

图片

开漏模式下, P-MOS始终断开, 只有 N-MOS 工作

  • 如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平

  • 若控制输出为1时,高电平,则P-MOS管和N-MOS管都关闭,即释放端口

  • 并且此时施密特触发器是打开的,即输入可用

为什么叫开漏输出?
  • MOS 管有栅极 (基极)、漏极 (集电极)、源极 (发射极)
  • 开漏 = 漏极对外开路(只接内部 N-MOS 管漏极,不接上拉电源)

3.4 复用推挽输出​

图片

其信号来源是由复用功能相关的通信通道来控制 下的推挽输出

3.5 复用开漏输出​

图片

控制信号的来源由复用功能的外设决定的开漏输出

开漏输出和推挽输出的区别

开漏输出比推挽输出少用了一个 P-MOS, 它的意义在于

  • 开漏输出只可输出低电平,要得到高电平状态需要外接上拉电阻才行

  • 开漏输出一般应用在I2C等需要“线与”功能的总线电路中。

  • 除此之外,还用在电平不匹配的场合,如需要输出5伏的高电平,就可以在外部接一个上拉电阻,上拉电源为5伏

✅模式选择与验证​

连接对象常用模式验证方法
接3.3 V的按键下拉输入松开0,按下1
LED或模块控制端推挽输出固定写高、写低,测引脚电压
IIC总线复用开漏并有上拉释放时能回到高电平
ADC模拟信号模拟输入数字输入路径关闭,ADC读数随电压变化

2/10/50 MHz描述输出驱动速度档位,不会让GPIO自动输出对应频率的方波。保护结构也不是“任意电压都能接”的保证,5 V容忍与模拟输入限制要查具体引脚。