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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user