芯片型号:STM32F103RC
软件开发包:标准外设库
一、GPIO简介
- GPIO(General Purpose Input Output)通用输入输出口
- 可配置为8种输入输出模式
- 引脚电平:0V~3.3V,部分引脚可容忍5V
- 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
- 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
二、GPIO模式
GPIO有八种模式,分别是浮空输入、上拉输入、下拉输入、模拟输入、推挽输出、开漏输出、复用推挽输出、复用开漏输出。
模式名称 | 性质 | 特征 |
---|---|---|
浮空输入 | 数字输入 | 可读取引脚电平,若引脚悬空,则电平不确定 |
上拉输入 | 数字输入 | 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平 |
下拉输入 | 数字输入 | 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平 |
模拟输入 | 模拟输入 | GPIO无效,引脚直接接入内部ADC |
开漏输出 | 数字输出 | 可输出引脚电平,高电平为高阻态,低电平接VSS |
推挽输出 | 数字输出 | 可输出引脚电平,高电平接VDD,低电平接VSS |
复用开漏输出 | 数字输出 | 由片上外设控制,高电平为高阻态,低电平接VSS |
复用推挽输出 | 数字输出 | 由片上外设控制,高电平接VDD,低电平接VSS |
三、GPIO的基本结构
3.1 保护二极管
由于芯片内部电路所能承受的电压有限,因而I/O引脚向里有两个保护二极管。当引脚电压高于 VDD 时,上方的二极管导通,当引脚电压低于 VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。当然了,此结构也仅能抵御短暂的电压波动,若较长时间将较高的电压接入I/O口依然会损坏芯片。
在STM32中,大多数I/O口的最大承受电压为3.3V,这种I/O口上方保护二极管电压为3.3V。而有一部分I/O口可以做到5V容忍,也就是可以承受5V电压作为高电平输入,这种I/O口上方保护二极管电压为5V。尽管有这样的保护,并不意味着 STM32 的引脚能直接外接大功率驱动器件,如直接驱动电机,强制驱动要么电机不转,要么导致芯片烧坏,必须要加大功率及隔离电路驱动。
3.2 输出电路
3.2.1 STM32的输出模式
STM32的输出模式分为两类:推挽输出和开漏输出
- 推挽输出
- 可以输出高低电平,用于连接数字器件,高电平由VDD决定,低电平由VSS决定。
- 推挽结构指两个MOS管受两路互补的信号控制,总是在一个导通的时候另外一个截止,优点开关效率高,电流大,驱动能力强。
- 输出高电平时,电流输出到负载,叫拉电流,可以理解成推;输出低电平时,负载电流流向芯片,叫灌电流,即挽。
- 开漏输出
- 只能输出低电平,不能输出高电平。
- 如果要输出高电平,则需要外接上拉.
- 开漏输出具有“线与”功能,一个为低,全部为低,多用于I2C和SMBUS总线。
- 推挽输出和开漏输出的区别
3.2.2 普通输出模式和复用输出模式
对于输出控制模块来说,它有两个控制指令来源,一个是通过输出寄存器,另一个是通过片上外设。由于同时控制会导致输出模块不知道听谁的,因而根据控制来源的不同,STM32将两种输出模式又细分为了普通的推挽输出与开漏输出以及复用推挽输出与复用开漏输出。
3.3 输入电路
3.3.1 主线路介绍
首先经过的是一对上拉下拉电阻,当我们设置上拉输入时,上拉电阻启用;设置下拉输入时,下拉电阻启用;而浮空输入时,两个电阻都不会启用。
电流继续前进会遇见一个TTL肖特基触发器,或者说施密特触发器,其作用是稳定电平。
由于外部输入的电压可能不太稳定,并不总能达到标准的3.3V或者0V,因而我们可以简单地规定一个参考电压,高于此电压的就算做高电平,低于此电压的就算做低电平,使用一个比较器就可以实现此效果。
但若输入电压中噪声较多,在参考电压附近徘徊,则会导致高低电平快速变化无法准确测得当前电平。因而改用施密特触发器,就会产生两个参考电压,当输入电压高于高参考电压,则输出高点平;当输入电压低于低参考电压,则输出低电平;在两者之间,则维持原本的电平信号不变。
最后,经过施密特触发器处理后的电平信号被写入输入数据寄存器。
3.3.2 分支介绍
我们可以看到,在这条主线路中有两个分支,第一条分支通向了模拟输入,浮空、上拉、下拉这三种输入模式都是仅读取了高低电平,也就是所谓的数字信号,因而我们统称为数字输入。而模拟输入是读取输入电压的具体数值,因而其在施密特触发器前便产生了分支,将电压引入模拟输入相关的片上外设。
另一个支线则是在施密特触发器后,接入了例如串口模块等需要数字输入的片上外设。不过与输出部分只能有一个控制源不同的是输入部分的不同分支可以同时读取施密特触发器的输出,也就没有出现复用上拉输入等模式,而是在片上外设上也使用普通的输入模式即可。
参考视频源于B站up主:野火科技、江协科技
参考文档:《STM32库开发实战指南——基于野火MINI开发板》