核心内容摘要
探寻二次元的色彩斑斓:不只“黄”色,更有多彩想象
目录
核心定义与核心差异先理清 “是什么”
原理详解从基础到特化
UART 核心原理异步串行通信三者的基础1UART 帧结构异步通信的核心规则2UART 通信流程
USART 核心原理同步模式补充1USART 同步模式特征2USART 同步 vs 异步对比
LPUART 核心原理低功耗优化1时钟源优化2低功耗模式支持3低功耗唤醒功能
典型用法与选型建议
典型应用场景按场景选型
选型核心原则
程序案例STM32 HAL 库可直接运行前置准备案例 1UART 异步通信最常用串口收发 调试输出功能说明
STM32CubeMX 配置
核心代码HAL 库
测试效果案例 2USART 同步通信带时钟线功能说明
STM32CubeMX 配置
核心代码
测试说明案例 3LPUART 低功耗通信待机唤醒功能说明
STM32CubeMX 配置
核心代码
测试效果
避坑点新手常犯
总结关键点回顾全面理解 UART、USART、LPUART 的核心工作原理明确三者的本质差异掌握各自的典型应用场景并且通过基于 STM32 的实战程序案例掌握实际
使用方法 —— 核心是 “区分差异→原理解析→场景适配→代码落地”这也是嵌入式开发中串口应用的核心知识点我会从基础到实战层层拆解所有案例均基于 STM32 HAL 库新手易上手。
核心定义与核心差异先理清 “是什么”三者均属于串行通信接口核心差异在于通信模式和功耗优化用表格快速区分接口类型全称核心特征核心差异点硬件资源UARTUniversal Asynchronous Receiver/Transmitter通用异步收发器仅支持异步串行通信无时钟线靠波特率同步只有异步模式无同步能力最少TX/RXUSARTUniversal Synchronous/Asynchronous Receiver/Transmitter通用同步异步收发器兼容 UART异步 支持同步串行通信带时钟线功能更全比 UART 多同步模式支持 SPI/I2S多 SCLK 时钟线LPUARTLow Power UART低功耗 UART属于 UART 的低功耗优化版本支持低功耗模式待机 / 休眠下的收发 / 唤醒低功耗优先异步模式唤醒功能兼容 UART 引脚时钟源可选低功耗时钟关键结论USART 包含 UART 的所有功能异步模式是 “超集”LPUART 是 UART 的 “低功耗特化版”无同步模式核心优化功耗日常说的 “串口” 大多指 UARTUSART 工作在异步模式。
原理详解从基础到特化
UART 核心原理异步串行通信三者的基础UART 是异步全双工串行通信“异步” 指收发双方无专用时钟线靠预设相同的波特率实现同步核心是 “帧结构” 和 “波特率匹配”。
1UART 帧结构异步通信的核心规则一个完整的 UART 帧包含以下部分可配置空闲位高电平→ 起始位1位低电平→ 数据位8/9位→ 校验位0/1位奇/偶/无→ 停止位1/
5/2位高电平起始位标识帧开始低电平触发接收端采样数据位核心传输内容如 8 位对应 1 个字节校验位用于检错小型系统常用 “无校验”简化配置停止位标识帧结束高电平波特率每秒传输的比特数如
115200收发双方必须完全一致否则数据乱码。
2UART 通信流程发送端将并行数据如 MCU 内部的 8 位数据按帧结构转为串行信号通过 TX 引脚发送接收端通过 RX 引脚检测起始位按波特率采样每一位数据还原为并行数据核心无需时钟线靠波特率同步硬件自动完成串并转换。
USART 核心原理同步模式补充USART 完全兼容 UART 的异步模式额外支持同步模式核心差异是 “同步模式带时钟线”。
1USART 同步模式特征新增SCLK同步时钟引脚发送端输出时钟接收端按该时钟采样数据无需波特率匹配同步通信无波特率概念同步优势传输速率更高无波特率误差、抗干扰更强适合高速 / 高精度通信同步帧结构比异步帧多了 “时钟同步位”时钟线与数据位严格对齐。
2USART 同步 vs 异步对比模式时钟线同步依据速率适用场景异步无预设波特率中等≤1M普通串口通信如调试同步有发送端 SCLK 时钟高速≥1M高速数据传输如 SPI 替代
LPUART 核心原理低功耗优化LPUART 本质是 UART仅异步针对电池供电 / 低功耗设备做了三大优化1时钟源优化支持选择低功耗时钟LSI/LSE
3
768kHz作为时钟源而非高频系统时钟如 72MHz大幅降低时钟功耗2低功耗模式支持可在 MCU 的 “待机 / 休眠模式” 下工作接收端低功耗模式下仍能检测 RX 引脚的起始位触发 MCU 唤醒发送端低功耗模式下快速唤醒并发送数据完成后立即回到低功耗3低功耗唤醒功能当 RX 引脚检测到预设的 “唤醒字符”如 0x55或起始位时自动唤醒 MCU无需持续运行降低待机功耗μA 级别。
典型用法与选型建议
典型应用场景按场景选型接口类型核心适用场景选型优先级举例UART普通异步通信、调试输出、低速数据传输≤115200 波特率、无低功耗需求最高串口调试、传感器异步通信、AT 指令交互USART高速同步通信、需要时钟同步的场景、兼容 SPI/I2S部分 MCU 支持、替代 UART次高高速数据采集、工业设备同步通信LPUART电池供电设备、低功耗物联网终端NB-IoT/LoRa、待机唤醒场景、长续航设备低功耗场景优先智能手环、传感器节点、电池供电检测仪
选型核心原则优先选 UARTUSART 异步模式满足 90% 的普通串口需求配置简单需高速 / 同步 → 选 USART 同步模式需低功耗 / 电池供电 → 选 LPUART注意STM32 中LPUART 通常只有 1 个如 STM32L 系列UART/USART 数量更多如 STM32F103 有 3 个 USART。
程序案例STM32 HAL 库可直接运行以 STM32F103C8T6UART/USART和 STM32L431LPUART低功耗系列为例分别实现核心功能。
前置准备开发环境STM32CubeMX Keil5/VS Code配置工具STM32CubeMX 配置引脚、时钟、串口参数生成 HAL 库工程硬件连接UART/USARTTX→PA2RX→PA3STM32F103 USART2USART 同步新增 SCLK→PA4LPUARTTX→PB10RX→PB11STM32L431 LPUART1。
案例 1UART 异步通信最常用串口收发 调试输出功能说明实现 UART 异步通信MCU 通过 USART2异步模式即 UART向电脑串口助手发送数据接收电脑发送的数据并回显。
STM32CubeMX 配置引脚USART2_TX→PA2USART2_RX→PA3模式Asynchronous异步参数波特率
数据位
停止位
无校验、全双工时钟APB1 时钟 72MHzSTM32F103。
核心代码HAL 库/* 头文件包含 */ #include stm32f1xx_hal.h #include string.h /* 全局句柄 */ UART_HandleTypeDef huart2; /*
UART初始化CubeMX自动生成无需修改 */ void MX_USART2_UART_Init(void) { huart
Instance USART2; huart
Init.BaudRate 115200; // 波特率 huart
Init.WordLength UART_WORDLENGTH_8B; // 8位数据位 huart
Init.StopBits UART_STOPBITS_1; // 1位停止位 huart
Init.Parity UART_PARITY_NONE; // 无校验 huart
Init.Mode UART_MODE_TX_RX; // 收发模式 huart
Init.HwFlowCtl UART_HWCONTROL_NONE;// 无硬件流控 huart
Init.OverSampling UART_OVERSAMPLING_16; if (HAL_UART_Init(huart
! HAL_OK) { Error_Handler(); } } /*
串口发送字符串封装函数方便调用 */ void UART_SendString(UART_HandleTypeDef *huart, char *str) { HAL_UART_Transmit(huart, (uint8_t*)str, strlen(str),
; // 阻塞发送超时1s } /*
串口接收数据中断接收非阻塞 */ uint8_t uart_recv_buf[100]; // 接收缓冲区 void UART_Receive_IT_Init(void) { // 开启中断接收接收1个字节触发中断 HAL_UART_Receive_IT(huart2, uart_recv_buf,
; } /*
中断回调函数接收完成后执行 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart-Instance USART
{ // 回显接收到的字符 HAL_UART_Transmit(huart2, uart_recv_buf, 1,
; // 重新开启中断接收持续接收 HAL_UART_Receive_IT(huart2, uart_recv_buf,
; } } /*
主函数测试 */ int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); // 初始化中断接收 UART_Receive_IT_Init(); // 发送欢迎语 char welcome[] UART异步通信测试请输入字符将回显\r\n; UART_SendString(huart2, welcome); while (
{ // 主循环无需操作接收靠中断 HAL_Delay(
; } } /* 错误处理函数CubeMX自动生成 */ void Error_Handler(void) { __disable_irq(); while (
{ } }
测试效果硬件STM32 PA2/PA3 接 USB 转 TTL 模块连接电脑串口助手串口助手配置
8N
无流控运行串口助手显示欢迎语输入任意字符STM32 回显该字符。
案例 2USART 同步通信带时钟线功能说明实现 USART 同步模式通信STM32 USART1 作为主设备输出时钟SCLK和数据接收端按时钟采样此处用自环测试SCLK→PA4TX→PA9RX→PA10 短接。
STM32CubeMX 配置引脚USART1_TX→PA9USART1_RX→PA10USART1_CK→PA4SCLK 时钟线模式Synchronous同步参数时钟极性Low、时钟相位1Edge、数据位
停止位
无校验。
核心代码/* 全局句柄 */ UART_HandleTypeDef huart1; /*
USART同步模式初始化 */ void MX_USART1_UART_Init(void) { huart
Instance USART1; huart
Init.BaudRate 115200; // 同步模式波特率仅为参考实际靠时钟 huart
Init.WordLength UART_WORDLENGTH_8B; huart
Init.StopBits UART_STOPBITS_1; huart
Init.Parity UART_PARITY_NONE; huart
Init.Mode UART_MODE_TX_RX; huart
Init.HwFlowCtl UART_HWCONTROL_NONE; huart
Init.OverSampling UART_OVERSAMPLING_16; huart
Init.ClockPrescaler UART_PRESCALER_DIV1; // 时钟分频 huart
AdvancedInit.AdvFeatureInit UART_ADVFEATURE_NO_INIT; // 同步模式配置 if (HAL_UART_Init(huart
! HAL_OK) { Error_Handler(); } // 启用同步时钟 HAL_UARTEx_EnableClock(huart
; } /*
同步发送数据 */ void USART_Sync_SendData(uint8_t *data, uint16_t len) { HAL_UART_Transmit(huart1, data, len,
; } /*
主函数测试 */ int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); uint8_t send_data[] USART同步通信测试\r\n; while (
{ // 同步发送数据 USART_Sync_SendData(send_data, sizeof(send_data)-
; HAL_Delay(
; } }
测试说明同步模式下PA4 输出时钟信号PA9 输出数据示波器可看到时钟与数据严格对齐接收端需连接 SCLK、TX、RX、GND无需配置波特率直接按时钟采样。
案例 3LPUART 低功耗通信待机唤醒功能说明STM32L431低功耗系列LPUART1 实现低功耗通信MCU 进入待机模式LPUART 检测到 RX 引脚的起始位 / 唤醒字符0x55时唤醒 MCU发送响应数据。