STM32单片机IO口编程秘籍:详解GPIO配置、读写和中断,玩转单片机输入输出
发布时间: 2024-07-02 11:09:17 阅读量: 15 订阅数: 11 ![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![STM32单片机IO口编程秘籍:详解GPIO配置、读写和中断,玩转单片机输入输出](https://toptechboy.com/wp-content/uploads/2022/04/analog-injpg-1024x391.jpg)
# 1. STM32单片机IO口基础**
STM32单片机IO口是与外界交互的重要接口,负责数据输入输出和控制外围设备。本章将介绍STM32单片机IO口的相关基础知识,包括IO口分类、引脚功能和IO口寄存器。
**1.1 IO口分类**
STM32单片机IO口分为普通IO口和特殊功能IO口。普通IO口可以作为通用输入输出引脚,而特殊功能IO口具有特定的功能,如定时器、串口、I2C等。
**1.2 引脚功能**
每个IO口引脚都可以配置为不同的功能,如输入、输出、推挽输出、开漏输出等。这些功能通过IO口寄存器进行配置。
# 2. GPIO配置与读写
### 2.1 GPIO配置原理
GPIO配置是STM32单片机IO口编程的基础,它决定了IO口的输入输出模式、速度和强度等属性。
#### 2.1.1 GPIO模式选择
GPIO模式选择决定了IO口的输入输出方向。STM32单片机提供了多种GPIO模式,包括:
- **输入模式(Input)**:IO口作为输入端口,读取外部信号。
- **输出模式(Output)**:IO口作为输出端口,输出电平信号。
- **推挽输出模式(Push-Pull Output)**:IO口既可以输出高电平,也可以输出低电平。
- **开漏输出模式(Open-Drain Output)**:IO口只能输出低电平,需要外接上拉电阻才能输出高电平。
- **模拟输入模式(Analog Input)**:IO口作为模拟输入端口,可以读取模拟信号。
GPIO模式选择通过寄存器`GPIOx_MODER`进行配置,其中`x`表示GPIO端口号(A、B、C、D、E、F、G、H)。
```c
#define GPIOA_MODER ((volatile uint32_t*)0x40020000)
// 配置GPIOA第0位为输入模式
*GPIOA_MODER &= ~(3 << 0);
*GPIOA_MODER |= (0 << 0);
```
#### 2.1.2 GPIO速度和强度设置
GPIO速度和强度设置决定了IO口的驱动能力和抗干扰能力。STM32单片机提供了多种速度和强度设置,包括:
- **速度**:
- 低速(2 MHz)
- 中速(10 MHz)
- 高速(50 MHz)
- 极高速(100 MHz)
- **强度**:
- 弱强度
- 中等强度
- 强强度
GPIO速度和强度设置通过寄存器`GPIOx_OSPEEDR`和`GPIOx_PUPDR`进行配置,其中`x`表示GPIO端口号(A、B、C、D、E、F、G、H)。
```c
#define GPIOA_OSPEEDR ((volatile uint32_t*)0x40020008)
#define GPIOA_PUPDR ((volatile uint32_t*)0x4002000C)
// 配置GPIOA第0位为高速、强强度输出
*GPIOA_OSPEEDR |= (3 << 0);
*GPIOA_PUPDR |= (1 << 0);
```
### 2.2 GPIO读写操作
GPIO读写操作是STM32单片机IO口编程的核心,它实现数据的输入输出。
#### 2.2.1 GPIO输入读取
GPIO输入读取通过寄存器`GPIOx_IDR`进行,其中`x`表示GPIO端口号(A、B、C、D、E、F、G、H)。
```c
#define GPIOA_IDR ((volatile uint32_t*)0x40020010)
// 读取GPIOA第0位输入电平
uint32_t input_value = *GPIOA_IDR & (1 << 0);
```
#### 2.2.2 GPIO输出控制
GPIO输出控制通过寄存器`GPIOx_ODR`进行,其中`x`表示GPIO端口号(A、B、C、D、E、F、G、H)。
```c
#define GPIOA_ODR ((volatile uint32_t*)0x40020014)
// 设置GPIOA第0位输出高电平
*GPIOA_ODR |= (1 << 0);
// 设置G
```
0
0
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)