From db234bad1b39c58e8bcacd418b0c91de16bb3877 Mon Sep 17 00:00:00 2001 From: wangfq Date: Fri, 24 Jul 2026 08:28:10 +0800 Subject: [PATCH] =?UTF-8?q?fix(rs485):=20=E4=BF=AE=E5=A4=8D=20UART0=20API?= =?UTF-8?q?=20=E7=BC=96=E8=AF=91=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - UART0_ResetRTXFIFO → UART0_CLR_RXFIFO/UART0_CLR_TXFIFO (SDK无此函数) - UART0_Res_1Byte → UART_1BYTE_TRIG (正确枚举值) - UART0_GetITFlag() 改为 switch 模式 (无参宏,非函数调用) - 删除不存在的 UART0_ClearITFlag (读RBR自动清中断) - ISR 增加 UART_II_LINE_STAT 处理防中断死锁 --- .../APP/rs485_700bs.c | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/BLE/DLD154Pro_Peripheral_28K/APP/rs485_700bs.c b/BLE/DLD154Pro_Peripheral_28K/APP/rs485_700bs.c index c938d33..e5d55d0 100644 --- a/BLE/DLD154Pro_Peripheral_28K/APP/rs485_700bs.c +++ b/BLE/DLD154Pro_Peripheral_28K/APP/rs485_700bs.c @@ -54,8 +54,8 @@ void rs485_init(void) R8_UART0_MCR = 0x04; // RE=0 进入接收模式 /* 中断: 接收可用 */ - UART0_ResetRTXFIFO(); - UART0_ByteTrigCfg(UART0_Res_1Byte); // 每收到 1 字节触发中断 + UART0_CLR_RXFIFO(); + UART0_ByteTrigCfg(UART_1BYTE_TRIG); // 每收到 1 字节触发中断 UART0_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT); PFIC_EnableIRQ(UART0_IRQn); @@ -77,7 +77,7 @@ static void rs485_send(const uint8_t *data, uint8_t len) } while (R8_UART0_TFC == 0); // 等最后一字节发完 mDelayuS(500); // 等待停止位 + 总线释放 - UART0_ResetRTXFIFO(); + UART0_CLR_TXFIFO(); RS485_RE_RX(); } @@ -195,14 +195,22 @@ static void rs485_send_heartbeat(void) __attribute__((interrupt("WCH-Interrupt-fast"))) void UART0_IRQHandler(void) { - if (UART0_GetITFlag(UART0_II_RECV_RDY)) { - UART0_ClearITFlag(UART0_II_RECV_RDY); - if (_rx_len < RS485_RX_BUF_SIZE) { - _rx_buf[_rx_len++] = R8_UART0_RBR; - } else { - _rx_len = 0; // 溢出, 丢弃 - } - _rx_last_tick = mstick(); + switch (UART0_GetITFlag()) { + case UART_II_RECV_RDY: // 接收数据就绪 + if (_rx_len < RS485_RX_BUF_SIZE) { + _rx_buf[_rx_len++] = UART0_RecvByte(); + } else { + _rx_len = 0; // 溢出, 丢弃 + } + _rx_last_tick = mstick(); + break; + + case UART_II_LINE_STAT: // 线路状态 (帧错误/溢出等) + UART0_GetLinSTA(); // 读 LSR 清状态 + break; + + default: + break; } }