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) {
// 主循环可处理其他任务,回显由中断完成
}
}
编译与烧录
- 使用STM32CubeIDE创建工程,将上述代码合并至对应文件。
- 编译生成.hex/.bin文件,通过ST-Link烧录至开发板。
验证方法
- 打开PC串口助手,选择对应COM口,设置波特率115200、数据位8、停止位1、无校验。
- 发送任意字符或字符串(如"Hello AI MCU"),观察接收区是否出现完全相同的字符。
- 连续发送不同数据(含十六进制0x00~0xFF),确认每个字节均被原样返回,无丢失或乱码。
通过条件:PC发送的所有字节均被逐字回显,且接收内容与发送内容完全一致。若出现乱码,检查波特率匹配与GND共地;若无响应,检查TX/RX是否交叉连接及引脚复用配置。