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.

[参考译文] CCS/MSP430FR2532:波特率问题

Guru**** 2386620 points
Other Parts Discussed in Thread: MSP430FR2532
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/765293/ccs-msp430fr2532-baud-rate-issue

器件型号:MSP430FR2532

工具/软件:Code Composer Studio

大家好、

我有一个 MSP430FR2532项目需要使用波特率为57600的 UART、因为另一侧的默认波特率为57600。 在开发过程中、MSP430FR2532和 FTDI USB-UART 适配器(FT232R)之间的通信在9600、19200、38400时效果极佳。 但是、一旦我将波特率增加到57600、从 FR2532发送到 FT232R 的消息就会被始终识别、但是从 FT232R 发回 MSP430的消息会不时损坏、尤其是第一个消息块、通常为前10个字节左右。

下面是用于初始化时钟和 UART 的代码

//设置时钟
__bis_SR_register (SCG0); //禁用 FLL
CSCTL3 |= SELREF_REFOCLK; //将 REFO 设置为 FLL 基准源
CSCTL0 = 0; //清除 DCO 和 MOD 寄存器
CSCTL1 &=~(DCORSEL_7); //清除 DCO 频率选择位第一
个 CSCTL1 |= DCORSEL_3; //设置 DCO = 8MHz
CSCTL2 = FLLD_0 + 242; // DCODIV = 8MHz
__delay_cycles (3);
__BIC_SR_register (SCG0); //启用 FLL
while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));//


初始化轮询直到 FLL 锁定 CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源,ACLK = 32768Hz;// UCCL0
| UCCL0 = UCCL0 | UCCL0 | UCCTRL0 = 327UCCTRL0 | UCTLK 源;//将 UCCTL0 = 327UCCL0 = UCCL0 | UCCL0 = UCCL0 | UCCL0 = UCCL0


//波特率计算
// 8000000/57600 = 138.889
// OS16 = 1、UCBR1 = 8、UCBRF1 = 10
//分数部分= 0.889
//用户指南表21-4:UCBRSx = 0xF7
UCA1BR0 = 8; // 8000000/57600/16
UCA1BR1 = 0x00;
UCA1MCTLW = 0xF700 | UCOS16 | UCBRF_10;
UCA1CTLW0 &=~UCSWRST; //初始化 eUSCI
UCA1IE |= UCRXIE; //启用 USCI_A1 RX 中断 

不确定是否相关、MCU 将保持在 LPM3模式、每100ms 唤醒一次、或从 UART1/FT232R 接收到一条消息。

我在这里会错过什么? 其他一些帖子报告 FR2532的工作正常、仅为57600、甚至为115200。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Zhihoung、
    正如您仅提供初始化代码一样、我可以为您提供一些指示、以便您了解哪些方面。
    根据您的理解、您将在 LPM3中运行 MSP430。 这意味着 MSP430 CPU 和 DCO 处于关断状态、因此需要启动。 数据表中指定的启动时间为典型值。 10µs μ A。 这只是一个典型值。 57600波特时的脉冲位时间为17.4µs μ s。 因此、即使假设使用10µs μ s 进行完美的典型启动、在从 UART 采样传入数据时也会面临超过半个位周期的延迟。 这可能已经是第一个基本问题。
    有两种可能的方法、即如何处理这种情况。 第一个是干净的、不会进入 LPM3、但至少保持在 LPM0中、在 LPM0中、启动时间要短得多(最坏情况200ns + 2.5/fDCO)。 第二个是复杂的、将 UART RX IO 切换为 GPIO 中断功能、当进入 LPM3时、牺牲 UART 通信的第一个字节并将其用于从 LPM3唤醒、然后在第一个字节结束时切换回 UART 功能。 但这是相当棘手的、并不是真正可靠的。
    其他额外的影响因素可能是 RX 缓冲区读数太晚。 这可能与其他代码部分相关、此处不可见和/或 UART ISR 的构建。
    但是、LPM3的使用和相关的启动方面很可能是主要问题。

    此致
    Peter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的斯佩瓦克先生:

    快速响应的存储罐。 DCO 的启动时间是我错过的时间。 我有怀疑、但没有进行实际计算。 当我让 FR2532只进入 LPM0时、我的代码开始工作。

    为了回答您的问题、我刚刚将字节从 UCA1RXBUF 传输到 ISR 中的环形缓冲器中。 这将解释为什么只有第一个接收到的消息块被破坏。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    李先生、您好!
    非常感谢您的反馈和澄清。 您的问题似乎已解决、因此我将关闭该线程。

    此致
    Peter