STM32单片机GPIO编程指南:掌握输入输出控制,轻松驾驭
发布时间: 2024-07-04 06:48:09 阅读量: 97 订阅数: 48
![stm32是几位单片机](https://wiki.st.com/stm32mpu/nsfr_img_auth.php/0/0f/Software_memory_mapping.png)
# 1. GPIO概述**
GPIO(通用输入/输出)是STM32单片机中一种重要的外设,它允许微控制器与外部世界交互。GPIO引脚可以配置为输入或输出,并可以连接到各种外部设备,例如传感器、执行器和显示器。
GPIO编程涉及配置GPIO引脚的模式、输入输出状态和中断。通过使用STM32的寄存器,程序员可以灵活地控制GPIO引脚的行为,实现各种功能,例如数据采集、设备控制和用户交互。
# 2. GPIO编程基础
### 2.1 GPIO寄存器结构
STM32单片机的GPIO寄存器结构主要包括以下几个部分:
- **GPIOx_MODER (Mode Register)**:配置GPIO模式,包括输入、输出、推挽输出和开漏输出等模式。
- **GPIOx_OTYPER (Output Type Register)**:配置GPIO输出类型,包括推挽输出和开漏输出。
- **GPIOx_OSPEEDR (Output Speed Register)**:配置GPIO输出速度,包括低速、中速和高速等速度。
- **GPIOx_PUPDR (Pull-up/Pull-down Register)**:配置GPIO上拉/下拉电阻,包括上拉、下拉、浮空等状态。
- **GPIOx_IDR (Input Data Register)**:读取GPIO输入数据。
- **GPIOx_ODR (Output Data Register)**:写入GPIO输出数据。
### 2.2 GPIO模式配置
GPIO模式配置通过GPIOx_MODER寄存器进行。该寄存器共有32位,每4位对应一个GPIO引脚的模式配置。
| 模式 | 二进制编码 |
|---|---|
| 输入模式 | 00 |
| 输出模式 | 01 |
| 推挽输出模式 | 10 |
| 开漏输出模式 | 11 |
例如,要将GPIOA的第5个引脚配置为推挽输出模式,可以设置GPIOA_MODER寄存器的第20-21位为10。
```c
// 配置GPIOA第5个引脚为推挽输出模式
GPIOA->MODER &= ~(3 << (5 * 2));
GPIOA->MODER |= (1 << (5 * 2));
```
### 2.3 GPIO输入输出控制
GPIO输入输出控制通过GPIOx_IDR和GPIOx_ODR寄存器进行。
- **GPIOx_IDR寄存器**:读取GPIO输入数据。每个位对应一个GPIO引脚的输入状态,0表示低电平,1表示高电平。
- **GPIOx_ODR寄存器**:写入GPIO输出数据。每个位对应一个GPIO引脚的输出状态,0表示低电平,1表示高电平。
例如,要读取GPIOA第5个引脚的输入状态,可以读取GPIOA_IDR寄存器的第5位。
```c
// 读取GPIOA第5个引脚的输入状态
uint8_t input_state = (GPIOA->IDR >> 5) & 0x01;
```
要将GPIOA第5个引脚输出高电平,可以设置GPIOA_ODR寄存器的第5位为1。
```c
// 将GPIOA第5个引脚输出高电平
GPIOA->ODR |= (1 << 5);
```
# 3.1 GPIO中断配置
#### 1. 中断使能
在使用GPIO中断之前,需要先使能GPIO中断。具体步骤如下:
1. 确定要使用哪个GPIO端口,并获取其对应的RCC时钟使能寄存器(RCC_AHB1ENR)。
2. 设置RCC时钟使能寄存器的相应位,使能GPIO端口的时钟。
3. 获取要使用哪个GPIO引脚,并获取其对应的GPIO中断寄存器(EXTI_IMR)。
4. 设置GPIO中断寄存器的相应位,使能该引脚的中断。
例如,要使能GPIOA端口的第5个引脚的中断,代码如下:
```c
// 使能GPIOA时钟
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
// 使能GPIOA第5个引脚中断
EXTI->IMR |= EXTI_IMR_IM5;
```
#### 2. 中断触发方式配置
GPIO中断可以配置为以下三种触发方式:
* 上升沿触发
* 下降沿触发
* 上升沿和下降沿触发
可以通过设置GPIO中断寄存器(EXTI_RTSR)和GPIO中断下降沿触发寄存器(EXTI_FTSR)来配置中断触发方式。
例如,要配置GPIOA第5个引脚为上升沿触发,代码如下:
```c
// 配置GPIOA第5个引脚为上升沿触发
EXTI->RTSR |= EXTI_RTSR_TR5;
```
#### 3. 中断优先级配置
GPIO中断的优先级可以通过设置NVIC中断优先级寄存器(NVIC_IPRx)来配置。其中,x表示中断优先级组(0~3)。
例如,要将GPIOA中断的优先级设置为组1,代码如下:
```c
// 将GPIOA中断的优先级设置为组1
NVIC_SetPriority(EXTI0_1_IRQn, 1 << 4);
```
### 3.2 GPIO中断服务程序
GPIO中断服务程序(ISR
0
0