STM32 GPIO编程实战:20个应用案例,从原理到实战演练
发布时间: 2024-07-02 12:05:31 阅读量: 96 订阅数: 51
(175797816)华南理工大学信号与系统Signal and Systems期末考试试卷及答案
![STM32 GPIO编程实战:20个应用案例,从原理到实战演练](https://img-blog.csdnimg.cn/7d9ec37edb704112bb9590841b7802f3.png)
# 1. STM32 GPIO 简介
STM32 微控制器系列中的 GPIO(通用输入/输出)是用于与外部设备通信的关键外设。它允许微控制器读取外部信号(如按钮或传感器输入)并控制外部设备(如 LED 或继电器)。GPIO 引脚可以配置为输入、输出或中断源,为广泛的应用程序提供灵活性。
GPIO 的基本功能包括:
- **输入模式:** 读取外部信号,如按钮或传感器输入。
- **输出模式:** 控制外部设备,如 LED 或继电器。
- **中断模式:** 当 GPIO 引脚上的信号发生变化时触发中断。
# 2. GPIO 编程基础
### 2.1 GPIO 配置和初始化
GPIO 配置和初始化是使用 GPIO 的第一步。它涉及设置 GPIO 引脚的模式、方向和中断配置。
**配置 GPIO 引脚模式**
GPIO 引脚可以配置为输入、输出或模拟模式。输入模式允许引脚接收信号,而输出模式允许引脚输出信号。模拟模式允许引脚连接到模拟外设,如 ADC 或 DAC。
**设置 GPIO 引脚方向**
GPIO 引脚可以配置为输入或输出方向。输入方向允许引脚接收信号,而输出方向允许引脚输出信号。
**配置 GPIO 中断**
GPIO 中断可以配置为在引脚状态发生变化时触发。中断可以配置为上升沿、下降沿或电平变化触发。
### 2.2 GPIO 输入/输出模式
GPIO 引脚可以配置为输入或输出模式。
**输入模式**
在输入模式下,GPIO 引脚接收来自外部设备或传感器的信号。引脚的电平反映了外部设备或传感器的状态。
**输出模式**
在输出模式下,GPIO 引脚输出信号到外部设备或执行器。引脚的电平由 MCU 控制。
### 2.3 GPIO 中断处理
GPIO 中断在引脚状态发生变化时触发。中断处理程序负责响应中断并执行必要的操作。
**中断处理程序**
中断处理程序是一个函数,当 GPIO 中断触发时被调用。中断处理程序负责读取中断寄存器、清除中断标志并执行必要的操作。
**中断优先级**
GPIO 中断可以分配不同的优先级。优先级较高的中断在优先级较低的中断之前处理。
**代码示例:**
```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);
// 配置 GPIOB 引脚 1 为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 配置 GPIOC 引脚 2 为中断模式
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
```
**逻辑分析:**
* 第一段代码配置 GPIOA 引脚 0 为输入模式。
* 第二段代码配置 GPIOB 引脚 1 为输出模式。
* 第三段代码配置 GPIOC 引脚 2 为中断模式,在上升沿触发中断。
# 3. GPIO 实战应用
### 3.1 LED 控制
LED(发光二极管)是 GPIO 实战应用中最为常见的器件之一。通过控制 GPIO 的输出状态,我们可以轻松实现 LED 的点亮和熄灭。
#### 硬件连接
将 LED 的正极连接到 GPIO 引脚,负极连接到地线。
#### 软件配置
```c
// 初始化 GPIO
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // 使能 GPIOA 时钟
GPIOA->MODER &= ~GPIO_MODER_MODE5; // 清除 GPIOA Pin5 的模式位
GPIOA->MODER |= GPIO_MODER_MODE5_0; // 设置 GPIOA Pin5 为输出模式
// 点亮 LED
GPIOA->ODR |= GPIO_ODR_OD5; // 设置 GPIOA Pin5 输出高电平
// 熄灭 LED
GPIOA->ODR &= ~GPIO_ODR_OD5; // 设置 GPIOA Pin5 输出低电平
```
#### 逻辑分析
* `RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;`:使能 GPIOA 时钟,为 GPIOA 引脚提供电源。
* `GPIOA->MODER &= ~GPIO_MODER_MODE5;`:清除 GPIOA Pin5 的模式位,将其置为默认状态。
* `GPIOA->MODER |= GPIO_MODER_MODE5_0;`:设置 GPIOA Pin5 为输出模式,允许该引脚输出电平。
* `GPIOA->ODR |= GPIO_ODR_OD5;`:设置 GPIOA Pin5 输出高电平,点亮 LED。
* `GPIOA->ODR &= ~GPIO_ODR_OD5;`:设置 GPIOA Pi
0
0