STM32 GPIO介绍
基本介绍GPIO(General Purpose Input Output)通用输入输出口
-
GPIO(General Purpose Input Output)通用输入输出口
-
可配置为8种输入输出模式
-
引脚电平:0V~3.3V,部分引脚可容忍5V
-
输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
-
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。
根据数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。8种输出模式详解
浮空输入 GPIO_Mode_IN_FLOATING = 0x04, 输入用,完全浮空,状态不定。
上下拉电阻关闭,施密特触发器打开,模拟输入关闭,双MOS管不导通。空闲时 (高阻态),IO状态不稳定,由外部环境决定。
浮空输入模式下,
I/O
端口的电平信号直接进入输入数据寄存器。也就是说,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的,通常用于IIC
、USART
等总线设备上。应用场景:接收外部信号的状态,如按键输入、传感器输入等。
上拉输入 GPIO_Mode_IPU = 0x48, 输入用,用内部上拉,默认为高电平。
使用上拉电阻,下拉电阻关闭,施密特触发器打开,模拟输入关闭,MOS管不导 通。空闲时,IO呈现高电平。
STM32的内部上拉是"弱上拉",即通过此上拉输出的电流是很弱的,如要求大电流还是需要外部上拉。
上拉输入模式下,I/O
端口的电平信号直接进入输入数据寄存器。但是在I/O
端口悬空(在无信号输入)的情况下,输入端的电平保持在高电平(并且在I/O
端口输入为低电平的时候,输入端的电平也是低电平)。
应用场景:检测外部信号为低电平时,例如按键按下。
下拉输入 GPIO_Mode_IPD = 0x28, 输入用,用内部下拉,默认为低电平。
使用下拉电阻,上拉电阻关闭,施密特触发器打开,模拟输入关闭,MOS管不导 通。空闲时,IO呈现低电平。
下拉输入模式下,I/O
端口的电平信号直接进入输入数据寄存器。但是在I/O
端口悬空(在无信号输入)的情况下,输入端的电平保持在低电平;并且在I/O端口输入为高电平的时候,输入端的电平也是高电平。
应用场景:检测外部信号为高电平时,例如按键抬起。
模拟输入 GPIO_Mode_AIN = 0x0, ADC/DAC
上下拉电阻关闭,施密特触发器关闭,模拟输入打开,双MOS管不导通。专门用于 模拟信号输入。
模拟输入模式下,I/O
端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC
模块等。
应用场景:测量传感器信号、音频输入等模拟信号的变化。
开漏输出 GPIO_Mode_Out_OD = 0x14, 软件IIC的SDL,SCL等。
上下拉电阻关闭,施密特触发器打开,PMOS管关闭,在ODR对应位写0时, NMOS管导通,输出低电平,写1时不导通,不导通时为高阻态。不能输出高电 平,必须有外部上拉电阻才能输出高电平。
开漏输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,控制MOS管的导通。该模式下PMOS是断开的,不用看。这里要注意N-MOS管,当设置输出的值为高电平的时候,N-MOS管处于关闭状态(因为在输出和NMOS管的gate这中存在一个反相器,因此gate的电压是低电平),此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口外部的上拉或者下拉决定;当设置输出的值为低电平的时候,N-MOS管处于开启状态,此时I/O端口的电平就是低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,I/O端口的电平不一定是输出的电平。通常使用开漏输出时外部要加一个上拉电阻。
应用场景:与外部器件连接时,如I2C总线,用于与其他设备进行通信。
开漏复用输出 GPIO_Mode_AF_OD = 0x1C, 片上外设(软件IIC的SDL,SCL等)
上下拉电阻关闭,施密特触发器打开,PMOS管关闭,在外设复用输出写0时, NMOS管导通,写1时不导通,不导通时为高阻态。不能输出高电平,必须有外部 上拉电阻才能输出高电平。
开漏复用输出模式,与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。
应用场景:连接到外设的特殊功能引脚,如I2C总线通信引脚、故障信号输出等。
推挽输出 GPIO_Mode_Out_PP = 0x10, 驱动能力强,25mA(MAX),通用输出。
上下拉电阻关闭,施密特触发器打开,ODR对应位写0时,NMOS管导通,输出低 电平,写1则PMOS管导通,输出高电平。可输出高低电平,驱动能力强。
推挽输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,控制P-MOS管和N-MOS管的导通来控制IO口输出高电平还是低电平。这里要注意P-MOS管和N-MOS管,当设置输出的值为1的时候,P-MOS管处于开启状态,N-MOS管处于关闭状态,此时I/O端口的电平就由P-MOS管决定为高电平;当设置输出的值为0的时候,P-MOS管处于关闭状态,N-MOS管处于开启状态,此时I/O端口的电平就由N-MOS管决定为低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,此时I/O端口的电平一定是输出的电平。
应用场景:用于驱动外部电路,如控制LED灯、驱动其他逻辑电路等。
推挽复用输出 GPIO_Mode_AF_PP = 0x18, 片上外设(SPI的SCK,MISO,MOSI等)
上下拉电阻关闭,施密特触发器打开,外设复用功能写0时,NMOS管导通,输出 低电平,写1则PMOS管导通,输出高电平。可输出高低电平,驱动能力强。
推挽复用输出模式,与推挽输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。
应用场景:连接到外设的特殊功能引脚,如UART串口通信引脚、PWM输出等。
复用功能输出:复用功能输出中的复用是指STM32
的其他片上外设对GPIO
引脚进行控制,此时GPIO
引脚用作该外设功能的一部分,算是第二用途。从其他外设引出来的复用功能输出信号与GPIO
本身的数据寄存器都连接到双MOS
管结构的输入中。
总结
模式名称 | 性质 | 特征 |
---|---|---|
浮空输入 | 数字输入 | 可读取引脚电平,若引脚悬空,则电平不确定 |
上拉输入 | 数字输入 | 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平 |
下拉输入 | 数字输入 | 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平 |
模拟输入 | 模拟输入 | GPIO无效,引脚直接接入内部ADC |
开漏输出 | 数字输出 | 可输出引脚电平,高电平为高阻态,低电平接VSS |
推挽输出 | 数字输出 | 可输出引脚电平,高电平接VDD,低电平接VSS |
复用开漏输出 | 数字输出 | 由片上外设控制,高电平为高阻态,低电平接VSS |
复用推挽输出 | 数字输出 | 由片上外设控制,高电平接VDD,低电平接VSS |
STM32中GPIO的配置
在固件库开发中,操作寄存器 CRH 和 CRL 来配置 IO 口的模式和速度是通过 GPIO 初始化函数完成:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
/*第一个参数是用来指定 GPIO,取值范围为 GPIOA~GPIOG。
*第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef
*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-- PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz
GPIO_Init(GPIOB, GPIO_InitStructure);//根据设定参数配置 GPIO
结构体的Speed如下:
typedef enum
{
GPIO_Speed_10MHz,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
8种模式如下:
typedef enum
{ GPIO_Mode_AIN = 0x0, //模拟输入
GPIO_Mode_IN_FLOATING = 0x04, //浮空输入
GPIO_Mode_IPD = 0x28, //下拉输入
GPIO_Mode_IPU = 0x48, //上拉输入
GPIO_Mode_Out_OD = 0x14, //开漏输出
GPIO_Mode_Out_PP = 0x10, //通用推挽输出
GPIO_Mode_AF_OD = 0x1C, //复用开漏输出
GPIO_Mode_AF_PP = 0x18 //复用推挽
}GPIOMode_TypeDef;
原文链接:https://blog.csdn.net/qq_45172832/article/details/126139330
原文链接:https://blog.csdn.net/u010249597/article/details/134780467
原文链接:https://blog.csdn.net/qq_45172832/article/details/126139330
原文链接:https://blog.csdn.net/u010249597/article/details/134780467