You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:50:33