GPIO基本介绍:
- GPIO是挂载在APB2外设总线上的,每个寄存器的每一位对应一个引脚。
- STM32是32位单片机,所有其内部寄存器也是32位,但任意GPIO端口,比如GPIOA端口,只有0~15这16个引脚,而每个寄存器的每一位对应一个引脚,所以GPIO口的寄存器只有低16位对应着引脚,高16位是没有用到的。
GPIO电路结构
输入部分(GPIO口可读取端口上的外设的高低电平然后输入到CPU(软件))
- 两个保护二极管:对输入电压(IO引脚)进行限幅,
- 若输入电压比VDD高,则上方二极管导通,输入电压产生的电流将流入VDD而不会流入内部电路;
- 若输入电压比VSS低,则下方二极管导通,电流将从VSS流出,而不会从内部电路汲取电流;
- 若输入电压在VSS~VDD之间,则两个二极管均截止,此时二极管对电路无影响。
- 上拉电阻、下拉电阻:为输入默认提供一个电平(这里的电阻比较大,为弱上拉和弱下拉)
- 若上面导通,下面断开,则为上拉输入模式,则默认输入高电平;
- 若下面导通,上面断开,则为下拉输入模式,则默认输入低电平;
- 若均断开,则为浮空输入模式,受外界干扰而随机输入高低电平;
- 施密特触发器:对输入电压进行01整形处理(图中为肖特基触发器为翻译错误,应为施密特触发器)
- 设定一阈值上限,输入电压高于阈值上限时,整形输出为高电平;
- 设定一阈值下限,输入电压低于阈值下限时,整形输出为低电平;
- 将数据写入 输入数据寄存器
输出部分(可在程序中设置高低电平,然后输出给实物芯片)
- 输出数据:
- 输出由输出数据寄存器、片上外设控制,两者通过数据选择器连接到输出控制部分
- 若是输出数据寄存器控制,则为普通的IO口输出,同时控制16个引脚,只能整体读写,在此基础上,若想单独操作一位,那可以用按位与、按位或的方式;
- 位设置/清除寄存器:直接单独操作输出数据寄存器的某一位,而不影响其他位。
- P-MOS、N-MOS管:
推挽模式:P-MOS和N-MOS均有效,高低电平均有强驱动能力。
- 数据寄存器为1时,上管导通,下管断开,输出接VDD,输出高电平;
- 数据寄存器为0时,上管断开,下管导通,输出接VSS,输出低电平;
开漏输出模式:P-MOS无效,N-MOS有效,只有低电平有驱动能力。
- 数据寄存器为1时,下管断开,此时输出相当于断开,即高阻模式;
- 数据寄存器为1时,下管导通,此时输出接VSS,输出低电平;
- 可以作为通信协议的驱动方式,比如I2C通信的引脚,在多机通信情况下,该模式可以避免各个设备之间的干扰。
- 可以用于输出5V的电平信号,比如在IO口外接一个上拉电阻到5V的电源,输出低电平时,内部N-MOS接VSS;输出高电平时,由外部的上拉电阻拉高到5V。
关闭模式:两个MOS均无效,即输出关闭,端口的电平由外部信号控制。
GPIO的八种工作模式
通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式
模式名称称 | 输出性质 | 特征功能介绍 |
浮空输入 | 数字输入 | 软件可读取引脚电平,若引脚悬空,则电平不确定 |
上拉输入 | 数字输入 | 软件可读取引脚电平,内部连接上拉电阻,悬空时外设默认设置为高电平 |
下拉输入 | 数字输入 | 软件可读取引脚电平,内部连接下拉电阻,悬空时外设默认设置为低电平 |
模拟输入 | 模拟输入 | GPIO无效,引脚直接接入内部ADC |
开漏输出 | 数字输出 | 可软件输出引脚电平,高电平为高阻态,低电平接VSS |
推挽输出 | 数字输出 | 可软件输出引脚电平,高电平接VDD,低电平接VSS |
复用开漏输出 | 数字输出 | 由片上外设控制,高电平为高阻态,低电平接VSS |
复用推挽输出 | 数字输出 | 由片上外设控制,高电平接VDD,低电平接VSS |
阅读芯片手册
- 一个GPIO端口里,只有低16位有对应的16个引脚,高16位没有用到。
- 高16位进行位清除(BR),低16位进行位设置(BS),写1则为清除或设置,写0则为无影响。
- 这个清除寄存器跟上面那个一样,只是是低16位起清除作用,而上面那个是高16位起清除作用。
- 如果只想单一的进行位清除和位设置,那可以设置用上面的,清除用下面的,这样比较方便,因为都是对低16位进行操作。
- 如果想对多个端口同时进行位设置和位清除,那用上面的,这样可以保证位设置和位清楚的同步性。