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.

[参考译文] MSP430F149:在波特率大于9600时、UART Rx 中断丢失字符

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1478088/msp430f149-uart-rx-interrupt-losing-characters-at-baud-rates-faster-than-9600

器件型号:MSP430F149

工具与软件:

您好!

我目前正在为旧产品重写一些代码。 具有 MSP430F 微控制器、并使用 ISL83077E RS422收发器。 默认实现使用115200波特率和 RTS/CTS 硬件流控制。

9600时一切似乎都运行良好;RX 中断触发、我将接收到的字符弹出到循环缓冲区中并退出:

Fullscreen
1
2
3
4
5
6
7
#pragma vector=USART0RX_VECTOR
__interrupt void USART0RX_ISR(void) {
rx_buf[rx_buf_write_idx++] = (uint8_t)U0RXBUF;
if (rx_buf_write_idx == 32) {
rx_buf_write_idx = 0;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

但是、当波特率设置为115200时、会丢失数据。 到 RX 中断触发时、我加载第一个字节时、它已经错过了前5个左右字节、然后它继续错过大部分数据(奇数字节已完成)。 我摆弄过代码优化和编译器优化级别、但没有任何变化。 我还尝试了不同的波特率(高于9600) 、但都有相同的问题。

对于 SMCLK 上的4 MHz、时钟源为8 MHz crystal /4:

Fullscreen
1
2
3
BCSCTL1 = 0; // Enable XTAL2 (no ACLK)
BCSCTL2 = SELM_2 + SELS + DIVM_1 + DIVS_1; // Main X2 clock for SM, /2 from 8M to 4M
IFG1 &= ~OFIFG;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

UART 初始化:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define CLOCK_RATE (4000000L)
#define BAUD_RATE (115200L)
#define BAUD_MOD (0xDD)
#define BAUD_RELOAD ((uint32_t)(CLOCK_RATE / BAUD_RATE))
UCTL0 = SWRST;
UBR10 = (BAUD_RELOAD >> 8) & 0xFF;
UBR00 = (BAUD_RELOAD & 0xFF);
UMCTL0 = BAUD_MOD;
P3DIR |= BIT2; // CTS output
P3OUT |= BIT2;
P3SEL |= BIT4 + BIT5; // Set UART function
UCTL0 = CHAR + SWRST;
UTCTL0 = SSEL1 + TXEPT; // 8 bit, no parity, 1 stop bit
ME1 |= UTXE0 + URXE0; // Enable TX & RX
UCTL0 = CHAR;
IE1 |= URXIE0; // Enable RX interrupt
P3OUT &= ~BIT2; // Ready to receive
_EINT();
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

非常感谢您提出任何想法或建议。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    忘记了提及无论波特率如何、传输都能正常工作(即仅传输一个字节、等待 TX 缓冲区为空、然后对每个字节重复)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的比特率设置似乎可疑。

    UMCTL0 = 0xDD 会设置 UCOS0、因此 UBRx 的值必须为2、而不是34。

    调制控制也已关闭。 不确定为什么不使用15.3.13用户指南中提供的值

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这来自产品的旧源代码、因此我假设它是正确的。 此外,这个计算器同意数字: https://mspgcc.sourceforge.net/baudrate.html

    我 在 MSP430x1xx 系列用户指南(修订版 F)中找不到15.3.13。 您正在查看哪个用户指南?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    抱歉、我抓住了错误的指南。

    我能想到的唯一一个可能导致数据丢失的情况是使用关闭 XT2的低功耗模式。