一、GPIO简介
1.GPIO:通用输入输出口
2.可配置为8种输入输出模式
3.引脚电平:0-3.3V(输出最大3.3V),部分引脚可容忍5V(输入,有FT)
4.输出模式下,可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
5.输入模式下,可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
·在STM32中,所有的GPIO都是挂载在APB2外设总线上的
·每个GPIO外设有16个引脚
·寄存器是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,这样就可以完成输出电平和读取电平的功能了。寄存器的每一位对应一个引脚,其中输出寄存器写1,对应的引脚就会输出高电平,写0,就会输出低电平;输入寄存器读取为1,对应的端口目前是高电平,读取为0,就是低电平。因为STM32是32位的单片机,所以内部的寄存器都是32位的,但端口只有16位,所以这个寄存器只有低16位对应的有端口
·驱动器是用来增加信号的驱动能力
左边:寄存器;中间:驱动器;右边:某一个IO的引脚
上面:输入部分;下面:输出部分
·输入部分:
1.最右边IO引脚,接两个保护二极管,对输入电压进行限幅,如果输入电压比3.3V高,上方的二极管导通,输入电压就会直接流入VDD而不会流入内部电路;如果输入电压比0V低,下方的二极管会导通,电流会从VSS直接流出去。
2.然后连接一个上拉电阻和一个下拉电阻,上拉电阻至VDD,下拉电阻至VSS,开关是可以通过程序进行配置的。如果上面导通,下面断开,就是上拉输入模式;如果下面导通,上面断开,就是下拉输入模式;如果两个都断开,就是浮空输入模式。为了避免引脚悬空导致的输入数据不确定,需要加上拉电阻或下拉电阻,上拉输入默认为高电平输入模式,下拉默认低电平。上拉电阻和下拉电阻的阻值都是比较大的,是一种弱上拉和弱下拉,目的是不影响正常的输入操作。
3.然后是一个肖特基触发器(施密特触发器),作用是对输入电压进行整形,执行逻辑是,如果输入电压大于某一阈值,输出就会瞬间升为高电平;如果输入电压小于某一阈值,输出就会瞬间降为低电平,可以有效避免因信号波动造成的输出抖动现象。接下来经过施密特触发器整形的波形就可以直接写入输入数据寄存器了,再用程序读取输入数据寄存器对应的某一位的数据,就可以知道端口的输入电平了。
4.最后上面还有两根线路,连接到片上外设的一些端口,模拟输入连接到ADC上,接收的是模拟量,接到施密特触发器前面;复用功能输入连接到其他需要读取端口的外设上,接收的是数字量,接到施密特触发器后面。
·输出部分:
1.数字部分由输出数据寄存器或片上外设控制,两种控制方式通过数据选择器接到输出控制部分。如果选择通过输出数据寄存器进行控制,就是普通的IO口输出,写这个数据寄存器的某一位就可以操作对应的某个端口。
2.左边的位设置/清除寄存器,用来单独操作输出数据寄存器的某一位(因为输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写),如果要对某一位进行置1操作,在位设置寄存器的对应位写1即可,剩下写0,内部电路自动将输出数据寄存器中对应位置为1,写0位保持不变;如果想对某一位进行清0的操作,就在位清零寄存器的对应位写1即可。
3.接下来接到两个MOS管(一种电子开关),信号来控制开关的导通和关闭,开关负责将IO口接到VDD或VSS,可以选择推挽、开漏或关闭三种输出方式
(1)在(强)推挽输出模式下,P-MOS和N-MOS均有效,数据寄存器为1时,上管导通,下管断开,输出直接接到VDD,输出高电平;0则相反。
(2)在开漏输出模式下,P-MOS无效,数据寄存器为1时,下管断开,这时输出相当于断开,也就是高阻模式;数据寄存器为0时,下管导通,输出直接接到VSS,也就是输出低电平,这种模式下只有低电平有驱动能力,可以作为通信协议的驱动方式,在多机通信的情况下,可以避免各个设备的相互干扰;还可以用于输出5V的电平信号(在IO口外接一个上拉电阻到5V的电源,当输出低电平时,有内部的N-MOS直接接VSS,当输出高电平时,由外部的上拉电阻拉高至5V,就可以输出5V的电平信号,用于兼容一些5V电平的设备)。
(3)关闭:当引脚配置为输入模式时,两个MOS管都无效,端口的电平由外部信号来控制。