fix(rs485): 修复 UART0 API 编译错误

- 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 处理防中断死锁
This commit is contained in:
wangfq
2026-07-24 08:28:10 +08:00
parent d50135c77b
commit db234bad1b
+14 -6
View File
@@ -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);
switch (UART0_GetITFlag()) {
case UART_II_RECV_RDY: // 接收数据就绪
if (_rx_len < RS485_RX_BUF_SIZE) {
_rx_buf[_rx_len++] = R8_UART0_RBR;
_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;
}
}