STM32 USART 串口通信(串口调试助手收发数据)
USART(通用同步异步收发器)是 STM32 最常用的通信方式之一,可用于 数据调试、与外设通信(如 GPS、蓝牙、WiFi 模块)。本指南介绍 USART 串口通信,包括 串口收发、DMA、终端调试助手 等。
1. USART 串口通信简介
STM32 的串口(UART/USART)支持:
- 异步通信(UART 模式):仅 TX/RX,适用于普通串口通信
- 同步通信(USART 模式):额外使用时钟信号
- 硬件流控(CTS/RTS):用于数据流管理
- DMA 传输:减少 CPU 负担,提高数据吞吐量
💡 常见波特率:9600、115200(默认),越高速度越快,但误码率增加。
2. 硬件连接
STM32 引脚 | 功能 | 连接设备 |
---|---|---|
PA9 (USART1_TX) | 串口发送 | 连接 USB-TTL 模块 RX |
PA10 (USART1_RX) | 串口接收 | 连接 USB-TTL 模块 TX |
GND | 地线 | 连接 USB-TTL 模块 GND |
💡 使用 USB-TTL 转串口工具(如 CH340、CP2102),连接电脑调试助手,如 SSCOM、SecureCRT、Putty。
3. STM32CubeMX 配置 USART
📌 3.1 选择串口
- 打开 STM32CubeMX
- Pinout 界面 选择 USART1
- PA9(TX) → USART1_TX
- PA10(RX) → USART1_RX
- 配置 USART 模式
- Mode 选择:Asynchronous
- 波特率:115200
- 硬件流控:None
- 启用 NVIC(中断)(用于接收回调)
- Clock Configuration 选择主频(如 72MHz)
- 生成代码。
4. 代码实现
📌 4.1 USART 初始化
STM32CubeMX 生成 usart.c
:
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);
}
📌 4.2 串口发送数据
方法 1:阻塞发送
char msg[] = "Hello STM32!\r\n";
HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 100);
📌 适用于简单发送,但会占用 CPU 资源。
方法 2:非阻塞发送(中断)
HAL_UART_Transmit_IT(&huart1, (uint8_t*)msg, strlen(msg));
📌 适用于高性能应用,发送完成后触发回调。
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
printf("发送完成!\r\n");
}
}
方法 3:DMA 方式(高效)
HAL_UART_Transmit_DMA(&huart1, (uint8_t*)msg, strlen(msg));
📌 DMA 可实现大数据量传输,适用于高速数据通信。
📌 4.3 串口接收数据
方法 1:阻塞接收
uint8_t rxData[10];
HAL_UART_Receive(&huart1, rxData, 10, 1000);
📌 不适合实时应用,需等待数据到达。
方法 2:中断接收(推荐)
uint8_t rxData;
HAL_UART_Receive_IT(&huart1, &rxData, 1);
数据到达后自动触发回调:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
HAL_UART_Transmit(&huart1, &rxData, 1, 10); // 直接回显
HAL_UART_Receive_IT(&huart1, &rxData, 1); // 继续接收
}
}
📌 适用于实时通信,每次接收 1 字节,避免数据丢失。
方法 3:DMA 接收(适用于大数据)
uint8_t rxBuffer[100];
HAL_UART_Receive_DMA(&huart1, rxBuffer, sizeof(rxBuffer));
📌 DMA 方式适合高频数据传输,如 GPS、蓝牙等。
5. printf 重定向(使用串口打印调试)
STM32 默认不支持 printf 打印,需重定向 printf
到 HAL_UART_Transmit()
。
int fputc(int ch, FILE *f) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
📌 在 main.c 里使用 printf("Hello STM32!\r\n");
即可调试。
6. 串口调试助手测试
- 打开串口助手(如 SSCOM、SecureCRT)
- 选择 对应 COM 口
- 波特率 115200
- 打开串口
- 发送
"hello"
,STM32 应回显数据。
7. 低功耗串口
- STM32 低功耗模式下,USART 可通过 唤醒(Wake-up) 实现低功耗通信。
- 代码示例:
__HAL_UART_ENABLE_IT(&huart1, UART_IT_WUF); // 使能唤醒中断
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI); // 进入低功耗模式
📌 STM32 进入 STOP 模式,可通过串口数据唤醒 MCU。
8. 总结
✅ STM32 USART 是最常用的通信接口,可用于调试、外设通信
✅ 支持阻塞、非阻塞(中断)、DMA 三种方式
✅ 通过 printf
重定向,可直接串口调试
✅ 低功耗模式下,可用串口数据唤醒 MCU
💡 建议新手先学会 USART 发送 & 接收,再深入学习 DMA、低功耗等高级用法! 🚀