目录
[1、GPIO 基本结构分析](#1、GPIO 基本结构分析)
[2、GPIO 八种工作模式](#2、GPIO 八种工作模式)
[2.1 输入浮空](#2.1 输入浮空)
[2.2 输入上拉](#2.2 输入上拉)
[2.3 输入下拉](#2.3 输入下拉)
[2.4 模拟功能](#2.4 模拟功能)
[2.5 开漏输出](#2.5 开漏输出)
[2.6 开漏式复用功能](#2.6 开漏式复用功能)
[2.7 推挽输出](#2.7 推挽输出)
[2.8 推挽式复用功能](#2.8 推挽式复用功能)
[3、GPIO 八种工作模式特点及应用](#3、GPIO 八种工作模式特点及应用)
1、GPIO 基本结构分析
STM32F103的 GPIO 工作有八种模式,但是具体这些模式是怎么实现的?下面我们通过 GPIO 的基本结构图来分别进行详细分析,总的框图如下:
如上图所示,可以看到右边只有 I/O 引脚, 该I/O 引脚就是我们可以看到 的芯片实物的引脚,其他部分都是 GPIO 的内部结构。
① 保护二极管
保护二极管共有两个,用于保护引脚外部过高或过低的电压输入。当引脚输入电压高于VDD 时,上面的二极管导通,当引脚输入电压低于 VSS 时,下面的二极管导通,从而使输入芯片内部的电压处于比较稳定的值。虽然有二极管的保护,但这样的保护却很有限,大电压大电流的接入很容易烧坏芯片。所以在实际的设计中我们要考虑设计引脚的保护电路。
②****上拉、下拉电阻
它们阻值大概在 30~50K 欧之间,可以通过上、下两个对应的开关控制,这两个开关由寄存器控制。当引脚外部的器件没有干扰引脚的电压时,即没有外部的上、下拉电压,引脚的电平由引脚内部上、下拉决定,开启内部上拉电阻工作,引脚电平为高;开启内部下拉电阻工作,则引脚电平为低。同样,如果内部上、下拉电阻都不开启,这种情况就是我们所说的浮空模式。浮空模式下,引脚的电平是不可确定的。引脚的电平可以由外部的上、下拉电平决定。需要注意的是,STM32 的内部上拉是一种"弱上拉",这样的上拉电流很弱,如果有要求大电流还是得外部上拉。
③****施密特触发器
对于标准施密特触发器,当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变,也就是说输出由高电准位翻转为低电准位,或是由低电准位翻转为高电准位对应的阈值电压是不同的。只有当输入电压发生足够的变化时,输出才会变化,因此将这种元件命名为触发器。这种双阈值动作被称为迟滞现象,表明施密特触发器有记忆性。从本质上来说,施密特触发器是一种双稳态多谐振荡器。
施密特触发器可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波波形,而且由于施密特触发器具有滞回特性,所以可用于抗干扰,以及在闭回路正回授/负回授配置中用于实现多谐振荡器。
特点:当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变。**作用:整形!如正弦波转方波;**如下正弦转方波图:
④ P-MOS 管和 N-MOS 管
这个结构控制 GPIO 的开漏输出和推挽输出两种模式。开漏输出:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。推挽输出:这两只对称的 MOS 管每次只有一只导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载拉电流。推拉式输出既能提高电路的负载能力,又能提高开关速度。
2、GPIO 八种工作模式
上面我们对 GPIO 的基本结构图中的关键器件做了介绍,下面分别介绍 GPIO 八种工作模式对应结构图的工作情况。
2.1 输入浮空
输入浮空模式:
++①上拉/下拉电阻为断开状态。++
++②施密特触发器打开。++
++③双MOS管不导通,输出被禁止。++
输入浮空模式下,IO 口的电平完全是由外部电路决定。如果 IO 引脚没有连接其他的设备,那么检测其输入电平是不确定的。也就是常说的高阻抗状态,高阻态可以理解成外部没有接任何东西的时候。该模式可以用于按键检测等场景。
特点:空闲时,IO状态不确定,由外部环境决定。
2.2 输入上拉
输入上拉模式:
++①上拉电阻导通。++
++②下拉电阻关闭。++
++③施密特触发器打开。++
++④双MOS管不导通,输出被禁止。++
在需要外部上拉电阻的时候,可以使用内部上拉电阻,这样可以节省一个外部电阻,但是内部上拉电阻的阻值较大,所以只是"弱上拉",不适合做电流型驱动。
特点:空闲时,IO呈现高电平。
2.3 输入下拉
输入下拉模式:
++①上拉电阻关闭。++
++②下拉电阻导通。++
++③施密特触发器打开。++
++④双MOS管不导通,输出被禁止。++
在需要外部下拉电阻的时候,可以使用内部下拉电阻,这样可以节省一个外部电阻,但是内部下拉电阻的阻值较大,所以只是"弱下拉",所以不适合做电流型驱动。
特点:空闲时,IO呈现低电平。
2.4 模拟功能
模拟功能:
++①上下拉电阻关闭。++
++②施密特触发器关闭。++
++③双 MOS 管也关闭。++
其他外设可以通过模拟通道输入输出。该模式下需要用到芯片内部的模拟电路单元,用于 ADC、DAC、MCO这类操作模拟信号的外设。
特点:专门用于模拟信号输入或输出,如:ADC和DAC。
2.5 开漏输出
开漏输出模式:
++①上拉下拉电阻关闭。
②施密特触发器打开。
③P-MOS管始终不导通。
④往ODR对应位写0,N-MOS管导通,写1则N-MOS管不导通。++STM32 的开漏输出模式是数字电路输出的一种,从结果上看它只能输出低电平 Vss 或者高阻态(电平不确定),常用于 IIC 通讯(IIC_SDA)或其它需要进行电平转换的场景。
开漏模式下,IO 工作如下:
①P-MOS 被"输出控制"控制在截止状态,因此 IO 的状态取决于 N-MOS 的导通状况;
②只有 N-MOS 还受控制于输出寄存器,"输出控制"对输入信号进行了逻辑非的操作;
③施密特触发器是工作的,即可以输入,且上下拉电阻都断开了,可以看成浮空输入;
在"输出控制"部分做了等效处理,上图中写入输出数据寄存器①的值怎么对应到 IO 引脚的输出状态②是所研究的。
开漏输出模式下 P-MOS 一直在截止状态,即不导通,所以 P-MOS 管的栅极相当于一直接 VDD。如果输出数据寄存器①的值为0,那么 IO 引脚的输出状态②为低电平,这是我们需要的控制逻辑,怎么做到的呢?是这样的,输出数据寄存器的逻辑 0 经过"输出控制"的取反操作后,输出逻辑 1 到 N-MOS 管的栅极,这时 N-MOS 管就会导通,使得 IO 引脚连接到 VSS,即输出低电平。如果输出数据寄存器的值为 1,经过"输出控制"的取反操作后,输出逻辑 0 到 N-MOS 管的栅极,这时 N-MOS 管就会截止。又因为 P-MOS管是一直截止的,使得 IO 引脚呈现高阻态,即不输出低电平,也不输出高电平。因此要 IO 引脚输出高电平就必须接上拉电阻。 又由于 F1 系列的开漏输出模式下,内部的上下拉电阻不可用,所以只能通过接芯片外部上拉电阻的方式,实现开漏输出模式下输出高电平。如果芯片外部不接上拉电阻,那么开漏输出模式下,IO 无法输出高电平。
在开漏输出模式下,施密特触发器是工作的,所以 IO 口引脚的电平状态会被采集到输入数据寄存器中,如果对输入数据寄存器进行读访问可以得到 IO 口的状态。也就是说开漏输出模式下,我们可以读取 IO 引脚状态。
特点:不能输出高电平,必须有外部(或内部)上拉才能输出高电平。
2.6 开漏式复用功能
开漏式复用功能:
++①上拉电阻关闭。++
++②下拉电阻关闭。++
++③施密特触发器打开。++
++④ P-MOS管始终不导通。++
一个 IO 口可以是通用的 IO 口功能,还可以是其他外设的特殊功能引脚,这就是 IO 口的复用功能。一个 IO 口可以是多个外设的功能引脚,我们需要选择作为其中一个外设的功能引脚。当选择复用功能时,引脚的状态是由对应的外设控制,而不是输出数据寄存器。除了复用功能外,其他的结构分析请参考开漏输出模式。另外在开漏式复用功能模式下,施密特触发器也是打开的,我们可以读取 IO 口的电平状态,同时外设可以读取 IO 口的信息。
特点:1、不能输出高电平,必须有外部(或内部)上拉才能输出高电平。2、由其他外设控制输出。
2.7 推挽输出
推挽输出模式:
++①上拉电阻关闭。
②下拉电阻关闭。
③施密特触发器打开。
④往ODR对应位写0,N-MOS管导通,写1则P-MOS管导通。++STM32 的推挽输出模式,从结果上看它会输出低电平 VSS 或者高电平VDD。推挽输出跟开漏输出不同的是,推挽输出模式 P-MOS 管和 N-MOS 管都用上。同样地,我们根据参考手册推挽模式的输出描述,根据手册描述可以把"输出控制"简单地等效为一个非门,等效原理图如下:
如果输出数据寄存器①的值为 0,经过"输出控制"取反操作后,输出逻辑 1 到 P-MOS 管的栅极,这时 P-MOS 管就会截止,同时也会输出逻辑 1 到 N-MOS 管的栅极,这时 N-MOS 管就会导通,使得 IO 引脚接到 VSS,即输出低电平。
如果输出数据寄存器的值为 1 ,经过"输出控制"取反操作后,输出逻辑 0 到 N-MOS 管的栅极,这时 N-MOS 管就会截止,同时也会输出逻辑 0 到 P-MOS 管的栅极,这时 P-MOS 管就会导通,使得 IO 引脚接到 VDD,即输出高电平。
由上述可知,推挽输出模式下,P-MOS 管和 N-MOS 管同一时间只能有一个管是导通的。当 IO 引脚在做高低电平切换时,两个管子轮流导通,一个负责灌电流,一个负责拉电流,使其负载能力和开关速度都有较大的提高。
另外在推挽输出模式下,施密特触发器也是打开的,我们可以读取 IO 口的电平状态。
由于推挽输出模式下输出高电平时,是直接连接 VDD,所以驱动能力较强,可以做电流型驱动,驱动电流最大可达 25mA,但是芯片的总电流有限,所以并不建议这样用,最好还是使用芯片外部的电源。
特点:可输出高低电平,驱动能力强。
2.8 推挽式复用功能
推挽式复用功能:
++①上拉电阻关闭。++
++②下拉电阻关闭。++
++③施密特触发器打开。++
复用功能介绍请查看开漏式复用功能,结构分析请参考推挽输出模式,这里不再赘述。
特点:1、可输出高低电平, 驱动能力强。2、由其他外设控制输出。