揭秘STM32 GPIO编程精髓:掌握输入_输出操作的奥秘
发布时间: 2024-07-02 07:36:17 阅读量: 64 订阅数: 38
![揭秘STM32 GPIO编程精髓:掌握输入_输出操作的奥秘](https://img-blog.csdnimg.cn/0c4421a75e8147f4bb72f25fad5eb316.png)
# 1. STM32 GPIO简介**
STM32 GPIO(通用输入输出端口)是STM32微控制器中负责与外部设备进行数据交互的重要外设。GPIO引脚可以配置为输入或输出模式,并支持各种电平和中断功能。
GPIO引脚通常分为两类:输入引脚和输出引脚。输入引脚用于读取外部设备的状态,而输出引脚用于驱动外部设备。GPIO引脚的配置由寄存器控制,这些寄存器允许设置引脚模式、电平和中断触发方式。
STM32 GPIO具有灵活性和可配置性,使其适用于广泛的应用,包括按钮输入、LED输出、传感器接口和中断处理。
# 2. GPIO输入输出模式
### 2.1 输入模式
GPIO输入模式是指GPIO引脚作为输入端,接收外部信号的模式。STM32提供了多种输入模式,以满足不同的应用需求。
#### 2.1.1 浮空输入
浮空输入模式是最基本的输入模式。在这种模式下,GPIO引脚不与任何外部电路连接,处于高阻抗状态。当没有外部信号输入时,GPIO引脚的电平由内部上拉或下拉电阻决定。
#### 2.1.2 上拉输入
上拉输入模式在GPIO引脚和电源之间连接了一个上拉电阻。当没有外部信号输入时,上拉电阻将GPIO引脚拉高到高电平。这种模式适用于需要检测外部开关或按钮的应用。
#### 2.1.3 下拉输入
下拉输入模式在GPIO引脚和地之间连接了一个下拉电阻。当没有外部信号输入时,下拉电阻将GPIO引脚拉低到低电平。这种模式适用于需要检测外部传感器或逻辑电路的应用。
### 2.2 输出模式
GPIO输出模式是指GPIO引脚作为输出端,向外部电路输出信号的模式。STM32提供了多种输出模式,以满足不同的驱动要求。
#### 2.2.1 推挽输出
推挽输出模式是最常见的输出模式。在这种模式下,GPIO引脚直接连接到一个推挽式输出级。推挽式输出级可以输出高电平或低电平,并具有较强的驱动能力。
#### 2.2.2 开漏输出
开漏输出模式在GPIO引脚和地之间连接了一个开漏晶体管。当GPIO引脚输出低电平时,开漏晶体管导通,将GPIO引脚拉低到低电平。当GPIO引脚输出高电平时,开漏晶体管截止,GPIO引脚处于高阻抗状态。这种模式适用于需要与其他逻辑电路或设备共用输出线的应用。
#### 2.2.3 复用推挽输出
复用推挽输出模式是一种特殊的输出模式,它允许GPIO引脚同时输出数字信号和模拟信号。在这种模式下,GPIO引脚连接到一个复用推挽式输出级,该输出级既可以输出数字信号,也可以输出模拟信号。
# 3. GPIO输入输出操作**
### 3.1 输入操作
**3.1.1 读入GPIO电平**
读入GPIO电平操作用于获取GPIO引脚当前的电平状态。STM32提供了两种读入GPIO电平的方法:
* **直接读寄存器:**通过直接访问GPIO寄存器读取电平状态。例如,对于GPIOA的第5个引脚,可以使用以下代码读取其电平:
```c
uint8_t gpio_level = GPIOA->IDR & (1 << 5);
```
* **使用HAL库函数:**HAL库提供了更简单的读入GPIO电平函数,例如:
```c
HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5);
```
**3.1.2 检测GPIO电平变化**
检测GPIO电平变化操作用于监控GPIO引脚电平状态的变化。STM32提供了两种检测GPIO电平变化的方法:
* **中断:**配置GPIO中断,当电平状态发生变化时触发中断。中断服务程序中可以读取电平状态并进行相应的处理。
* **轮询:**定期轮询GPIO引脚的电平状态,并与上次读取的状态进行比较。如果电平状态发生变化,则可以进行相应的处理。
### 3.2 输出操作
**3.2.1 设置GPIO电平**
设置GPIO电平操作用于将GPIO引脚输出到指定电平。STM32提供了两种设置GPIO电平的方法:
* **直接写寄存器:**通过直接访问GPIO寄存器设置电平状态。例如,对于GPIOA的第5个引脚,可以使用以下代码设置其电平为高:
```c
GPIOA->ODR |= (1 << 5);
```
* **使用HAL库函数:**HAL库提供了更简单的设置GPIO电平函数,例如:
```c
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
```
**3.2.2 翻转GPIO电平**
翻转GPIO电平操作用于将GPIO引脚的电平状态从高电平翻转为低电平,或从低电平翻转为高电平。STM32提供了两种翻转GPIO电平的方法:
* **直接写寄存器:**通过直接访问GPIO寄存器翻转电平状态。例如,对于GPIOA的第5个引脚,可以使用以下代码翻转其电平:
```c
GPIOA->ODR ^= (1 << 5);
```
* **使用HAL库函数:**HAL库提供了更简单的翻转GPIO电平函数,例如:
```c
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
```
# 4. GPIO中断处理**
**4.1 GPIO中断配置**
**4.1.1 中断源选择**
STM32的GPIO中断源可以是单个GPIO引脚或GPIO端口。对于单个GPIO引脚,中断源由引脚号确定。对于GPIO端口,中断源由端口号确定。
**4.1.2 中断触发方式**
GPIO中断可以由以下触发方式触发:
* **上升沿触发:**当GPIO电平从低电平上升到高电平时触发中断。
* **下降沿触发:**当GPIO电平从高电平下降到低电平时触发中断。
* **电平触发:**当GPIO电平保持在高电平或低电平时触发中断。
* **任意沿触发:**当GPIO电平发生任何变化时触发中断。
**4.1.3 中断优先级**
每个GPIO中断源都有一个可配置的中断优先级。中断优先级决定了中断处理的顺序。优先级较高的中断将在优先级较低的中断之前处理。
**4.2 GPIO中断服务程序**
**4.2.1 中断处理流程**
当GPIO中断触发时,MCU会执行以下中断处理流程:
1. 保存当前程序计数器(PC)和程序状态寄存器(PSR)。
2. 跳转到中断向量表中的GPIO中断服务程序(ISR)。
3. ISR读取中断状态寄存器(ISR)以确定触发中断的GPIO引脚或端口。
4. ISR处理中断并清除中断标志。
5. ISR返回到主程序,恢复执行。
**4.2.2 中断处理函数**
GPIO中断服务程序是一个函数,负责处理GPIO中断。ISR的典型结构如下:
```c
void GPIO_IRQHandler(void)
{
// 读取中断状态寄存器以确定触发中断的GPIO引脚或端口
uint32_t status = GPIOx->ISR;
// 清除中断标志
GPIOx->ICR = status;
// 处理中断
if (status & GPIO_PIN_0) {
// GPIO引脚0触发中断
} else if (status & GPIO_PIN_1) {
// GPIO引脚1触发中断
} else {
// 其他GPIO引脚或端口触发中断
}
}
```
**代码块解释:**
* `GPIOx->ISR`读取中断状态寄存器以确定触发中断的GPIO引脚或端口。
* `GPIOx->ICR = status`清除中断标志。
* `if (status & GPIO_PIN_0)`检查是否GPIO引脚0触发中断。
* `if (status & GPIO_PIN_1)`检查是否GPIO引脚1触发中断。
* `else`处理其他GPIO引脚或端口触发中断的情况。
# 5.1 GPIO复用功能
### 5.1.1 复用功能简介
GPIO复用功能允许GPIO引脚同时具有多个功能,例如既可以作为GPIO引脚,又可以作为其他外设的引脚。STM32系列MCU中,GPIO复用功能通过复用器来实现。
### 5.1.2 复用功能配置
要配置GPIO复用功能,需要执行以下步骤:
1. **确定要复用的GPIO引脚:**查看STM32 MCU手册,确定要复用的GPIO引脚支持哪些复用功能。
2. **配置复用器:**使用寄存器操作,配置复用器将GPIO引脚复用为所需的功能。
3. **配置GPIO引脚:**配置GPIO引脚的模式和电气特性,以匹配复用功能的要求。
**代码示例:**
```c
/* 复用GPIOA0引脚为UART1_TX */
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // 使能UART1时钟
GPIOA->CRH &= ~(GPIO_CRH_MODE0 | GPIO_CRH_CNF0); // 清除原配置
GPIOA->CRH |= GPIO_CRH_MODE0_1 | GPIO_CRH_CNF0_1; // 设置复用模式为UART1_TX
```
**参数说明:**
* `RCC->APB2ENR |= RCC_APB2ENR_USART1EN;`:使能UART1时钟。
* `GPIOA->CRH &= ~(GPIO_CRH_MODE0 | GPIO_CRH_CNF0);`:清除原配置,包括模式和电气特性。
* `GPIOA->CRH |= GPIO_CRH_MODE0_1 | GPIO_CRH_CNF0_1;`:设置复用模式为UART1_TX,其中`GPIO_CRH_MODE0_1`表示复用模式为1,`GPIO_CRH_CNF0_1`表示电气特性为复用推挽输出。
0
0