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**** 1861600 points
Other Parts Discussed in Thread: MSP430F6723, MSP430FR2433
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1388206/msp430fr2433-how-to-improve-uart-output-reliability

器件型号:MSP430FR2433
主题中讨论的其他器件:MSP430F6723

工具与软件:

您好!

我们围绕 MSP430FR2433构建的器件之一连接到基于 MSP430F6723构建的另一个器件。 每秒一次的 F6723将通过切换 GPIO 来唤醒 FR2433。 唤醒后、FR2433将通过 UART 输出一些数据。 以下是用于初始化 FR2433的代码:

WDTCTL = WDTPW | WDTCNTCL | WDTSSEL_1 | WDTIS_3; // Start watchdog timer
PM5CTL0 &= ~LOCKLPM5;                    // Disable the GPIO power-on default high-impedance mode to activate previously configured port settings
// Setup clock
__bis_SR_register(SCG0);                 // disable FLL
CSCTL3 |= SELREF__REFOCLK;               // Set REFO as FLL reference source
CSCTL0 = 0;                              // clear DCO and MOD registers
CSCTL1 &= ~(DCORSEL_7);                  // Clear DCO frequency select bits first
CSCTL1 |= DCORSEL_3;                     // Set DCO = 8MHz
CSCTL2 = FLLD_0 + 243;                   // DCODIV = 8MHz
__delay_cycles(3);
__bic_SR_register(SCG0);                 // enable FLL
while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // Poll until FLL is locked
CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK; // set default REFO(~32768Hz) as ACLK source, ACLK = 32768Hz, default DCODIV as MCLK and SMCLK source

// Code to initialize UART
UCA1BR0 = 52; // 8000000/16/9600
UCA1BR1 = 0x00;
UCA1MCTLW = 0x4900 | UCOS16 | UCBRF_1;
UCA1CTLW0 &= ~UCSWRST; // Initialize eUSCI
UCA1IE |= UCRXIE;     // Enable USCI_A0 RX interrupt

// Code to enter into sleep
__bis_SR_register(LPM3_bits | GIE); // Enter LPM3

// Code to wake up from GPIO interrupt
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = PORT2_VECTOR
__interrupt void Port_2(void)
#elif defined(__GNUC__)
void __attribute__((interrupt(PORT1_VECTOR))) Port_2(void)
#else
#error Compiler not supported!
#endif
{
    if (P2IFG & BIT7)
    {
        P2IFG &= ~BIT7;
        __low_power_mode_off_on_exit();
    }
}

 在很大程度上 FR2433可以按预期工作、但 FR2433的 UART 输出有时没有足够好、大概是因为波特率太差以至于 F6723无法识别。 如果 FR2433的输出连续15次保持 gibberish、F6730将自行重新启动并重新初始化 F2433。 这将使整个设置重新正常工作。 或者、如果 F6723发送命令来重新启动 FR2433、此操作通常会再次返回。 这平均每3天和每个 FR2433器件发生一次。 同时、围绕 MSP430I20XX 构建的类似器件很少做到这一点。

我的问题是、如何长期提高 FR2433 UART 输出的可靠性? FR2433上的时钟似乎会随着时间的推移而漂移。 我假设外部晶体可以提供帮助、但 PCB 上没有太多空间。 我不知道是否还有其他选择。

谢谢!

ZL

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

    问题似乎是、UART 的时钟源 SMCLK 需要时间来启动然后稳定。 如果我们缩短唤醒和 UART TX 之间的时间、UART 输出将更有可能出现 gibberish。 数据表规定 REFO 需要50us、DCO 需要16us。 从 LPM3唤醒与 UART TX 启动之间已经有100us 的延迟。 我们可以任意地把它增加到200us 或更多,但我想知道是否有标签或安全,但我们可以使用的不是太多的延迟。

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

    您是否可以让 REFO 在 LPM3下工作?

    您可以使用源自 SMCLK 的计时器来检查 ACLK 的频率。 那么您将知道 SMCLK 何时处于稳定状态。

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

    配置时钟系统后、需要等待 FLL 稳定。 可能需要在退出低功耗模式后等待类似的时间。

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

    您是指类似于以下行的内容吗?

    while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // Poll until FLL is locked

    数据表指出、FLL 需要长达280ms 的时间来锁定、考虑到 FR2433需要每秒唤醒一次、这似乎有点过大。

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

    周先生、您好!

    我假设可以选择使用 REFO 作为 UART 的时钟源、但我担心 REFO 太不准确、可能导致比 SMCLK +一些延迟更严重。

    谢谢!

    ZL

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

    您使用 REF0作为 FLL 的基准。 如果 FLL 比其基准更精确、那将是一个很大的诀窍。

    另一个需要担心的问题是 UART 中的时钟调制。 两个系统都应使用相同的调制模式、或者一个系统可能会在另一个系统出现 zag 时出现 ziging。 这可能足够的额外误差来引起问题。 当 UCOS16=0时、更大的问题。