为何向MSP432微控制器发送'!'时Tera Term返回希腊字母α?
问题分析与修复方案
核心问题1:波特率配置不完整导致通信速率不匹配
你的代码仅设置了BRW整数分频寄存器,却将MCTLW小数分频寄存器清零,这会造成波特率计算误差过大,直接引发Tera Term显示乱码。MSP432的EUSCI UART必须结合整数分频(BRW)、小数分频参数(MCTLW中的UCBRF/UCBRS)和过采样模式(UCOS16),才能精准匹配目标波特率。
假设你使用默认48MHz SMCLK、目标波特率9600,正确配置应为:
EUSCI_A0->BRW = 312; // 48MHz / 9600 / 16 = 312 EUSCI_A0->MCTLW = 0x0080; // 开启过采样(UCOS16=1),UCBRF=0,UCBRS=0x00(参考手册波特率误差表选取)
若使用3MHz SMCLK、9600波特率,配置应为:
EUSCI_A0->BRW = 19; // 3MHz / 9600 / 16 ≈ 19.53,取整数部分19 EUSCI_A0->MCTLW = 0x0688; // UCOS16=1,UCBRF=8,UCBRS=0x06
核心问题2:UART配置注释与实际操作不符
代码中CTLW0 |= 0x80实际是将时钟源设为SMCLK,但注释描述模糊,建议显式配置避免混淆:
EUSCI_A0->CTLW0 |= EUSCI_A_CTLW0_SSEL__SMCLK; // 明确指定SMCLK为时钟源
修复后的完整代码示例
#include "MSP.h" int main() { // 复位UART模块 EUSCI_A0->CTLW0 |= EUSCI_A_CTLW0_SWRST; // 配置UART参数:SMCLK为时钟源,8位数据,无校验,LSB优先,1停止位 EUSCI_A0->CTLW0 |= EUSCI_A_CTLW0_SSEL__SMCLK; // 波特率配置(48MHz SMCLK → 9600波特率) EUSCI_A0->BRW = 312; EUSCI_A0->MCTLW = 0x0080; // 配置P1.2/P1.3为UART功能引脚 P1->SEL0 |= 0x0C; P1->SEL1 &= ~0x0C; // 退出复位模式,启用UART EUSCI_A0->CTLW0 &= ~EUSCI_A_CTLW0_SWRST; // 发送字符'!' EUSCI_A0->TXBUF = '!'; // 等待发送完成 while (!(EUSCI_A0->IFG & EUSCI_A_IFG_TXIFG)); while(1); // 无限循环 }
额外排查步骤
- 确认Tera Term的参数(波特率、8位数据、1停止位、无校验)与代码完全一致。
- 检查硬件连接:P1.2(UART_TX)需连接USB转串口模块的RX引脚,P1.3(UART_RX)连接模块TX引脚,注意交叉连接。
- 若仍出现缓冲区循环,排查是否存在未处理的接收中断(当前代码仅发送,大概率还是波特率不匹配导致终端接收异常)。
内容的提问来源于stack exchange,提问作者TheBoomis
相关产品推荐
相关产品推荐

