目录
0. 《STM32单片机自学教程》专栏
14.1 GPIO基本结构
14.1.1 保护二极管
14.1.2 上拉、下拉电阻
14.1.3 施密特触发器
14.1.4 P-MOS 管和 N-MOS 管
14.1.5 输出数据寄存器
14.1.6 输入数据寄存器
14.2 GPIO工作模式
14.2.1 输入模式
14.2.1.1 输入浮空模式
14.2.1.2 输入上拉模式
14.2.1.3 输入下拉模式
14.2.1.4 模拟输入模式
14.2.2 输出模式
14.2.2.1 推挽输出模式
14.2.2.2 开漏输出模式
0. 《STM32单片机自学教程》专栏
本文作为专栏《STM32单片机自学教程》专栏其中的一部分,返回专栏总纲,阅读所有文章,点击Link:
STM32单片机自学教程-[目录总纲]_stm32 学习-CSDN博客
从本章开始我们就要开始外设等相关模块的介绍。 我们首先要介绍的就是GPIO,因为我认为GPIO是最基础也是最重要的一个外设功能。那么后续针对每一个外设,我们大致都会从下面几个部分进行讲解:
1.硬件结构及原理
2.相关寄存器
3.相关库函数
4.实例练习
14.1 GPIO基本结构
GPIO 有八种工作模式,为讲清楚这些模式的实现原理,我们需要先讲解GPIO的基本结构,总的框图如图14.1-1所示。右边I/O 引脚就是我们可以看到的芯片实物的引脚,其余部分均为GPIO 的内部结构。
图14.1-1 GPIO的基本结构图
14.1.1 保护二极管
引脚的两个保护二级管可以防止引脚外部过高或过低的电压输入,当引脚电压高于VDD 时,上方的二极管导通,当引脚电压低于 VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。 虽然有二极管的保护,但这样的保护却很有限,大电压大电流的接入很容易烧坏芯片。
14.1.2 上拉、下拉电阻
上下拉电阻的阻值大概在30~50K欧之间,可以通过上、下两个对应的寄存器控制开关。当引脚外部的器件没有干扰引脚的电压时,即没有外部的上、下拉电压,引脚的电平由引脚内部上、下拉决定。内部上拉电阻工作时引脚电平为高电平,内部下拉电阻工作时,则引脚电平为低电平。如果内部上、下拉电阻都不开启,这种情况就是浮空模式。浮空模式下引脚的电平是不可确定的。引脚的电平可以由外部的上、下拉电平决定。由于上下拉电阻的阻值较大,STM32的内部上拉是一种“弱上拉”,这样的上拉电流很弱,如果有要求大电流还是得外部上拉。
14.1.3 施密特触发器
图中的TTL肖特基触发器即为施密特触发器,当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变。也就是说输出由高电平翻转为低电平,或是由低电平翻转为高电电平对应的阈值电压是不同的。只有当输入电压发生足够的变化时,输出才会变化,因此将这种元件命名为触发器。这种双阈值动作被称为迟滞现象。我们软件开发种经常用到“滞环调节”,是一个道理,一个经常的应用场景是防止在边界附件来回震荡。施密特触发器可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波信号。
14.1.4 P-MOS 管和 N-MOS 管
这种双MOS管结构,主要控制GPIO的开漏输出和推挽输出两种模式。这里我们只用记住,PMOS输入低电平时导通,NMOS输入高电平时导通即可。详细内容,后面还会介绍。
14.1.5 输出数据寄存器
刚到的双MOS管结构电路的输入信号,是由GPIO“输出数据寄存器GPIOx_ODR”提供的,因此我们通过修改输出数据寄存器的值就可以修改GPIO引脚的输出电平。也可以通过“置位/复位寄存器GPIOx_BSRR”修改输出数据寄存器的值,来控制电路的输出。
14.1.6 输入数据寄存器
GPIO引脚经过内部的上、下拉电阻,可以配置成上/下拉输入,然后再连接到施密特触发器,信号经过触发器后,模拟信号转化为0、1的数字信号,然后存储在“输入数据寄存器GPIOx_IDR”中,通过读取该寄存器就可以了解GPIO引脚的电平状态。
14.2 GPIO工作模式
GPIO有八种工作模式,分别如下,我们分输入,输出和复用功能3个大类进行描述。
1、输入浮空
2、输入上拉
3、输入下拉
4、模拟输入
5、开漏输出
6、推挽输出
7、开漏式复用功能
8、推挽式复用功能
14.2.1 输入模式
在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器GPIOx_IDR读取I/O状态。其中输入模式,可设置为上拉、下拉、浮空和模拟输入四种。
14.2.1.1 输入浮空模式
上拉/下拉电阻为断开状态,施密特触发器打开,输出被禁止。输入浮空模式下,IO口的电平完全是由外部电路决定。如果IO引脚没有连接其他的设备,那么检测其输入电平是不确定的。该模式通常用于按键检测等场景。
图14.2-1 输入浮空模式
14.2.1.2 输入上拉模式
上拉电阻导通,施密特触发器打开,输出被禁止。在需要外部上拉电阻的时候,可以使用内部上拉电阻,这样可以节省一个外部电阻,但是内部上拉电阻的阻值较大,所以只是“弱上拉”,不适合做电流型驱动。
图14.2-2 输入上拉模式
14.2.1.3 输入下拉模式
下拉电阻导通,施密特触发器打开,输出被禁止。在需要外部下拉电阻的时候,可以使用内部下拉电阻,这样可以节省一个外部电阻,但是内部下拉电阻的阻值较大,所以不适合做电流型驱动。
图14.2-3 输入上拉模式
14.2.1.4 模拟输入模式
此模式下上下拉电阻断开,施密特触发器关闭,双 MOS 管也关闭。其他外设可以通过模拟通道输入输出。该模式下需要用到芯片内部的模拟电路单元单元,用于ADC/DAC等操作模拟信号的外设。
当GPIO引脚用于ADC采集电压的输入通道时,用作“模拟输入”功能,此时信号是不经过施密特触发器的,因为经过施密特触发器后信号只有0、1两种状态,所以ADC外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。同样,当GPIO引脚用于DAC作为模拟电压输出通道时,此时作为“模拟输出”功能,DAC的模拟信号输出就不经过双MOS管结构,模拟信号直接输出到引脚。
图14.2-4 模拟输入模式
14.2.2 输出模式
输出模式主要是由双MOS管的开闭控制来实现的,画了一个示意图,如图14.2-5所示。在输出模式中,推挽模式时双MOS管以轮流方式工作,输出数据寄存器GPIOx_ODR可控制I/O输出高低电平。开漏模式时,只有N-MOS管工作,输出数据寄存器可控制I/O输出高阻态或低电平。输出速度可配置,有2MHz\10MHz\50MHz的选项。此处的输出速度即I/O支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。
在输出模式时施密特触发器是打开的,即可通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。
下面我们分别进行介绍。
图14.2-5 输出模式控制示意图
14.2.2.1 推挽输出模式
图14.2-6 推挽模式等效电路
推挽输出模式,是根据这两个MOS管的工作方式来命名的。在该结构中输入高电平时,经过反向后,上方的P-MOS导通,下方的N-MOS关闭,对外输出高电平;而在该结构中输入低电平时,经过反向后,N-MOS管导通,P-MOS关闭,对外输出低电平。当引脚高低电平切换时,两个管子轮流导通,PMOS管负责灌电流-“推”,NMOS管负责拉电流-“挽”,使其负载能力和开关速度都比普通的方式有很大的提高。推挽输出的低电平为0伏,高电平为3.3伏,如上图所示推挽输出模式时的等效电路。
由于推挽输出模式下输出高电平时,是直接连接 V DD ,所以驱动能力较强,可以做电流型驱动,驱动电流最大可达 25mA,但是芯片的总电流有限,所以并不建议这样用,最好还是使用芯片外部的电源。
14.2.2.2 开漏输出模式
图14.2-7 开漏输出等效电路
在开漏输出模式时,上方的P-MOS管完全不工作。如果我们控制输出为0低电平,N-MOS管导通,使输出接地,若控制输出为1(它无法直接输出高电平)时,则P-MOS管和N-MOS管都关闭,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须外部接上拉电阻,等效电路如上图。它具有“线与”特性,也就是说,若有很多个开漏模式引脚连接到一起时,只有当所有引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当于短路接地,使得整条线路都为低电平0。
那么开漏输出模式的应用场景是什么的?总结下来主要有2个:
1.电平不匹配的场合
STM32输出的高电平是3.3V,如果外部需要更高或者更低的电压,那么推挽输出就不合适了。此时就可以在外部接一个上拉电阻,上拉电源为外部需要的电压,如5V,并且把GPIO设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5伏的电平,输出低电平时则输出低电平0V,如图14.2-8。
图14.2-8 开漏模式输出5V电压
2.需要“线与”功能的总线电路
如 I2C通讯等需要“线与”功能的总线电路中一般要用开漏模式。多个控制器全部输入1高阻态时则为1,只要有一个为低电平,那么整个电路就是0.此时推挽输出模式就不可以了,因为有的控制器输入1,PMOS导通,有的控制器输入0,NMOS导通,此时双MOS管都存在导通的情况,直接就短路了。
未完待续.....
参考资料:
【1】哔站江协科技STM32入门教程
【2】《STM32单片机原理与项目实战》刘龙、高照玲、田华著
【3】《ARM Cortex-M3嵌入式原理及应用》黄可亚著
【4】《STM32嵌入式微控制器快速上手》陈志旺著
【5】《STM32单片机应用与全案例实践》沈红卫等著
【6】《野火STM32开发指南》
【7】《正点原子STM32开发指南》