GPIO的介绍
GPIO基本结构
寄存器就是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,这个寄存器的每一位对应一个引脚,其中输出寄存器写1,对应的引脚输出高电平,写0,就输出低电平,输入寄存器读取为1,则对应的端口目前为高电平,读取为0,就是低电平
stm32是32位的单片机,所以stm32内部的寄存器都是32位的,但这个端口只有16位,所以这个寄存器只有低16位有对应的端口,高16位是没有用到的
驱动器是用来增加信号的驱动能力
寄存器只负责存储数据
GPIO中每一位的具体电路
为了避免引脚悬空导致的输入数据不确定,我们就需要在上面加一个上拉电阻或者下拉电阻
上拉输入可以称作是默认 为高电平的输入模式,下拉就是默认为低电平模式
施密特触发器:对输入电压进行整形,如果输入电压高于某一阈值,输出瞬间升为高电平,输入小于则输出降为低电平
模拟输入,连接到ADC,因为ADC需要接收模拟量
复用功能输入,连接到其他需要读取的外设上的(比如串口输入引脚)这根线接收的是数字量,所以在施密特触发器后面
输出部分
数字部分可以由数据寄存器或片上外设控制
位设置清除寄存器可以单独操作数据寄存的某一位,而不影响其他位
MOS管就是一种电子开关
我们的信号来控制开关的导通和关闭,开关负责降IO口接到VDD或者VSS(可以选推挽,开漏,关闭三种模式)
推挽输出模式下,P-MOS和N-MOS均有效数据寄存器为1时,上管导通,下管断开,输出直接接到VDD,就是输出高电平,数据寄存器为0时,则相反,这种模式下,高低电平均有较强的驱动力,所以推挽输出也可以叫强推输出模式,在推挽输出模式下,STM32对IO口具有绝对的控制权,高低电平由stm32说的算。
在开漏输出模式下,P-MOS是无效的,只有N-MOS工作,数据寄存器为1时,下管断开,这时输出相当于断开,也就是高阻模式,数据寄存器为0时,下管导通,输出直接接到VSS,也就是输出低电平,开漏模式可以做为通信协议的驱动模式,比如I2C通信的引脚,就是是用的开漏模式,在多机通信的情况下,这个可以避免各个设备的相互干扰,另外开漏输出可以用于输出5V的电平信号
关闭模式:当引脚配置为输入模式时候,两个MOS管都无效,端口电平由外部信号控制
GPIO的端口配置寄存器,端口可以配置成以下8种模式
配置寄存器,比如开关的通断、N-MOS,P-MOS是否有效,数据的选择等等
前三个,都是数字的输入口,都可以读取端口的高低电平 ,当引脚悬空时,上拉输入默认为高电平,下拉输入默认为低电平,浮空输入是不确定的
模拟输入,GPIO无效,引脚直接接入内部ADC,可以说是ADC模数转换器的专属配置了
开漏输出和推挽输出
区别开漏输出的高低电平不具有驱动能力,推挽输出的高低电平具有驱动能力,但此时的输入模式是有效防的(一个端口可以有多个输入只能有一个输出)
复用开漏输出和复用推挽输出
通用输出寄存器那里没有连接,引脚的控制权转移到了片上外设,由片上外设来控制,在输入部分片上外设也可以读取引脚电平 ,同时普通输入是有效的。
GPIO配置寄存器,每个端口的模式由四位进行配置,16个端口就需要64位,一个是端口配置低寄存器,一个是端口端口配置高寄存器
具体配置
GPIO的输出速度可以限制输出引脚的最大翻转速度,是为了低功耗和稳定性,我们一般配置为50HZ
高16位没有用
高16位位清除,低16韦进行位设置
端口配置锁电寄存器
可以对端口的设置进行锁定(暂时用的不多)
STM32外部的设备和电路
左边的基极给低电平就会导通,三极管就会导通,通过3.3V和GND,就可以给蜂鸣器提供驱动电流了。基极给高电平,三极管截止,蜂鸣器没有电流