This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2433:UART输出字节并不总是正确的

Guru**** 2538960 points
Other Parts Discussed in Thread: MSP430FR2433

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1087293/msp430fr2433-uart-output-byte-is-not-always-correct

部件号:MSP430FR2433

您好,

我是MSP430系列微控制器的新产品,我正在使用MSP430FR2433开发套件的UART。

但当我将'A'(十六进制:0x41)的字节输出到USI_A0 UART时,结果有时不正确。

我检查了示例代码"MSP430FR24xx Demo - USI_A0 External Loopback test @ 11.52万 b波特",但结果与0xC1和0x81而不是0x41相同。

以下是输出日志。

C1 C1 41 C1 41 41 C1 41 41 C1 C1 41 41 C1 C1 41 C1 41 C1 C1 C1 C1 41 41 C1 41 C1 41 C1 41 41 C1 41 C1 C1 C1 41 41 41 C1 41 C1 C1 41 C1 41 41 C1 41 C1 C1 41 C1 41 41 41 41 41 C1 41 C1 C1 C1 C1 C1 C1 C1 41 41 81 C1 41 41 C1 81 C1 C1 C1 41 C1 81 41 C1 41 81 C1 C1 81 C1 C1 41

int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	    // stop watchdog timer

	P1DIR = 0x01;
    P1OUT = 0x00;
    P1REN = 0x00;

    P1SEL1 &= ~(BIT4 | BIT5);       // USCI_A0 UART operation
    P1SEL0 |= BIT4 | BIT5;

    UCA0CTLW0 |= UCSWRST;           // Put UART A0 to software reset
    UCA0CTLW0 |= UCSSEL__SMCLK;     // Use SMCLK(1MHz) for baud rate calculation
    UCA0BRW = 8;                    // N = f/BR = 1000000/115200 = 8.68055555
    UCA0MCTLW = 0xD600;             // 1000000/115200 - INT(1000000/115200)=0.68 -> (From UG TABLE 22-4)0xD6
    UCA0CTLW0 &= ~UCSWRST;          // Releas UART software reset

    PM5CTL0 &= ~LOCKLPM5;           // Disable the GPIO power-on default high-impedance mode to activate previously configured port settings

    char ch = 'A';
    while(1){
        UCA0TXBUF = ch;
        __delay_cycles(500000);
    }

	return 0;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    刘永华:

    我在我的端尝试了您的代码,我能够重现该问题。 根本原因是SMCLK频率不是完美的1MHz。 由于它是从参考时钟(32.768kHz)导出的,因此产生的SMCLK频率为~1.048Mhz。 使用 此在线计算器 调整新时钟频率的预校准值将产生以下设置:

        UCA0BR0 = 9;                             
        UCA0MCTLW = 8;

    当我用上面的代码替换第14-15行时,我看不到损坏。 请告诉我是否有效。

    Evan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Evan:

    非常感谢您的解释。 您的建议效果很好。

    还有一个问题,如何将我的BRCLK更改为其它频率,例如4.194MHz或1MHz?

    因为我想将波特率驱动为23.04万而不是11.52万。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    要驱动23.04万波特,您不需要更改BRCLK。 使用在线计算器可获得以下结果:

    您可以尝试:

        UCA0BR0 = 4;                             
        UCA0MCTLW = 170;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的详细说明。

    我尝试更改变量 UCA0BR0 = 4; and UCA0MCTLW = 170; but the serial monitor printed nothing.

    我也尝试过其他的价值,例如175 , it print out 0x80 instead of 0x41.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您使用的是哪种串行显示器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉最后回复。 我尝试过Putty和SCOM。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Leo:

    感谢您的回复。 我还想了一些。 我认为问题在于启动板UART->USB桥(是ez FET调试器的一部分)不支持23.04万。 请参阅 MSP Debuggers User's Guide (MSP调试程序用户指南)中的表4

    如果您有逻辑分析器,您应该能够直接探测引脚以查看UART数据。