- I/O位结构
从左至右分别是:寄存器、驱动器、IO口的引脚
1、整体的结构可以分为两个部分,上面是输入部分,下面是输出部分。
2、先看输入部分,首先是I/O引脚,这里接了两个保护二极管,这个是对输入电压进行限幅的,上面的保护二极管接VDD(3.3V),下面的保护二极管接VSS(0V)。如果输入电压比3.3V高,上面的保护二极管就会导通,输入电压产生的电流就会直接流入VDD而不会流入内部电路,这样就可以避免过高的电压对内部电路产生伤害。如果输入电压比0V还要低,这个电压是相对于VSS的电压,所以是可以有负电压的,那这时下面这个保护二极管就会导通,电流会从VSS直接流出去,而不会从内部电路汲取电流,也是可以保护内部电路的。如果输入电压在0~3.3V之间,两个保护二极管均不会导通,这时二极管对电路没有影响,这就是保护二极管的用途。
3、这里连接了一个上拉电阻和一个下拉电阻,上拉电阻置VDD,下拉电阻置VSS,这个开关是可以通过程序进行配置的。如果上面导通,下面断开,就是上拉输入模式;如果下面导通,上面断开,就是下拉输入模式;如果两个都断开,就是浮空输入模式。
上拉和下拉的作用是为了给输入提供一个默认的输入电平的,因为对于一个数字的端口,输入不是高电平就是低电平,如果输入引脚什么都不接,这是输入就会处于一种浮空的状态,引脚的输入电平极易受外界的干扰而改变,为了避免引脚悬空导致的输入数据不确定,我们就需要在这里加上一个上拉电阻或下拉电阻了。如果接入上拉电阻,当引脚悬空时,还有上拉电阻来保证引脚的高电平,所以上拉输入又可以称作为默认为高电平的输入模式;下拉也是同理,就是默认为低电平的输入模式。这个上拉电阻和下拉电阻的阻值都是比较大的,是一种弱上拉和弱下拉,目的是尽量不影响正常的输入操作。
4、这里是一个肖特基触发器(施密特触发器), 这个施密特触发器的作用就是对输入电压进行整形的,它的执行逻辑是,如果输入电压大于某一阈值,输出就会瞬间升为高电平,如果输入电压小于某一阈值,输出就会瞬间降为低电平。因为这个引脚的波形是外界输入的, 虽然是数字信号,实际情况下可能会产生各种失真。如果没有施密特触发器,那很有可能因为干扰而导致误判。如果有了施密特触发器,定了如图所示的阈值上限和下限,高于上限输出高,低于下限输出低,这样下图波形的施密特触发器的输出就是,首先是低于下限,输出低;然后在点2高于上限,输出立即变为高;虽然后面信号波动再次低于上限,但是对于施密特触发器来说,只有高于上限或者低于下限,输出才会改变,所以此时低于上限的情况,输出并不会变化,而是继续维持高电平,然后直到下次低于下限时,才会转为低电平。高于下限的情况也是如此,维持稳定输出,直到下次高于上限,输出才会变成高,这就是施密特触发器的输出信号,相比较输入信号,经过整形的信号就很完美了。施密特触发器可以有效避免因信号波动造成的输出抖动现象。
5、经过施密特触发器整形的波形就可以直接写入输入数据寄存器了,我们再用程序读取输入数据寄存器对应的某一位的数据,就可以知道端口的输入电平了。
6、上面的两路线路,这些就是连接到片上外设的一些端口,其中有模拟输入,这个是连接到ADC上的,因为ADC需要接收模拟量,所以这根线是接到施密特触发器前面的。另一个是复用功能输入,这个是连接到其他需要读取端口的外设上的,比如串口的输入引脚等,这根线接收的是数字量,所以在施密特触发器后面。
7、再看输出部分, 数字部分可以由输出数据寄存器或片上外设控制,两种控制方式通过这个数据选择器接到了输出控制部分,如果选择通过输出数据寄存器进行控制,就是普通的I/O口输出,写这个数据寄存器的某一位就可以操作对应的某个端口了。左边的位设置/清除寄存器,这个可以用来单独操作输出数据寄存器的某一位,而不影响其它位,因为这个输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写,所以如果想单独控制其中某一个端口而不影响其他端口的话,就需要一些特殊的操作方式。第一种方式是先读出这个寄存器,然后用按位与和按位或的方式更改某一位,最后再将更改后的数据写回,在C语言中就是&=和|=的操作。这种方法比较麻烦,效率不高,对于IO口的操作而言不太合适。第二种方式是通过设置这个位设置和位清除寄存器,如果我们要对某一位进行置1的操作,在位设置寄存器的对应位写1即可,剩下不需要操作的位写0,这样它的内部就会有电路自动将输出数据寄存器中对应位置为1,而剩下写0的位则保持不变,这样就保证了只操作其中一位而不影响其它位,并且这是一步到位的操作。如果想对某一位进行清0的操作,就在位清除寄存器的对应位写1即可,这样内部电路就会把这一位清0了,这也是位设置位清除寄存器的作用。第三种操作方式就是读写STM32中的“位带”区域,在STM32中专门分配的有一段地址区域,这段地址区域映射了RAM和外设存储器所有的位,读写这段地址中的数据,就相当于读写所映射位置的某一位,这就是位带的操作方式。
高16位进行位清除,低16位进行位设置,写1就是设置或者清除,写0就是不产生影响。
这个和上面的寄存器的高16位的功能是一样的,是为了方便操作设置的,如果你只想进行单一的位设置或者位清除,那么位设置时用上面的寄存器,位清除用这个寄存器,在设置和清除时,使用的都是低16位的数据,这样就方便一些。如果想对多个端口同时进行位设置和位清除,那使用上面的寄存器,可以保证位设置和位清除的同步性。
8、接下来输出控制之后就接到了两个MOS管,上面是P-MOS,下面是N-MOS,这个MOS管就是一种电子开关,我们的信号来控制开关的导通和关闭,开关负责将I/O口接到VDD或者VSS。在这里可以选择推挽、开漏或者关闭三种输出方式。
在推挽输出模式下,P-MOS和N-NOS均有效,数据寄存器为1时,上管导通,下管断开,输出直接接到VDD,就是输出高电平;当输出寄存器为0时,上管断开,下管导通,输出直接接到VSS,就是输出低电平。这种模式下,高低电平均有较强的驱动能力,所以推挽输出模式也可以叫强推输出模式,在推挽输出模式下,STM32对I/O口具有绝对的控制权,高低电平都由STM32说的算。
在开漏输出模式下,这个P-MOS是无效的,只有N-MOS在工作,数据寄存器为1时,下管断开,这时输出相当于断开,就是高阻模式;数据寄存器为0时,下管导通,输出直接接到VSS,也就是输出低电平。这种模式下,只有低电平有驱动能力,高电平是没有驱动能力的,这个开漏模式可以作为通信协议的驱动方式,比如I2C通信的引脚,就是使用的开漏模式。在多机通信的情况下,这个模式可以避免各个设备的相互干扰。另外开漏模式还可以用于输出5V的电平信号,比如在I/O口外接一个上拉电阻到5V的电源,当输出低电平时,由内部的N-MOS直接接VSS,当输出高电平时,由外部的上拉电阻拉至5V,这样就可以输出5V的电平信号,用于兼容一些5V电平的设备,这就是开漏输出的主要用途。
关闭是当引脚配置为输入模式时,这两个MOS管都无效,也就是输出关闭,端口的电平由外部信号来控制。 -
GPIO的8种模式
ADC使用模拟输入,其他时候一般用不到模拟输入。
02GPIO输入输出
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- STM32F103ZET6 一共有7组IO口(有FT的标识是可以识别5v的) 每组IO口有16个IO 一共16*7...
- GPIO 是通用输入输出端口的简称,简单来说就是STM32 可控制的引脚,STM32 芯片的GPIO 引脚与外部设...
- 前言 本系列文章统一围绕STM32F103C8T6最小系统开发板进行记录,如涉及其他开发板将会特别说明。 GPIO...