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.
工具与软件:
您好!
我目前正在为旧产品重写一些代码。 具有 MSP430F 微控制器、并使用 ISL83077E RS422收发器。 默认实现使用115200波特率和 RTS/CTS 硬件流控制。
9600时一切似乎都运行良好;RX 中断触发、我将接收到的字符弹出到循环缓冲区中并退出:
#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; } }
但是、当波特率设置为115200时、会丢失数据。 到 RX 中断触发时、我加载第一个字节时、它已经错过了前5个左右字节、然后它继续错过大部分数据(奇数字节已完成)。 我摆弄过代码优化和编译器优化级别、但没有任何变化。 我还尝试了不同的波特率(高于9600) 、但都有相同的问题。
对于 SMCLK 上的4 MHz、时钟源为8 MHz crystal /4:
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;
UART 初始化:
#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();
非常感谢您提出任何想法或建议。
忘记了提及无论波特率如何、传输都能正常工作(即仅传输一个字节、等待 TX 缓冲区为空、然后对每个字节重复)
您的比特率设置似乎可疑。
UMCTL0 = 0xDD 会设置 UCOS0、因此 UBRx 的值必须为2、而不是34。
调制控制也已关闭。 不确定为什么不使用15.3.13用户指南中提供的值
这来自产品的旧源代码、因此我假设它是正确的。 此外,这个计算器同意数字: https://mspgcc.sourceforge.net/baudrate.html
我 在 MSP430x1xx 系列用户指南(修订版 F)中找不到15.3.13。 您正在查看哪个用户指南?
抱歉、我抓住了错误的指南。
我能想到的唯一一个可能导致数据丢失的情况是使用关闭 XT2的低功耗模式。