Logo

郎哥编程

单片机GPIO:详解GPIO结构

2026-09-29 6

GPIO全称为通用输入输出端口,是单片机唯一的软硬件交互物理接口。它的核心本质是通过软件配置寄存器,改变引脚内部MOS管、上下拉电阻的硬件通断状态,从而实现电平信号的采集与输出。

STM32单片机GPIO基本结构图

图 1 STM32单片机GPIO基本结构图

图1是STM32单片机GPIO基本结构图。

一、保护二极管

GPIO基本结构图最右端为I/O引脚,左端的器件位于芯片内部,在I/O引脚两侧并联了两个用于保护的二极管。

上方二极管阳极接IO引脚,阴极接Vdd(电源正极)。如果外部引脚上电压大于Vdd,上方二极管导通,将外部引脚电压钳位在Vdd+二极管导通电压(硅管0.6~0.7v,锗管0.2~0.3V),防止外部高电压烧毁芯片。

下方二极管阴极接IO引脚,阳极接Vss(电源负极,接地端)。如果外部引脚电压低于Vss,下方二极管导通,外部引脚电压钳位在Vss减去二极管导通电压(硅管-0.6~-0.7v,锗管-0.2~-0.3V),防止负压灌入芯片内部烧毁电路。

当IO 引脚电压处于正常工作范围,即引脚电压大于等于Vss,小于等于Vdd时,上、下这两只保护二极管都处于反向偏置,全部截止。

注意:保护二极管仅适合短暂静电泄放,不允许持续流过正向大电流,长时间外部施加高于 VDD+0.7V 或者低于‑0.7V 电压依旧会烧坏芯片内部电路。

二、上拉、下拉电阻

结构图的右上方有两个受控开关分别接通上拉电阻(连Vdd)和下拉电阻(连Vss)。上拉电阻可以在引脚悬空时,给引脚一个确定的高电平,消除浮空不定态(防止电平随机抖动、噪声误触发)。下拉电阻引脚悬空时,强制引脚默认是低电平,消除浮空不确定状态。

程序可以控制两个受控开关的断开和闭合,闭合上拉开关时,引脚悬空得到确定高电平,消除浮空不定态,防止噪声误触发;闭合下拉开关时,引脚悬空得到确定低电平;若两个开关全部断开,则为浮空输入,悬空时引脚电平不确定,容易引入干扰。

上拉电阻和下拉电阻主要用于单片机引脚的输入模式:闭合上拉支路开关、断开下拉支路开关,单片机引脚处于上拉输入模式;断开上拉支路开关、闭合下拉支路开关,单片机引脚处于下拉输入模式;上拉、下拉两个开关全部断开,单片机引脚处于浮空输入模式。

三、输入通路

基本结构图的上半部分为输入模式结构。

外部引脚电平先送入施密特触发器,施密特触发器会将引脚电平信号进行整形,过滤电平信号的毛刺,防止信号抖动时发生多次误触发。当引脚设置成模拟输入模式时,这条通路会断开,避免漏电流干扰 ADC 的采样结果。

施密特输出之后信号送入输入数据寄存器。CPU 可以通过读寄存器,读出当前引脚外部的电平状态。

观察结构图,施密特触发器输出端另外还有一条分支:复用功能输入。外部电平直接送给片上外设(例如 USART 的 RX、SPI 的 MISO 等外设接收信号),不经过 CPU 读取。

四、输出通路

结构图的下半部分是输出模式结构。

连接单片机引脚的有两个MOS管,上方是P-MOS管,下方是N-MOS管,由输出控制模块控制两只 MOS 管的导通和关断。

P-MOS管和N-MOS管导通和关断可以组合为三种输出模式:推挽输出模式、开漏输出模式和输出关闭。

推挽输出模式

P-MOS和N-MOS 交替导通。输出高电平时 P-MOS 导通接 VDD;输出低电平时 N-MOS 导通接 GND。高低电平都有驱动能力,可以输出电流也可以灌电流。

开漏输出模式

P-MOS管关闭,输出只用到N-MOS管。输出高电平时,N-MOS管关闭,引脚是高阻态;输出低电平时,N-MOS 导通,单片机IO 引脚通过这个导通的 N-MOS 管直接跟内部的Vss连通,单片机引脚电位就被强制变成低电平 (0V)。

输出关闭

P-MOS和N-MOS全部关闭,此时单片机引脚为高阻状态,引脚与内部电源 VDD、地 VSS 都断开。

输出数据来源有两条路径:普通 GPIO 输出和复用功能输出。

普通 GPIO 输出:CPU 有两种方式设置引脚输出电平,可以向输出数据寄存器 ODR 写入数据,也可以向位设置清除寄存器 BSRR 写入数据。

方式一:向 ODR 寄存器写数据

CPU 执行写指令,向输出数据寄存器 ODR写入数据;ODR 锁存保存每一位引脚要输出的电平,ODR 输出的电平信号送入后面的输出控制逻辑电路,输出控制逻辑根据收到的电平,控制后面一对 MOS 管(P‑MOS、N‑MOS):

  • 如果输出高电平:P-MOS 导通,N-MOS 截止;IO 引脚连通Vdd,输出高电平。
  • 如果输出低电平:P-MOS 截止,N-MOS 导通;IO 引脚连通Vss,引脚拉到地,输出低电平。

方式二:向 BSRR 写入数据

BSRR 属于只写寄存器,低 16 位用来对引脚置位(输出高电平),高 16 位用来对引脚清零(输出低电平)。BSRR 不需要先读取原有寄存器值,硬件内部更新 ODR 锁存电平之后,同样送给输出控制逻辑驱动 MOS 管。该方式不会影响其余引脚的输出状态。

复用功能输出:来自片上外设(例如 USART 的 TX、SPI 的 SCK),外设直接输出信号驱动 MOS 管,此时 GPIO 不再受 ODR 寄存器控制。

 

评论区

请 登录 后发表评论
暂无评论