1. GPIO简介
- GPIO(General Purpose Input/Output)是用于在微控制器中与外部世界通信的接口。
- 通过GPIO,微控制器可以控制外部设备(如LED、LCD、按键等)的状态,也可以接收外部设备的状态(如传感器数据)
2. GPIO配置寄存器
- GPIO配置寄存器用于配置和控制GPIO引脚的行为。
- 主要的GPIO寄存器包括:
- GPIO配置寄存器(GPIOx_CR):用于配置引脚的模式、速度、上拉/下拉等。
- GPIO有如下几种需要配置的属性:
模式(Mode):
- 每个引脚可以配置为输入、输出或复用模式。
- 通常使用两个位来表示一个引脚的模式,例如MODE0和MODE1位表示一个引脚的模式。可以根据引脚数量的不同,有不同数量的MODE位。
速度(Speed):
-
速度字段用于配置引脚的输出速度。
-
通常有两个位来表示一个引脚的输出速度,例如SPEED0和SPEED1位。速度可以分为低速、中速、高速和非速度控制。
-
IO引脚的速度设置用于控制引脚的输出信号变化速率,其主要目的是优化系统性能和电气特性。具体来说,速度设置可以影响到引脚输出信号的上升时间和下降时间,从而影响到信号的稳定性、功耗和电磁兼容性等方面。
-
以下是速度设置的一些常见用途:
-
信号带宽和响应速度: 高速输出可以使得信号在引脚之间传输更快,从而提高系统的响应速度和通信带宽。特别是在高频率通信或者快速数据传输的应用中,选择较高的速度设置可以确保信号传输的及时性和准确性。
-
时序要求和稳定性: 在一些时序要求严格的应用中,如时钟信号、同步信号等,选择适当的速度设置可以确保引脚输出信号的上升时间和下降时间满足时序要求,从而保证系统的稳定性和可靠性。
-
功耗优化: 在一些功耗敏感的应用中,选择适当的速度设置可以降低引脚的功耗。通常来说,较低的速度设置会使得引脚输出信号的切换速度降低,从而降低功耗并减少电流消耗。
-
电磁兼容性(EMC): 选择适当的速度设置可以减少引脚输出信号的边沿过渡速率,从而降低系统的辐射噪声和电磁干扰(EMI)水平,有助于提高系统的电磁兼容性。
-
上拉/下拉(Pull-up/Pull-down):
- 上拉和下拉功能允许在引脚处于输入模式时,通过内部上拉或下拉电阻将引脚拉高或拉低。
- 通常有两个位来表示一个引脚的上拉/下拉配置,例如PUPD0和PUPD1位。可以选择上拉、下拉、或者不使能上拉/下拉。
复用(Alternate Function):
- 引脚可以配置为多种不同的功能,如串口通信、SPI通信等。
- 每个引脚通常有一个或多个复用功能,需要选择对应的复用功能编号。
输出类型(Output Type):
-
输出类型字段用于配置引脚的输出类型,可以选择推挽输出或开漏输出。
-
通常有一个位来表示一个引脚的输出类型,例如OT位。可以选择推挽输出或开漏输出。
-
二种输出的区别:
推挽输出(Push-Pull Output):
- 在推挽输出模式下,引脚可以提供两种状态:高电平(逻辑1)和低电平(逻辑0)。
- 当输出为高电平时,引脚会被连接到电源(例如VCC),从而输出高电平信号;当输出为低电平时,引脚会被连接到地(例如GND),从而输出低电平信号。
- 推挽输出具有较低的输出阻抗,可以提供较强的驱动能力,适用于驱动各种负载,如LED、电机、传感器等。
- 推挽输出适用于多种应用场景,常用于数字电路中。
开漏输出(Open-Drain Output):
- 在开漏输出模式下,引脚只能提供两种状态之一:低电平或者高阻态(开漏)。
- 当输出为低电平时,引脚被连接到地(例如GND),输出低电平信号;当输出为高阻态时,引脚处于高阻态,不提供电平信号。
- 为了产生高电平信号,需要外部上拉电阻将引脚连接到电源(例如VCC)。这样,当引脚处于高阻态时,上拉电阻可以确保引脚上的电压为高电平。
- 开漏输出具有较高的输出阻抗,驱动能力较弱,主要用于与其他器件进行电平匹配或者构建开漏总线(如I2C总线)等场景
#### 应用场景
*
##### **推挽输出的实际应用:**
* **LED控制**:LED灯通常通过推挽输出来控制。当输出为高电平时,LED亮起;当输出为低电平时,LED熄灭。
* **电机驱动**:在电机驱动电路中,推挽输出用于控制电机的正转和反转。通过控制两个推挽输出引脚的状态,可以控制电机的运动方向。
* **数字信号输出**:在数字信号输出场景中,推挽输出用于产生数字信号,如驱动蜂鸣器发出蜂鸣声、控制继电器等。
* **LCD控制**:在液晶显示器(LCD)控制电路中,推挽输出用于控制LCD的各个像素点,实现图像显示。
*
##### **开漏输出的实际应用:**
* **I2C总线**:在I2C总线通信中,开漏输出用于构建总线的时钟线(SCL)和数据线(SDA)。多个设备可以共享同一条总线,通过开漏输出实现多主机通信。
* **GPIO级联**:在多个GPIO设备之间进行级联连接时,开漏输出可以实现电平匹配。例如,在多个微控制器之间进行通信时,一个设备的开漏输出连接到另一个设备的输入引脚。
* **模拟开关控制**:在一些模拟电路中,开漏输出可以用作模拟开关控制。例如,在电源管理电路中,开漏输出可以用于控制电池充电和放电。
* **多路选择器(MUX)控制**:在多路选择器电路中,开漏输出可以用于控制选择器的通道。通过开漏输出,可以实现多个输入信号的选择和切换。
实际STM32应用中可以配置8种模式!
- 输入数据寄存器(GPIOx_IDR):用于读取输入引脚的状态。
- 输出数据寄存器(GPIOx_ODR):用于设置输出引脚的状态。
在stm32f10x_gpio.h
中,GPIO的模式配置的枚举类型是GPIOMode_TypeDef
,具体的枚举值包括:
cpp
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;
这些枚举值表示了STM32F10x系列微控制器支持的8种GPIO模式配置,具体含义如下:
-
GPIO_Mode_AIN:模拟输入模式,用于连接模拟信号输入。
-
GPIO_Mode_IN_FLOATING:浮空输入模式,用于连接外部数字信号输入,不使用上拉或下拉电阻。
-
GPIO_Mode_IPD:下拉输入模式,引脚上使用内部下拉电阻。
-
GPIO_Mode_IPU:上拉输入模式,引脚上使用内部上拉电阻。
-
GPIO_Mode_Out_OD:开漏输出模式,输出开漏状态,通常需要外部上拉电阻。
-
GPIO_Mode_Out_PP:推挽输出模式,输出可通过输出寄存器直接控制高低电平。
-
GPIO_Mode_AF_OD:复用开漏输出模式,用于复用功能,输出开漏状态。
-
GPIO_Mode_AF_PP:复用推挽输出模式,用于复用功能,输出可通过输出寄存器直接控制高低电平。