GPIO(General Purpose Input Output)简介
- GPIO(General Purpose Input Output)通用输入输出口
可配置为8种输入输出模式 - 引脚电平:0V~3.3V,部分引脚可容忍5V
- 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
- 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
GPIO基本结构
每个GPIO都有16个引脚(0~15)
内核可以通过APB2对寄存器读写,可以完成输出电平和读取电平的功能
输出寄存器写1,对应引脚就会输出高电平,写0,就输出低电平
输入寄存器读取为1,就证明对应的端口目前是高电平,读取为0,就是低电平
GPIO位结构
1.上拉和下拉输入模式:
提供一个默认的输入电平,对与一个数字的端口,不是高电平就是低电平。如果输入什么都不接,那么输入就会处于一种浮空的状态(极易被改变状态),引脚的输入电平极易收到外界干扰而改变。
上拉输入模式:默认高电平输入模式
下拉输入模式:默认低电平输入模式
2.施密特触发器:
对电压进行整形,可以有效避免因信号波动造成的输出抖动的现象;如果输入电压大于 某一阈值,输出就会升为高电平,如果输入电压小于某一阈值,输出就会瞬间将为低电平
3.推挽、开漏、关闭
- 推挽:P-MOS和N-MOS均有效。数据寄存器为1,上管导通,下管断开,输出直接接到VDD,输出高电平;数据寄存器为0,上管断开,下管导通,输出直接接到VSS,就是输出低电平。 这种模式下,高低电平均有较强的驱动能力,所以推挽输出模式也叫强推输出模式,在该模式下,STM32对IO口有绝对的控制权,高低电平都是由STM32说了算。
- 开漏:P-MOS输出无效,只有N-MOS在工作。数据寄存器位1,下管断开,这时输出相当于断开,也就是高阻模式;数据寄存器为0时下管导通,输出直接接到VSS,也即是输出低电平。 这种模式下只有低电平有驱动能力,高电平时没有驱动能力的。开漏模式可以作为通信协议的驱动方式,多机通信的情况下,该模式可以避免各个设备的相互干扰。也可输出5V电平信号
- 关闭:引脚配置为输入模式,两个MOS管均无效,也就是输出关闭,端口的电平由外部信号来控制
4.如果通过输出数据寄存器进行控制,就是普通的IO口输出,
写数据寄存器的某一位就可以操作某个端口
5.位设置/清除寄存器,可以单独输出数据寄存器的某一位,而不影响其他位
GPIO模式
-
上拉、下拉、浮空输入结构
-
模拟输入
-
开漏、推挽输出
一个 端口只能有一个输出,但可以有多个输入 -
复用开漏、推挽
高电平弱驱动,低电平强驱动(一般单片机)
操作STM32的GPIO一共需要3个步骤:
- 使用RCC开启GPIO时钟(最常用 RCC_AGB, RCC_APB2, RCC_APB1)
- 使用GPIO_init函数初始化时钟
- 使用输入或输出的函数控制GPIO口
GPIO_Mode_AIN(Analog IN) 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD(In Pull Down) 下拉输入
GPIO_Mode_IPU(In Pull Up) 上拉输入
GPIO_Mode_Out_OD(Out Open Drain) 开漏输入
GPIO_Mode_Out_PP(Out Push Pull) 推挽输出
GPIO_Mode_AF_OD(Atl Open Drain) 复用开漏
GPIO_Mode_AF_PP(Alt Push Pull) 复用推挽
(他用推挽输出,但我没理解是啥意思)
(这里气死我了,这个板子要超大力的摁在面包板上,才有反应)
推挽输出高低电平都有驱动能力
开漏输出仅有低电平由驱动能力