工具与软件:
您好!
我目前正在为旧产品重写一些代码。 具有 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();
非常感谢您提出任何想法或建议。