前言
笔者近日在B站刷到了一个视频,使我对GPIO的I/O口内部基本结构以及工作原理有了恍然大明白的理解,现在对此做一个总结,并为大家推荐该视频Keysking
【STM32】GPIO内部电路原理
GPIO内部结构概览
结构关系图如下图所示
GPIO内部结构详解
保护电路
PS:
当I/O口为FT 5V容忍时,其上方保护二极管电压Vdd = 5V
保护二极管不能长期导通,否则会烧坏保护二极管。所以保护电路只能抵御一瞬间的电压波动,较长时间的电压波动仍会损坏芯片
输出电路
推挽输出
流程图:
代码 --> 寄存器 --> 输出控制器 --> 控制P-MOS/N-MOS的导通与断开 --> 输出的电压
分类讨论:
SET置1:P-MOS导通 N-MOS断开 芯片输出3.3V(此电压由芯片输出,所以推挽输出有驱动能力
RESET置0:P-MOS断开 N-MOS导通 芯片输出0V
开漏输出
前提:在开漏输出下,P-MOS一直断开,所以在图上我直接将其删去以简化单路
以I/O口外接工作电压为5v的小灯泡为例
开漏输出更像是一个电子开关,小灯泡的工作电压由小灯泡外接的5V提供(注意,此I/O口需5V容忍)。因为电压由外部提供,所以开漏输出无驱动能力(他只是个电子开关 不提供电压 所以当然没驱动能力)
分类讨论:
SET置1:N-MOS导通 电路通路 小灯泡电压由外部5V提供 灯亮
RESET置0:N-MOS断开 电路内部高阻态 电路断路 无电流 灯灭
所以,开漏输出的高电平实际是高阻态 无法输出电流 无驱动能力
输入电路
上下拉电阻:
Pull-up上拉:开关1闭合,I/O引脚内部上拉
Pull-down下拉:开关2闭合,I/O引脚内部下拉
不上拉也不下拉:开关1、2均不闭合,I/O引脚内部浮空 电平不确定
PS:I/O口输入可以配置内部的上下拉电阻,为硬件功能实现提供了更多的可能(比如KEY按键模块中,如果KEY模块没有配置外部的上拉电阻,则可以通过自行配置内部的上下拉电阻来实现功能。具体请参考B站
TTL肖特基触发器:
实际上是模拟电压 --> 数字电压
高低参考电压之间,维持原本电平信号不变,以此来抗噪声
PS:
Q:为什么没有复用输入模式?
A:因为复用功能输入与通用功能输入可以同时读取施密特触发器的输
总结
对于GPIO内部结构而言,通过不同的配置可以完成不同的输入输出功能
输出:
代码 --> 寄存器 --> 输出控制模块 --> 控制P-MOS与N-MOS的导通与断开情况 --> 推挽/开漏输出
输入:
I/O口输入模拟电压 --> 上下拉电阻 --> 施密特触发器 --> 数字电压 --> 存储到输入数据寄存器