3. UART通信与数据回显

任务目标

在嵌入式AI MCU上配置UART外设,实现与PC串口助手的双向通信:MCU将接收到的每个字节(或字符串)原样发送回PC,以此验证物理链路、引脚配置与中断/轮询逻辑的正确性。

硬件与依赖

  • MCU开发板(以STM32F407为例,其他型号需调整寄存器/库函数名称)
  • USB转TTL模块(连接PC与MCU的UART引脚)
  • PC端串口调试助手(如PuTTY、sscom)
  • HAL库或标准外设库(本案例使用HAL库演示)

接线说明

  • MCU TX (PA2) → USB转TTL RX
  • MCU RX (PA3) → USB转TTL TX
  • GND 两端共地

核心代码实现

以下代码完成UART1的初始化(115200-8-N-1),并在主循环中采用中断方式接收单字节,收到后立即原样发送回PC。使用中断而非轮询,避免阻塞CPU,同时演示最简回显逻辑。

/* main.c 关键部分 */
#include "stm32f4xx_hal.h"

UART_HandleTypeDef huart1;
uint8_t rx_byte;

void UART1_Init(void) {
    __HAL_RCC_USART1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitTypeDef gpio = {0};
    gpio.Pin = GPIO_PIN_2 | GPIO_PIN_3;
    gpio.Mode = GPIO_MODE_AF_PP;
    gpio.Pull = GPIO_PULLUP;
    gpio.Speed = GPIO_SPEED_FREQ_HIGH;
    gpio.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &gpio);

    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;
    HAL_UART_Init(&huart1);

    HAL_UART_Receive_IT(&huart1, &rx_byte, 1);  // 启动中断接收
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart == &huart1) {
        HAL_UART_Transmit(&huart1, &rx_byte, 1, 100);  // 原样回发
        HAL_UART_Receive_IT(&huart1, &rx_byte, 1);    // 重新开启接收
    }
}

int main(void) {
    HAL_Init();
    UART1_Init();
    while (1) {
        // 主循环可处理其他任务,回显由中断完成
    }
}

编译与烧录

  1. 使用STM32CubeIDE创建工程,将上述代码合并至对应文件。
  2. 编译生成.hex/.bin文件,通过ST-Link烧录至开发板。

验证方法

  1. 打开PC串口助手,选择对应COM口,设置波特率115200、数据位8、停止位1、无校验。
  2. 发送任意字符或字符串(如"Hello AI MCU"),观察接收区是否出现完全相同的字符。
  3. 连续发送不同数据(含十六进制0x00~0xFF),确认每个字节均被原样返回,无丢失或乱码。

通过条件:PC发送的所有字节均被逐字回显,且接收内容与发送内容完全一致。若出现乱码,检查波特率匹配与GND共地;若无响应,检查TX/RX是否交叉连接及引脚复用配置。