USART串口通信(串口调试助手收发数据)

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 选择串口

  1. 打开 STM32CubeMX
  2. Pinout 界面 选择 USART1
    • PA9(TX) → USART1_TX
    • PA10(RX) → USART1_RX
  3. 配置 USART 模式
    • Mode 选择:Asynchronous
    • 波特率:115200
    • 硬件流控:None
  4. 启用 NVIC(中断)(用于接收回调)
  5. Clock Configuration 选择主频(如 72MHz)
  6. 生成代码。

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 打印,需重定向 printfHAL_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. 串口调试助手测试

  1. 打开串口助手(如 SSCOM、SecureCRT)
  2. 选择 对应 COM 口
  3. 波特率 115200
  4. 打开串口
  5. 发送 "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、低功耗等高级用法! 🚀

评论
列表