主题中讨论的其他器件: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