fix(rs485): 修复死循环导致地感不工作
根因: 1. rs485_send() 中 while(R8_UART0_TFC == 0) 逻辑反了 TFC=0 表示 FIFO 空, ==0 时条件永真 → 死循环卡死主循环 修复: ==0 → !=0 (等 FIFO 空再写下一字节) 2. rs485_init() 从未被调用 gpio_uart_init() 仅写了注释, 未实际调用 → UART0/GPIO 未初始化 修复: 替换注释为实际函数调用 3. 首次心跳立即触发 _hb_last_ms 静态初始化为 0 → 首次 poll 立即发心跳 修复: rs485_init() 末尾 _hb_last_ms = mstick()
This commit is contained in:
@@ -392,7 +392,7 @@ void tm_init(void){
|
|||||||
void gpio_uart_init(void)
|
void gpio_uart_init(void)
|
||||||
{
|
{
|
||||||
/*--- RS485 通信 (PA14=TX, PA15=RX, PA13=RE) ---*/
|
/*--- RS485 通信 (PA14=TX, PA15=RX, PA13=RE) ---*/
|
||||||
/* 由 rs485_init() 统一初始化 UART0 + GPIO + 中断 */
|
rs485_init(); /* 初始化 UART0 + GPIO + 中断 */
|
||||||
|
|
||||||
/*--- 光耦输入 (PB10=IN_1) ---*/
|
/*--- 光耦输入 (PB10=IN_1) ---*/
|
||||||
/* 逻辑待定, 仅初始化引脚为输入上拉 */
|
/* 逻辑待定, 仅初始化引脚为输入上拉 */
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ void rs485_init(void)
|
|||||||
PFIC_EnableIRQ(UART0_IRQn);
|
PFIC_EnableIRQ(UART0_IRQn);
|
||||||
|
|
||||||
RS485_RE_RX(); // 默认接收模式
|
RS485_RE_RX(); // 默认接收模式
|
||||||
|
_hb_last_ms = mstick(); // 对齐心跳起始时刻,避免首次立即触发
|
||||||
PRINT("RS485: init ok, addr=%d, baud=%d\n", g_rs485_id, RS485_BAUD);
|
PRINT("RS485: init ok, addr=%d, baud=%d\n", g_rs485_id, RS485_BAUD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,10 +73,10 @@ static void rs485_send(const uint8_t *data, uint8_t len)
|
|||||||
mDelayuS(100); // 总线稳定
|
mDelayuS(100); // 总线稳定
|
||||||
|
|
||||||
for (uint8_t i = 0; i < len; i++) {
|
for (uint8_t i = 0; i < len; i++) {
|
||||||
while (R8_UART0_TFC == 0); // 等 TX FIFO 空
|
while (R8_UART0_TFC != 0); // 等 TX FIFO 空 (上一字节发完)
|
||||||
R8_UART0_THR = data[i];
|
R8_UART0_THR = data[i];
|
||||||
}
|
}
|
||||||
while (R8_UART0_TFC == 0); // 等最后一字节发完
|
while (R8_UART0_TFC != 0); // 等最后一字节发完
|
||||||
mDelayuS(500); // 等待停止位 + 总线释放
|
mDelayuS(500); // 等待停止位 + 总线释放
|
||||||
UART0_CLR_TXFIFO();
|
UART0_CLR_TXFIFO();
|
||||||
RS485_RE_RX();
|
RS485_RE_RX();
|
||||||
|
|||||||
Reference in New Issue
Block a user