使用msp430波特率到115200时无法正常发送接收

2019-03-24 08:28发布

使用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条回答
wangcen
1楼-- · 2019-03-25 11:55
lcofjp 发表于 2017-6-26 22:52
官方给了1M时钟115200波特率的例程,你可以跑一下,在此基础上再改,别用过采样的配置方式。

我看到了用115200配置的,但它的例子是将TXBUF和RXBUF直接连接通信,我在它的基础上尝试使用串口通信
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;
  }

还是出现了乱码的情况
wangcen
2楼-- · 2019-03-25 16:48
lcofjp 发表于 2017-6-26 22:52
官方给了1M时钟115200波特率的例程,你可以跑一下,在此基础上再改,别用过采样的配置方式。

如图
wangcen
3楼-- · 2019-03-25 17:43
 精彩回答 2  元偷偷看……
lcofjp
4楼-- · 2019-03-25 23:08
wangcen 发表于 2017-6-27 08:39
修改的参数应该没有问题,使用开发板上的TXBUF和RXbuf直接连接来传输可以,但是利用串口助手电脑收发在波 ...

可能是dco精度不够
wangcen
5楼-- · 2019-03-26 01:02
lcofjp 发表于 2017-6-27 09:06
可能是dco精度不够

那使用什么频率时钟比较合适?
wangcen
6楼-- · 2019-03-26 05:08
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章