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构建的器件之一连接到基于 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时、更大的问题。