灵活配置STM32单片机I_O端口:控制外部设备的秘诀
发布时间: 2024-07-02 02:43:02 阅读量: 5 订阅数: 8 ![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![灵活配置STM32单片机I_O端口:控制外部设备的秘诀](https://img-blog.csdnimg.cn/20210829122032372.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6IOh6LGGMjQ=,size_20,color_FFFFFF,t_70,g_se,x_16)
# 1. STM32 I/O 端口基础
### 1.1 I/O 端口简介
STM32 微控制器具有丰富的 I/O 端口,用于连接外部设备和传感器。I/O 端口是微控制器与外部世界交互的桥梁,负责输入和输出数字或模拟信号。
### 1.2 I/O 端口分类
STM32 I/O 端口分为通用 I/O (GPIO)、复用 I/O 和模拟 I/O。GPIO 可配置为输入或输出模式,而复用 I/O 可连接到多个外设,如 UART、SPI 和 I2C。模拟 I/O 用于处理模拟信号,例如电压和电流。
# 2. I/O 端口配置技巧
### 2.1 I/O 端口模式和配置寄存器
STM32 I/O 端口具有多种模式,每种模式都定义了端口引脚的行为。这些模式通过配置寄存器进行设置,其中包括:
- **MODER 寄存器:**定义引脚模式,包括输入、输出、模拟和复用功能。
- **OTYPER 寄存器:**定义引脚输出类型,包括推挽式或开漏式。
- **OSPEEDR 寄存器:**定义引脚输出速度,包括低速、中速和高速。
- **PUPDR 寄存器:**定义引脚上拉或下拉电阻,包括无、上拉、下拉和浮空。
**代码块:**
```c
// 设置 GPIOA 引脚 0 为输出模式
GPIOA->MODER &= ~(3 << (0 * 2));
GPIOA->MODER |= (1 << (0 * 2));
// 设置 GPIOA 引脚 0 为推挽式输出
GPIOA->OTYPER &= ~(1 << 0);
// 设置 GPIOA 引脚 0 为高速输出
GPIOA->OSPEEDR |= (3 << (0 * 2));
// 设置 GPIOA 引脚 0 为上拉电阻
GPIOA->PUPDR &= ~(3 << (0 * 2));
GPIOA->PUPDR |= (1 << (0 * 2));
```
**逻辑分析:**
这段代码逐行设置 GPIOA 引脚 0 的模式和配置:
1. `GPIOA->MODER &= ~(3 << (0 * 2));` 清除引脚 0 的模式位,将其设置为输入模式。
2. `GPIOA->MODER |= (1 << (0 * 2));` 设置引脚 0 为输出模式。
3. `GPIOA->OTYPER &= ~(1 << 0);` 设置引脚 0 为推挽式输出。
4. `GPIOA->OSPEEDR |= (3 << (0 * 2));` 设置引脚 0 为高速输出。
5. `GPIOA->PUPDR &= ~(3 << (0 * 2));` 清除引脚 0 的上拉/下拉电阻位。
6. `GPIOA->PUPDR |= (1 << (0 * 2));` 设置引脚 0 为上拉电阻。
### 2.2 GPIO 中断和 DMA
STM32 I/O 端口支持中断和 DMA,以提高系统效率和响应能力。
**中断:**
- **EXTI 寄存器:**外部中断控制器寄存器,用于配置中断源和触发条件。
- **NVIC 寄存器:**嵌套向量中断控制器寄存器,用于配置中断优先级和使能中断。
**DMA:**
- **DMA_Streamx_CR 寄存器:**DMA 流控制寄存器,用于配置 DMA 传输参数,如源地址、目标地址和传输大小。
- **DMA_Streamx_NDTR 寄存器:**DMA 流数据传输数量寄存器,用于指定要传输的数据数量。
**代码块:**
```c
// 配置 GPIOA 引脚 0 为中断源
EXTI->IMR |= (1 << 0);
EXTI->RTSR |= (1 << 0);
// 配置 NVIC 中断优先级和使能中断
NVIC_SetPriority(EXTI0_IRQn, 2);
NVIC_EnableIRQ(EXTI0_IRQn);
// 配置 DMA 流 1 从 GPIOA 引脚 0 传输数据到内存
DMA1_Stream1->CR &= ~(DMA_SxCR_EN);
DMA1_Stream1->PAR = (uint32_t)&GPIOA->IDR;
DMA1_Stream1->M0AR = (uint32_t)data_buffer;
DMA1_Stream1->NDTR = data_size;
DMA1_Stream1->CR |= DMA_SxCR_EN;
```
**逻辑分析:**
这段代码逐行配置 GPIOA 引脚 0 的中断和 DMA:
1. `EXTI->IMR |= (1 << 0);` 使能 GPIOA 引脚 0 的中断。
2. `EXTI->RTSR |= (1 << 0);` 设置 GPIOA 引脚 0 为上升沿触发中断。
3. `NVIC_SetPriority(EXTI0_IRQn, 2);` 设置 EXTI0 中断的优先级为 2。
4. `NVIC_EnableIRQ(EXTI0_IRQn);` 使能 EXTI0 中断。
5. `DMA1_Stream1->CR &= ~(DMA_SxCR_EN);` 禁用 DMA 流 1。
6. `DMA1_Stream1->PAR = (uint32_t)&GPIOA->IDR;` 设置 DMA 流 1 的源地址为 GPIOA 引脚 0 的输入数据寄存器。
7.
0
0
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)