前言
GPIO:(general-purpose input/output),通用型输入输出。是芯片与外界交互的桥梁。其存在的意义就是使用程序控制这些引脚读取或输出数据。本文以STM32ZET6芯片为例,介绍了GPIO的相关内容。
目录
一、GPIO的主要特点
(1)不同型号、IO口的数量可能不同
(2)IO口快速翻转,最快可以达到每两个时钟周期翻转一次(STM32F1系列最快可以达到50MHz的翻转速度)
(3)每个IO都可以作为外部中断
(4)支持8中工作模式
GPIO引脚的工作模式:
- 输入浮空(Input floating)
- 输入上拉(Input pull-up)
- 输入下拉(Input-pull-down)
- 模拟输入(Analog)
- 通用开漏输出(Output open-drain)
- 通用推挽式输出(Output push-pull)
- 推挽式复用功能(Alternate function push-pull)
- 开漏复用功能(Alternate function open-drain)

以STM32ZET6系列单片机为例,单片机共有:7组GPIO引脚,每组16个引脚,共计112个引脚。

每个IO端口位可以通过寄存器自由编程,寄存器必须按32位字被访问。 输出模式下可以控制端口输出高电平低电平,用于驱动LED,蜂鸣器等,如果是大功 率器件(比如电机),还需要加上驱动器(小电流控制大电流)。 输入模式下可以读取端口的高低电平,用于读取外接按键,外接模拟信号的输入, ADC 电压采集,模拟通信协议接受数据等。
二、GPIO输入输出流程
1.输出流程
- 输出数据寄存器或复用功能输出的信号传送至输出控制。输出控制选择要输出的数据
- 推挽模式:输出寄存器上的1将激活P-MOS,输出高电平。0将激活N-MOS, 输出低电平。
- 开漏模式: PMOS永远关闭。输出寄存器上的0激活N-MOS,而输出寄存器上 的1将端口置于高阻状态,所以外部必须要接上拉电阻。
- 施密特触发(在图中被翻译成了肖特基触发器)输入被激活。
- 弱上拉和下拉电阻被禁止。
- 出现在IO引脚上的数据在每个APB2时钟被采样到输入数据寄存器。
- 在开漏模式时,对输入数据寄存器的读访问可得到I/O引脚的状态。
- 在推挽模式时,对输出数据寄存器的读访问得到最后一次写的值。
1.1推挽输出
- 向设置/清除寄存器对应的设置位或清除位写1
- 或者直接输出寄存器对应位写1或0
- 也可以从输入寄存器读取引脚状态
- 工作时两个MOS管交替工作来驱动负载。输出1时,上部晶体管导通将电流推向负载;输出0时,下部晶体管导通,将电流拉回地线。所以叫推挽输出。
参考下图 
1.2开漏输出
- 上部晶体管永远关闭。
- 可以输出0
- 如果要输出1必须接上拉电阻
1.3推挽输出和开漏输出的选择
使用推挽
- 驱动能力需求较高的场合
- 高速信号传输
- 无需共用信号线的场合
使用开漏
- 多个设备共用信号线
- 不同电压系统之间的接口
- 需要外部上拉电阻来确定逻辑高电平的场合
2.输入流程
- 2个保护二极管的作用是保护我们的芯片不会由于电压过高或过低而烧毁。 VDD是接电源(3.3V), VSS接地(OV)。如果IO 引脚的输入电压高于VDD的值到 一定程度,上方保护二极管导通,则引脚电压被拉低到VDD。如果IO引脚的输入电压 (负电压)低于Vss到一定程度,则下方保护二极管导通,电压被拉高到VSS.
- 2个开关控制引脚在没有输入的时候是上拉,下拉还是浮空。当上面的开关闭合 的时候,输入被拉高到高电平。当下面的开关闭合的时候,输入被拉低到低电平。如果两 个都不闭合,输入就是悬空状态。两个同时闭合,就是费电了,不会这么做的。
- 施密特(图中错误翻译成了肖特基触发器)触发器是包含正反馈的比较器电路,可以对信号进行波形整形。
- 从施密特触发器出来的数据,进入到输入数据寄存器中,我们就可以从中读出数据了。

保护二极管用于预防外部输入的信号电压过高,将输入的电压钳位在VDD附近。
内部的上下拉电阻可以实现上拉、下拉、浮空输入的切换。

施密特触发器可以实现对输入的整型

规则:只要没到下线,就一直是高,只要没超过上限,就一直是低。
原理图:

3.模拟输入
模拟输入模式,施密特触发器禁用,信号直接通过内部线路传递到单片机的内部片上外设中进行处理,例如:ADC。
