【STM32】CUBEMX之串口:串口三种模式(轮询模式、中断模式、DMA模式)的配置与使用
在 STM32 中,串口(USART/UART)是非常常用的通信接口之一。STM32 支持多种串口通信模式,包括轮询模式、中断模式和 DMA 模式。本文将通过 CUBEMX 配置 STM32 的串口,并演示如何在这三种模式下进行通信。
1. STM32 串口基础
1.1 串口简介
串口通信是一种常见的异步通信协议,通常用于微控制器与外部设备(如电脑、传感器、模块)之间的数据传输。STM32 的串口外设既可以支持全双工通信,也可以支持半双工通信。
1.2 串口通信的基本参数
配置串口时需要设置以下基本参数:
2. 三种模式简介
STM32 的串口通信有三种模式:
3. CUBEMX 串口配置
3.1 基本配置
- 创建项目:打开 CUBEMX,新建项目并选择使用的 STM32 芯片型号。
- 启用串口:在 “Pinout & Configuration” 界面中,找到并启用 USART1(或其他串口)。这会自动分配 TX 和 RX 引脚。
- 配置串口参数:在 “Configuration” 界面,点击 USART1 进行参数设置,如下所示:
- Baud Rate: 115200
- Word Length: 8 Bits
- Stop Bits: 1 Stop Bit
- Parity: None
- Hardware Flow Control: None
- Mode: Asynchronous
3.2 模式选择
根据不同的使用场景,我们可以选择不同的工作模式:
4. 轮询模式代码实现
轮询模式下,发送与接收数据需要不断查询串口状态,并使用 HAL_UART_Transmit
和 HAL_UART_Receive
函数。
#include "stm32f4xx_hal.h"
UART_HandleTypeDef huart1;
void SystemClock_Config(void);
void MX_USART1_UART_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_USART1_UART_Init();
uint8_t tx_data[] = "Hello, USART Polling Mode!\r\n";
uint8_t rx_data[10] = {0};
while (1) {
// 轮询发送数据
HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data) - 1, HAL_MAX_DELAY);
// 轮询接收数据
HAL_UART_Receive(&huart1, rx_data, sizeof(rx_data), HAL_MAX_DELAY);
// 根据接收到的数据进行处理
HAL_Delay(1000);
}
}
void MX_USART1_UART_Init(void) {
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart1);
}
优点:
缺点:
5. 中断模式代码实现
中断模式可以减少 CPU 负担。当数据接收完成时,触发中断,并在中断回调函数中处理数据。
5.1 中断初始化
首先,在 CUBEMX 中启用 USART1 的中断功能。接着编写代码。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
// 接收完成回调函数
HAL_UART_Transmit(&huart1, (uint8_t *)"Data received\r\n", 15, HAL_MAX_DELAY);
// 重新启用接收中断
HAL_UART_Receive_IT(&huart1, rx_data, sizeof(rx_data));
}
}
int main(void) {
HAL_Init();
SystemClock_Config();
MX_USART1_UART_Init();
uint8_t tx_data[] = "Hello, USART Interrupt Mode!\r\n";
uint8_t rx_data[10] = {0};
// 启用接收中断
HAL_UART_Receive_IT(&huart1, rx_data, sizeof(rx_data));
while (1) {
HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data) - 1, HAL_MAX_DELAY);
HAL_Delay(1000);
}
}
5.2 中断回调函数
当接收到数据时,STM32 会触发 HAL_UART_RxCpltCallback
回调函数。我们可以在该函数中对接收的数据进行处理,并重新启用中断。
优点:
缺点:
6. DMA 模式代码实现
DMA 模式用于大批量数据的传输,通过 DMA 控制器将数据自动传输到内存或外设,无需 CPU 介入,适合长时间、大数据传输场景。
6.1 DMA 初始化
在 CUBEMX 中启用 DMA 功能,并配置 DMA 通道。然后在代码中进行 DMA 的初始化与使用。
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
// 发送完成回调
HAL_UART_Transmit(&huart1, (uint8_t *)"DMA Transmit Complete\r\n", 23, HAL_MAX_DELAY);
}
}
int main(void) {
HAL_Init();
SystemClock_Config();
MX_USART1_UART_Init();
uint8_t tx_data[] = "Hello, USART DMA Mode!\r\n";
uint8_t rx_data[10] = {0};
// 使用 DMA 发送数据
HAL_UART_Transmit_DMA(&huart1, tx_data, sizeof(tx_data) - 1);
// 使用 DMA 接收数据
HAL_UART_Receive_DMA(&huart1, rx_data, sizeof(rx_data));
while (1) {
HAL_Delay(1000); // 主循环中不需要频繁处理数据
}
}
6.2 回调函数
与中断模式类似,DMA 模式中也有回调函数来处理数据传输完成事件。
优点:
缺点:
7. 总结
本文介绍了 STM32 串口的三种模式(轮询模式、中断模式和 DMA 模式)在 CUBEMX 中的配置和代码实现。这三种模式各有优缺点,开发者可以根据实际应用场景选择合适的模式:
响应速度要求高的场景。
在实际项目中,根据不同的需求,选择最合适的模式可以极大提高系统的性能。
作者:一只蜗牛儿