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 进入接收模式
|
R8_UART0_MCR = 0x04; // RE=0 进入接收模式
|
||||||
|
|
||||||
/* 中断: 接收可用 */
|
/* 中断: 接收可用 */
|
||||||
UART0_ResetRTXFIFO();
|
UART0_CLR_RXFIFO();
|
||||||
UART0_ByteTrigCfg(UART0_Res_1Byte); // 每收到 1 字节触发中断
|
UART0_ByteTrigCfg(UART_1BYTE_TRIG); // 每收到 1 字节触发中断
|
||||||
UART0_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);
|
UART0_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);
|
||||||
PFIC_EnableIRQ(UART0_IRQn);
|
PFIC_EnableIRQ(UART0_IRQn);
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ static void rs485_send(const uint8_t *data, uint8_t len)
|
|||||||
}
|
}
|
||||||
while (R8_UART0_TFC == 0); // 等最后一字节发完
|
while (R8_UART0_TFC == 0); // 等最后一字节发完
|
||||||
mDelayuS(500); // 等待停止位 + 总线释放
|
mDelayuS(500); // 等待停止位 + 总线释放
|
||||||
UART0_ResetRTXFIFO();
|
UART0_CLR_TXFIFO();
|
||||||
RS485_RE_RX();
|
RS485_RE_RX();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,14 +195,22 @@ static void rs485_send_heartbeat(void)
|
|||||||
__attribute__((interrupt("WCH-Interrupt-fast")))
|
__attribute__((interrupt("WCH-Interrupt-fast")))
|
||||||
void UART0_IRQHandler(void)
|
void UART0_IRQHandler(void)
|
||||||
{
|
{
|
||||||
if (UART0_GetITFlag(UART0_II_RECV_RDY)) {
|
switch (UART0_GetITFlag()) {
|
||||||
UART0_ClearITFlag(UART0_II_RECV_RDY);
|
case UART_II_RECV_RDY: // 接收数据就绪
|
||||||
if (_rx_len < RS485_RX_BUF_SIZE) {
|
if (_rx_len < RS485_RX_BUF_SIZE) {
|
||||||
_rx_buf[_rx_len++] = R8_UART0_RBR;
|
_rx_buf[_rx_len++] = UART0_RecvByte();
|
||||||
} else {
|
} else {
|
||||||
_rx_len = 0; // 溢出, 丢弃
|
_rx_len = 0; // 溢出, 丢弃
|
||||||
}
|
}
|
||||||
_rx_last_tick = mstick();
|
_rx_last_tick = mstick();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case UART_II_LINE_STAT: // 线路状态 (帧错误/溢出等)
|
||||||
|
UART0_GetLinSTA(); // 读 LSR 清状态
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user