3、UART硬件引脚配置:GPIO复用功能(AF)模式设置,TX/RX引脚电气特性
UART通信的物理层实现依赖于MCU的GPIO引脚。在绝大多数MCU中,UART的TX(发送)和RX(接收)引脚并非专用引脚,而是与通用GPIO引脚复用。要使这些引脚工作在UART模式,必须正确配置GPIO的复用功能(Alternate Function, AF)模式,并合理设置引脚的电气特性,以确保信号完整性。
3.1 GPIO复用功能(AF)模式原理
MCU的每个GPIO引脚通常可以连接多个内部外设(如UART、SPI、I2C、定时器等)。通过配置GPIO寄存器,可以将引脚从默认的通用输入输出模式切换到特定外设的专用功能模式,即复用功能模式。
核心概念: 复用功能(AF)模式允许一个物理引脚服务于多个内部数字外设,通过AF选择寄存器(如GPIOx_AFRL/AFRH)来指定具体连接到哪个外设。
配置UART引脚进入AF模式的典型步骤如下:
- 使能GPIO时钟: 通过RCC(Reset and Clock Control)寄存器使能对应GPIO端口的时钟。
- 使能UART时钟: 通过RCC使能UART外设时钟。
- 配置引脚模式为复用功能: 设置GPIOx_MODER寄存器,将TX和RX引脚对应的位段配置为
10(复用功能模式)。 - 选择复用功能编号(AFR): 根据芯片数据手册,在GPIOx_AFRL(低8位引脚)或GPIOx_AFRH(高8位引脚)寄存器中写入对应的AF编号(如AF7通常对应UART)。
- 配置引脚电气特性: 设置输出类型、上拉/下拉、速度等。
提示: 不同MCU系列(如STM32F1/F4/G0、GD32、AT32)的AF编号映射可能不同。务必查阅对应型号的数据手册(Datasheet)中的“Alternate function mapping”章节,确认UART_TX/UART_RX对应的AFx值。
3.2 TX/RX引脚电气特性配置
UART通信的稳定性与引脚的电气特性密切相关。错误的电气配置可能导致信号畸变、通信误码甚至外设损坏。主要配置项包括:
| 电气参数 | TX引脚(输出) | RX引脚(输入) | 配置建议 |
|---|---|---|---|
| 输出类型(OTYPER) | 推挽(Push-Pull) | 不适用(输入模式) | 标准UART使用推挽输出,驱动能力强,上升/下降沿陡峭。 |
| 上拉/下拉(PUPDR) | 无上拉/下拉(通常) | 上拉(Pull-up) | RX引脚配置为上拉,确保空闲状态为高电平,防止浮空引入噪声。 |
| 输出速度(OSPEEDR) | 高速(High)或极高速(Very High) | 不适用(输入模式) | 根据波特率选择:115200bps以下可用中速;更高波特率建议使用高速。 |
| 输入施密特触发器 | 不适用 | 使能(默认) | 施密特触发输入可提高噪声容限,建议保持使能。 |
避坑指南: 部分MCU的TX引脚在复用功能模式下,其输出类型必须设置为推挽,否则UART无法正常发送数据。同时,RX引脚的上拉电阻值通常为40kΩ左右,若外部电路已有强上拉,可配置为浮空输入(No pull-up/pull-down)。
3.3 典型配置代码示例(基于STM32 HAL库风格寄存器操作)
以下代码展示了如何通过直接寄存器操作,将PA9配置为UART1_TX(AF7),PA10配置为UART1_RX(AF7),并设置电气特性:
/* 使能GPIOA和USART1时钟 */
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
/* 配置PA9 (TX) 为复用功能模式 */
GPIOA->MODER &= ~(GPIO_MODER_MODER9); // 清除原模式
GPIOA->MODER |= GPIO_MODER_MODER9_1; // 设置为复用功能 (10)
/* 配置PA10 (RX) 为复用功能模式 */
GPIOA->MODER &= ~(GPIO_MODER_MODER10);
GPIOA->MODER |= GPIO_MODER_MODER10_1;
/* 选择复用功能AF7 (USART1) */
GPIOA->AFR[1] &= ~(GPIO_AFRH_AFSEL9 | GPIO_AFRH_AFSEL10); // 清除AF选择
GPIOA->AFR[1] |= (7 << GPIO_AFRH_AFSEL9_Pos) | (7 << GPIO_AFRH_AFSEL10_Pos); // 写入AF7
/* 配置电气特性 */
// TX: 推挽输出,高速,无上拉/下拉
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_9; // 推挽
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9; // 高速
GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR9; // 无上拉/下拉
// RX: 输入模式,上拉,速度设置无效
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR10_0; // 上拉
3.4 引脚配置流程与信号路径
下图展示了从GPIO引脚到UART外设内部的数据路径,以及AF模式下的信号路由关系:
3.5 电气特性配置速查表
下表总结了不同波特率下推荐的TX引脚输出速度配置,以及RX引脚的上拉策略:
| 波特率范围 | TX输出速度 | RX上拉配置 | 备注 |
|---|---|---|---|
| ≤ 9600 bps | 低速(Low) | 上拉(Pull-up) | 低速下对边沿要求低,低速可降低EMI。 |
| 9600 ~ 115200 bps | 中速(Medium) | 上拉(Pull-up) | 常用范围,中速平衡功耗与信号质量。 |
| 115200 ~ 921600 bps | 高速(High) | 上拉(Pull-up) | 高速下需保证上升/下降时间,避免码间干扰。 |
| > 921600 bps | 极高速(Very High) | 上拉或浮空(视外部电路) | 极高速时需配合外部收发器,内部上拉可能影响阻抗匹配。 |
调优建议: 在PCB布局中,UART的TX和RX走线应尽量短且远离高频时钟线。若通信距离超过30cm,建议在TX引脚串联22Ω~33Ω的电阻以抑制过冲,并在RX引脚对地并联10pF电容以滤除高频噪声。