STM32单片机GPIO编程秘籍:轻松配置和使用输入_输出端口
发布时间: 2024-07-06 00:44:18 阅读量: 56 订阅数: 49
stm32单片机GPIO端口使用
5星 · 资源好评率100%
![stm32单片机原理教学](https://wiki.st.com/stm32mcu/nsfr_img_auth.php/c/c2/STM32Cubeide_with_STM32CubeMX_integrated.png)
# 1. STM32单片机GPIO概述
STM32单片机GPIO(通用输入输出端口)是连接外部设备和单片机内部资源的重要接口。它允许单片机与外部世界进行数据交互,实现各种控制和通信功能。
GPIO端口由多个引脚组成,每个引脚可以配置为输入或输出模式。在输入模式下,引脚可以读取外部信号,而在输出模式下,引脚可以驱动外部设备。GPIO引脚还支持中断功能,允许单片机在外部事件发生时快速响应。
# 2. GPIO编程基础**
**2.1 GPIO寄存器结构**
STM32单片机的GPIO寄存器结构主要包括以下几个部分:
* **GPIOx_MODER**:模式寄存器,用于配置GPIO的模式(输入/输出/复用)。
* **GPIOx_OTYPER**:输出类型寄存器,用于配置GPIO的输出类型(推挽/开漏)。
* **GPIOx_OSPEEDR**:输出速度寄存器,用于配置GPIO的输出速度(低速/中速/高速)。
* **GPIOx_PUPDR**:上拉/下拉寄存器,用于配置GPIO的上拉/下拉电阻(无/上拉/下拉)。
* **GPIOx_IDR**:输入数据寄存器,用于读取GPIO的输入电平。
* **GPIOx_ODR**:输出数据寄存器,用于设置GPIO的输出电平。
* **GPIOx_BSRR**:置位/复位寄存器,用于置位/复位GPIO的输出电平。
* **GPIOx_LCKR**:锁定寄存器,用于锁定GPIO的配置寄存器。
**2.2 GPIO配置模式**
GPIO可以配置为以下三种模式:
**2.2.1 输入模式**
* 输入模式下,GPIO的输入缓冲器被使能,外部信号可以通过GPIO引脚输入到单片机。
* 输入模式的寄存器配置:GPIOx_MODER = 0b00。
**2.2.2 输出模式**
* 输出模式下,GPIO的输出驱动器被使能,单片机可以通过GPIO引脚输出信号到外部设备。
* 输出模式的寄存器配置:GPIOx_MODER = 0b01。
**2.2.3 其他模式**
除了输入和输出模式之外,GPIO还可以配置为以下模式:
* **复用模式:**GPIO引脚可以复用为其他功能,如串口、I2C等。
* **模拟输入模式:**GPIO引脚可以配置为模拟输入,用于采集模拟信号。
**2.3 GPIO中断配置**
GPIO可以配置为中断源,当GPIO电平发生变化时触发中断。
**2.3.1 中断类型**
GPIO中断可以配置为以下类型:
* **下降沿触发:**当GPIO电平从高电平下降到低电平时触发中断。
* **上升沿触发:**当GPIO电平从低电平上升到高电平时触发中断。
* **电平触发:**当GPIO电平保持在高电平或低电平时触发中断。
**2.3.2 中断配置步骤**
GPIO中断配置步骤如下:
1. 配置GPIO的模式为输入模式。
2. 配置GPIO的中断类型。
3. 使能GPIO的中断。
4. 编写中断服务函数。
# 3. GPIO编程实践
### 3.1 GPIO输入输出操作
#### 3.1.1 输入操作
**代码块:**
```c
// 设置GPIOA的第0位为输入模式
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 读取GPIOA的第0位输入电平
uint8_t input_value = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
```
**逻辑分析:**
* 第一行代码设置GPIOA的第0位为输入模式,该引脚将接收外部信号。
* 第二行代码读取GPIOA的第0位输入电平,并将结果存储在`input_value`变量中。
#### 3.1.2 输出操作
**代码块:**
```c
// 设置GPIOA的第1位为输出模式
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 设置GPIOA的第1位输出高电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
```
**逻辑分析:**
* 第一行代码设置GPIOA的第1位为输出模式,该引脚将输出信号到外部设备。
* 第二行代码设置GPIOA的第1位输出高电平,表示该引脚输出高电平信号。
### 3.2 GPIO中断处理
#### 3.2.1 中断服务函数
**代码块:**
```c
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_2) {
// 中断处理代码
}
}
```
**逻辑分析:**
* 该函数是GPIO中断服务函数,当GPIO引脚发生中断时被调用。
* 函数参数`GPIO_Pin`表示触发中断的引脚号。
* 在本例中,如果触发中断的引脚是GPIOA的第2位,则执行中断处理代码。
#### 3.2.2 中断优先级设置
**代码块:**
```c
// 设置GPIOA的第3位中断优先级为最高
HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
```
**逻辑分析:**
* 该函数设置GPIOA的第3位中断优先级为最高。
* 第一个参数`EXTI3_IRQn`表示中断号,对应于GPIOA的第3位。
* 第二个参数`0`表示中断优先级组,0表示最高优先级组。
* 第三个参数`0`表示中断优先级,0表示最高优先级。
### 3.3 GPIO高级应用
#### 3.3.1 GPIO复用功能
**代码块:**
```c
// 设置GPIOA的第4位为复用功能,连接到USART1的TX引脚
GPIO_InitTypeD
```
0
0