•GPIO(General Purpose Input Output)通用输入输出口
•可配置为8种输入输出模式
•引脚电平:0V~3.3V,部分引脚可容忍5V,具体看引脚定义图中I/O电平为F/T的可以容忍5V电压
•输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等,如果需要控制功率较大的设备只需要再加入驱动电路即可控制。可以模拟IIC或SPI通信协议的输出时序部分。
•输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
GPIO基本结构:
左边为APB2外设总线,可以对寄存器进行读写,寄存器中的每一位对应每一个引脚,输出寄存器为1输出高电平,为0,输出低电平。输入寄存器读取为1则对应的端口是高电平,读取为0就是低电平。寄存器为32位,而引脚为16位,寄存器的低16位对应每一个引脚,高16位没有用到。驱动器增加信号驱动能力。
GPIO位结构
1.输入模式:
如下图所示,最右边的I/O引脚的上下保护二极管是对输入电压进行限幅。VDD接通3.3V,VSS接0V,如果输入电压比3.3V高的话,上方二极管导通,电压不流进内部电路,避免过高的电压对内部产生伤害,如果输入负电压,(因为是VSS所以会产生负电压)那么下方二极管导通,电路会从VSS流出去。而不会从内部汲取电流,保护内部电路。往左边是两个VDD和VSS开/关,这是配置输入模式用的,如果上面导通,下面断开就是上拉输入模式,下拉输入模式同理,如果两个都断开为浮空输入模式。上拉输入模式表示当引脚啥都没接的时候默认输入为高电平,下拉输入模式同理表示为默认为低电平,当浮空状态时输入引脚极容易受外界干扰,而改变,通常不使用浮空输入模式,需要配置为上拉或下拉输入模式。
2.施密特触发器
对输入电压进行整形,如果输入电压大于某一阈值,则输出高电平,低于某一阈值输出低电平。在这一阈值内无电压跳变。在输入电压不稳定或有干扰时发挥作用。
3.片上外设
模拟输入和复用功能输入,模拟输入,模拟输入将输入的数字量转化为模拟量,复用功能输入接收数字量连接到其他需要读取端口的外设上(例如串口输入引脚)。
4.输出控制
输出可以用输出数据寄存器和片上外设进行控制,如果通过输出数据寄存器进行控制,就是普通的I/O输出,操作输出数据寄存器的某一位就能控制某一引脚。位设置/清除寄存器可以单独操作输出 数据寄存器的某一位,而不影响其他位。
16位输出数据寄存器只能整体读写,(具体的寄存器控制参考STM32手册),由于大多数控制只需要控制某一位,这里提供三种方式:
1.读出输出数据寄存器数据,进行按位与或按位或的方式操作更改某一位再将数据写回去
2.设置位设置/清除寄存器(高16位进行位清除,低16位进行位设置),在位设置/清除寄存器对应位写1就可以,写1就是设置/清除,写0不产生影响。如果对同步性没有要求可以配合端口位清除寄存器使用(端口位清除寄存器控制低16位可以对端口进行位清除)最后可以通过端口配置锁定寄存器可以对端口配置进行锁定,防止意外更改。
3.读写位带区域,“位带”区域就是映射RAM和外设寄存器的所有位,跟寻址相似。
三种输出方式:
推挽:也成为强推输出模式,P-MOS和N-MOS都有效,高电平导通P-MOS,低电平导通N-MOS
开漏:P-MOS无效,输出数据寄存器为1时,输出为高阻模式,数据寄存器为0时输出为低电平。可作为通信模式的引脚,例如IIC,还可以输出5V的电平信号(I/O口和保护二极管中间外接一个上拉5V电源)可兼容需要5V电平信号的设备。
关闭:P-MOS和N-MOS都无效,端口的电平由外部设备控制。
GPIO8种模式
输入模式下,输出功能为断开状态。
模拟输入内部电路从引脚直接接入片上外设。
在输出模式下输入是有效的,在输出时候,可以顺便输入。
复用开漏和推挽输出都是由片上外设进行控制。
简单控制二极管和蜂鸣器电路:
LED:发光二极管,正向通电点亮,反向通电不亮
有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定
无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音
左图1,PA0输出低电平时候,LED1点亮。
左图2,PA0输出高电平时候,LED1点亮。
通常看高低电平的驱动能力,通常使用第一种接法,因为单片机通常是高电平弱驱动,低电平强驱动的规则。
蜂鸣器采用三极管驱动电路,蜂鸣器功率较大,直接用I/O驱动会导致STM32负担过重。
如右图1三极管左边是基极,带箭头位发射极,剩下的是集电极。基极给低电平,三极管就会导通,基极给高电平,三极管截止。
右图2的逻辑是相反的,基极给高电平,三极管导通,低电平三极管断开
注意:PNP三极管最好接在上面,NPN最好接在下面。因为三极管的通断,需要在发射极和基极产生开启电压。