·GPIO(General Purpose Input Output)通用输入输出口

·可配置为8种输入输出模式

·引脚电平: 0v~3.3v,部分引脚可容忍5v

·输出模式下可控制端口输出高低电平,用以驱动LED,控制蜂鸣器,模拟通信协议输出时序等

·输入模式下可读取端口的高低电平或电压,用于读取按键输入,外接模拟电平信号输入,ADC电压采集,模拟通信协议接受数据等

  STM32是32位的单片机,其内部的寄存器都是32位的,而端口只有16位,所以这个寄存器只有低16位对应的有端口,高16位是没有用到的。驱动器是用来增加信号的驱动能力的,寄存器只负责存储数据。

GPIO位结构(以下叙述全部基于这个结构图)

输入部分

          可通过程序配置选择上拉电阻或下拉电阻

         如果什么都不接,此时输入就会处于一种浮空的状态,引脚的输入电平极易受外界干扰而改变,为了避免引脚悬空导致的输入数据不确定,需要加上上拉或下拉电阻。如果接入上拉电阻,当引脚悬空时,还有上拉电阻来保证引脚的高电平。

上拉输入上面导通,下面断开,默认为高电平的输入模式,即低电平有效视为 输入。

下拉输入:下面导通,上面断开,默认为低电平的输入模式,即高电平有效视为 输入。

肖特基触发器(施密特触发器)

        引脚的波形是由外界输入的,虽然是数字信号,但实际情况下可能会产生各种失真。低于下限输出低电平,高于上限输出高电平,直到下一次低于下限才输出低电平。

        作用:对输入电压进行整形。如果输入电压大于某一阈值,输出就会瞬间升为高电平;如果输入电压小于某一阈值,输出就会瞬间降为低电平。

        经过施密特触发器整形的波形就可以直接写入输入数据寄存器了,再用程序读取输入数据寄存器对应的某一位的数据,就可以知道端口的输入电平了。

片上外设:

        模拟输入:连接到ADC上,ADC需要接受模拟量,所以接到施密特触发器前。

        复用功能输入:连接到其他需要读取端口的外设上的,比如串口的输入引脚等,这根线接受的是数字量,所以在施密特触发器后面。

输出部分

        数字部分可以由输出数据寄存器或片上外设控制,两种控制方式通过数据选择器接到输出控制部分。

        如果选择通过输出数据寄存器进行控制,就是普通的IO口输出,写这个数据寄存器的某一位就可以操作对应的某个端口(其中的“位设置/清除寄存器”可以用来单独操作输出数据寄存器的某一位,而不影响其他位),因为这个输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写,所以想单独控制其中某一个端口而不影响其他端口,就需要一些特殊的操作方式。

第一种方式是先读出这个寄存器,然后用按位与(&=)和按位或(|=)更改某一位,最后再将更改后的数据写回去。(麻烦且效率不高,对于IO口的操作而言不太合适)

第二种方式是通过设置“位设置/清除寄存器”(库函数),如果我们要对某一位进行置1的操作,在位设置寄存器的对应位写1即可,剩下不需要操作的写0;如果我们要对某一位进行清0的操作,在位清除寄存器的对应位写1即可。

第三种方式是位带(相当于位寻址),在STM32中,专门分配的有一段地址区域,这段地址映射了RAM和外设寄存器所有的位,读写这段地址中的数据,就相当于读写所映射位置的某一位。

        输出控制之后接到两个MOS管,上面是P-MOS,下面是N-MOS。(这个MOS管就是一种电子开关,我们的信号来控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS)在这里,可以选择推挽,开漏或关闭三种输出方式。

        推挽输出模式下,P-MOS和N-MOS均有效。数据寄存器为1时,上管导通,下管断开,输出直接接到VDD,输出高电平;数据寄存器为0时,上管断开,下管导通,输出直接接到VSS,输出低电平。这种模式下,高低电平均有较强的驱动能力,所以推挽输出也可以叫强推输出模式。在推挽输出模式下,STM32对IO口具有绝对的控制权,高低电平都由STM32说的算。

        开漏输出模式下,这个P-MOS是无效的,只有N-MOS在工作。数据寄存器为1时,下管断开,这时输出相当于断开,也就是高阻态模式;数据寄存器为0时,下管导通,输出直接接到VSS,也就是输出低电平。这种模式下,只有低电平有驱动能力,高电平是没有驱动能力的。这个开漏模式可以作为通信协议的驱动方式,比如I2C通信的引脚,这个模式可以避免各个设备的相互干扰。此外,开漏模式还可以用于输出5v的电平信号,比如在IO口外接一个上拉电阻到5v的电源,当输出低电平时,由内部的N-MOS直接接VSS;当输出高电平时,由外部的上拉电阻拉高至5v,这样就可以输出5v的电平信号,用于兼容一些5v电平的设备。

        关闭输出模式,这个是当引脚配置为输入模式的时候,这两个MOS管都无效,也就是输出关闭,端口的电平由外部信号来控制

GPIO模式

注意:
        浮空输入的电平是不确定的,所以在使用浮空输入时,端口一定要接上一个连续的驱动源,不能出现悬空的状态。

        如上图,在输入模式下,输出驱动器是断开的,端口只能输入而不能输出。上面两个电阻可以选择为上拉工作(上拉输入),下拉工作(下拉输入)或者都不工作(浮空输入)。然后输入通过施密特触发器进行波形整形后,连接到输入数据寄存器。

        值得注意的是,右侧输入保护这里,上面写的是VDD或者VDD_FT,这就是3.3v端口和容忍5v端口的区别。下面的注释中也提到,VDD_FT对5v容忍IO脚是特殊的,它与VDD不同的。这个容忍5v的引脚,它的上边保护二极管要做一下处理,不然直接接VDD3.3v的话,外部再接入5v的电压就会导致上边二极管开启,并且产生比较大的电流,这个是不太妥当的。

模拟输入:特征是GPIO无效,引脚直接接入内部ADC。

模拟输入可以作为ADC模数转换器的专属配置。

        如上图,输出驱动器是断开的,输入的施密特触发器也是关闭的无效状态。那么只有一条线有效,就是从引脚直接接入片上外设,也就是ADC。所以当我们使用ADC时,将引脚配置为模拟输入就行了,其他时候,一般用不到模拟输入。

        开漏输出和推挽输出,这两个电路结构基本一样,都是数字输出端口,可以用于输出高低电平。区别就是开漏输出的高电平呈现的是高阻态,没有驱动能力,而推挽输出的高低电平都是具有驱动能力的。

        如上图,输出是由输出数据寄存器控制的,P-MOS如果无效,就是开漏输出;P-MOS和N-MOS都有效,就是推挽输出。此外,在输出模式下,输入也是有效的,而之前在输入模式下,输出都是无效的,这是因为,一个端口只能有一个输出,但可以有多个输入。

        如上图,输出控制没有连接输出数据寄存器,引脚的控制权转移到了片上外设。在输入部分,片上外设也可以读取引脚的电平,同时普通的输入也是有效的,顺便接收一下电平信号。

        其实在GPIO的这八种模式中,除了模拟输入这个模式会关闭数字的输入功能,在其他的七个模式中,所有的输入都是有效的。

作者:Raider.

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 GPIO入门指南

发表评论