打印

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

[复制链接]
616|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CaLipton|  楼主 | 2017-12-26 10:40 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

使用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;
  }
}

相关帖子

沙发
dirtwillfly| | 2017-12-26 11:04 | 只看该作者
配置有问题啊。UCA0MCTLW |=  UCOS16 | UCBRF_1;这一句不太对
建议参考数据手册里常用波特率的配置表,或者这个在线工具https://bbs.21ic.com/icview-1621242-1-1.html

使用特权

评论回复
板凳
Rospiers| | 2017-12-26 11:07 | 只看该作者
先参考一下官方例程,对比一下

使用特权

评论回复
地板
Lewisnx| | 2017-12-26 11:18 | 只看该作者
UCA0MCTLW |=  UCOS16 | UCBRF_1;
这个语句应该用=号赋值,而不应该用 |= 的吧

使用特权

评论回复
5
CCompton| | 2017-12-26 11:29 | 只看该作者
不知道这个值你是怎么算出来的

201208.jpg (287.37 KB )

201208.jpg

使用特权

评论回复
6
Richardd| | 2017-12-26 11:42 | 只看该作者
官方给了1M时钟115200波特率的例程,你可以跑一下,在此基础上再改,别用过采样的配置方式。

使用特权

评论回复
7
Mattheww| | 2017-12-26 11:53 | 只看该作者
配置好时钟与 UCA0MCTLW的关系,对着官方的程序选择合适的参数

使用特权

评论回复
8
Erichk| | 2017-12-26 12:07 | 只看该作者
可能是dco精度不够

使用特权

评论回复
9
i1mcu| | 2017-12-26 16:07 | 只看该作者
使用外部的晶振。

使用特权

评论回复
10
pmp| | 2017-12-26 16:07 | 只看该作者
倍频受到了外部的影响

使用特权

评论回复
11
mmbs| | 2017-12-26 16:08 | 只看该作者
测试了脉冲宽度了吗

使用特权

评论回复
12
Thorald| | 2017-12-26 16:09 | 只看该作者
使用什么频率时钟比较合适?

使用特权

评论回复
13
i1mcu| | 2017-12-26 16:12 | 只看该作者
外部12Mhz的晶振能够正常工作。

使用特权

评论回复
14
pmp| | 2017-12-26 16:12 | 只看该作者
正常的都是晶振频率都是12Mhz。

使用特权

评论回复
15
mmbs| | 2017-12-26 16:12 | 只看该作者
波特率可能存在较大的误差。

使用特权

评论回复
16
Bjorn| | 2017-12-26 16:26 | 只看该作者
必然是外接晶振是精度最好的,不过不知道能不能外接高速晶振。

使用特权

评论回复
17
Rollo| | 2017-12-26 16:45 | 只看该作者
是不是把发送中断也开了?可能是发送导致的中断

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

126

主题

369

帖子

0

粉丝