msp430波特率到115200时无**常发送接收

2019-07-14 14:23发布


使用msp430fr5969,利用串口助手发送反馈,当调整波特率在115200以下时都可以正常的发送接收,当波特率达到115200后以8000khz就会乱码,调整了DOC到16Mhz尝试,不发生数据也会一直接收,请问为什么会出现这样的情况,将发送波特率调整到115200需要注意什么吗?
int main(void)
{
  WDTCTL = WDTPW | WDTHOLD;                 // Stop Watchdog

  // Configure GPIO
  P2SEL1 |= BIT0 | BIT1;                    // USCI_A0 UART operation
  P2SEL0 &= ~(BIT0 | BIT1);

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

  // Startup clock system with max DCO setting ~8MHz
  CSCTL0_H = CSKEY >> 8;                    // Unlock clock registers
  CSCTL1 = DCOFSEL_4 | DCORSEL;             // Set DCO to 16MHz
  CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK;
  CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;     // Set all dividers
  CSCTL0_H = 0;                             // Lock CS registers

  // Configure USCI_A0 for UART mode
  UCA0CTLW0 = UCSWRST;                      // Put eUSCI in reset
  UCA0CTLW0 |= UCSSEL__SMCLK;               // CLK = SMCLK
  // Baud Rate calculation
  // 8000000/(16*9600) = 52.083
  // Fractional portion = 0.083
  // User's Guide Table 21-4: UCBRSx = 0x04
  // UCBRFx = int ( (52.083-52)*16) = 1
  UCA0BR0 = 9;                             // 16000000/16/115200
  UCA0BR1 = 0x00;
  UCA0MCTLW |=  UCOS16 | UCBRF_1;
  UCA0CTLW0 &= ~UCSWRST;                    // Initialize eUSCI
  UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt

  __bis_SR_register(LPM3_bits | GIE);       // Enter LPM3, interrupts enabled
  __no_operation();                         // For debugger
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
#else
#error Compiler not supported!
#endif
{
  switch(__even_in_range(UCA0IV, USCI_UART_UCTXCPTIFG))
  {
    case USCI_NONE: break;
    case USCI_UART_UCRXIFG:
      while(!(UCA0IFG&UCTXIFG));
      UCA0TXBUF = UCA0RXBUF;
      __no_operation();
      break;
    case USCI_UART_UCTXIFG: break;
    case USCI_UART_UCSTTIFG: break;
    case USCI_UART_UCTXCPTIFG: break;
  }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
Rospiers
1楼-- · 2019-07-14 19:51
先参考一下官方例程,对比一下
Lewisnx
2楼-- · 2019-07-14 22:07
 精彩回答 2  元偷偷看……
CCompton
3楼-- · 2019-07-15 04:00
不知道这个值你是怎么算出来的
Richardd
4楼-- · 2019-07-15 04:38
官方给了1M时钟115200波特率的例程,你可以跑一下,在此基础上再改,别用过采样的配置方式。
Mattheww
5楼-- · 2019-07-15 07:11
配置好时钟与 UCA0MCTLW的关系,对着官方的程序选择合适的参数
Erichk
6楼-- · 2019-07-15 09:48
可能是dco精度不够

一周热门 更多>