GPIO四种输出模式
GPIO的四种主要输出模式是:通用推挽输出、通用开漏输出、复用推挽输出、复用开漏输出
IO接口的基本结构图
输出模式可以理解为下面四个词的组合
推挽 | 开漏 | |
通用 | 通用推挽输出 | 通用开漏输出 |
复用 | 复用推挽输出 | 复用开漏输出 |
下面来单独解释这四个词的含义
推挽和开漏
由两个MOS管组成根据不同的状态形成推挽或开漏
推挽
输出0 输出1
- 这种模式下,GPIO引脚可以直接输出高电平(如5V或3.3V)或低电平(0V),就像是一个双向开关,既能提供电流也能切断电流。
- 推挽输出模式适用于需要稳定控制的场合,如驱动LED灯、继电器等简单负载。
开漏
- 在这种模式下,GPIO引脚只能输出低电平(接地),不能主动提供高电平。
- 通常需要外接一个上拉电阻来提供高电平,因此适合用于I²C总线通信、按键检测等场合,可以实现多个设备共享一条总线而不发生冲突23。
通用和复用
通用
GPIO(General Purpose Input/Output)即通用输入输出接口,它可以通过编程控制引脚的电平状态,实现与外部设备的通信和交互。在通用模式下,GPIO引脚作为普通的输入或输出端口使用,直接由核心控制或读取电平状态。例如,在输出模式下,核心可以直接控制GPIO输出高低电平。
复用
复用模式下,GPIO引脚除了可以作为普通的输入或输出端口外,还可以复用为外设的信号线,如UART、I2C、SPI等通信接口的信号线。在这种模式下,GPIO引脚的功能由内部外设控制,不再直接由核心控制。复用模式提高了GPIO引脚的灵活性和利用率,使得同一个GPIO引脚可以在不同的场景下实现不同的功能。
闪灯实验
GPIO闪灯实验是一个基础的实验,用于演示如何通过编程控制GPIO引脚的电平状态,从而实现LED灯的闪烁
实验实现有两种方法分别是推挽和开漏
推挽接法
开漏接法
实现代码
int main(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIO_InitStructure = {0};GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);while(1){GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);Delay(100);GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);Delay(100);}
}
函数详解
RCC_APB2PeriphClockCmd( )函数
RCC_APB2PeriphClockCmd
是STM32标准外设库中的一个函数,用于使能或失能高速APB (APB2) 总线上的外设时钟。在STM32微控制器中,外设(如GPIO、ADC、SPI等)的时钟在默认情况下可能是关闭的,以节省功耗。当你需要使用某个外设时,你需要通过这个函数来使能它的时钟,这样外设才能正常工作。
函数原型通常如下:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
参数说明:
RCC_APB2Periph
:这是一个或多个要控制时钟的外设的标识符,它们通过位或(bitwise OR)操作符组合在一起。例如,如果你想要使能GPIOA和GPIOB的时钟,你可以将RCC_APB2Periph_GPIOA
和RCC_APB2Periph_GPIOB
进行位或操作。NewState
:这是一个枚举值,表示你想要将外设时钟设置为的状态。它可以是ENABLE
(使能时钟)或DISABLE
(失能时钟)。
GPIO_Init( )函数
GPIO_Init
是 STM32 标准外设库或 HAL 库中用于初始化 GPIO(通用输入输出)引脚的函数。通过调用这个函数,你可以配置 GPIO 引脚的多种参数,包括模式(输入、输出、复用或模拟)、速度、输出类型(推挽或开漏)、上拉/下拉电阻等。
在 STM32 标准外设库中,GPIO_Init
的函数原型通常如下:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
参数说明:
GPIOx
:指向一个 GPIO 端口的指针,例如GPIOA
、GPIOB
等。STM32 微控制器通常有多个 GPIO 端口,每个端口包含一组 GPIO 引脚。GPIO_InitStruct
:指向一个GPIO_InitTypeDef
结构体的指针,该结构体包含了 GPIO 引脚的配置信息。
GPIO_InitTypeDef
结构体通常包含以下成员:
GPIO_Pin
:指定要配置的 GPIO 引脚,可以是单个引脚或多个引脚的组合(通过位或操作)。GPIO_Mode
:设置 GPIO 引脚的模式,如GPIO_Mode_IN
(输入模式)、GPIO_Mode_OUT
(输出模式)等。GPIO_Speed
:设置 GPIO 引脚的速度,如GPIO_Speed_50MHz
、GPIO_Speed_25MHz
等。GPIO_OType
:设置 GPIO 引脚的输出类型,如GPIO_OType_PP
(推挽输出)或GPIO_OType_OD
(开漏输出)。GPIO_PuPd
:设置 GPIO 引脚的上拉/下拉电阻,如GPIO_PuPd_UP
(上拉)、GPIO_PuPd_DOWN
(下拉)或GPIO_PuPd_NOPULL
(无上下拉)。
GPIO_WriteBit()函数
GPIO_WriteBit
是 STM32 标准外设库中的一个函数,用于设置或清除指定 GPIO 引脚的输出电平。通过这个函数,你可以控制 GPIO 引脚是输出高电平(通常表示为逻辑“1”)还是低电平(通常表示为逻辑“0”)。这在控制 LED 灯、继电器、电机等外设时非常有用。
函数原型通常如下:
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
参数说明:
GPIOx
:指向一个 GPIO 端口的指针,例如GPIOA
、GPIOB
等。GPIO_Pin
:指定要控制的 GPIO 引脚,这通常是一个宏定义,表示特定的引脚号。BitVal
:这是一个枚举值,表示你想要设置的引脚电平。它可以是Bit_SET
(设置引脚为高电平)或Bit_RESET
(设置引脚为低电平)。