#include "uart.h" /* ======================================================================== * UART1 - 串口通信 (使用Timer2做波特率发生器) * ======================================================================== */ static void UART1_Init(void) { /* 使用 Timer2 做波特率发生器 */ /* 115200 @ 24MHz: T2 reload = 65536 - 52 = 0xFFCC */ T2H = 0xFF; T2L = 0xCC; AUXR |= T2x12; /* T2: 1T模式 */ AUXR |= T2R; /* 启动T2 */ /* UART1 配置: 8位可变波特率, 模式1 */ SCON = 0x50; /* 模式1, REN=1 */ AUXR |= S1ST2; /* UART1使用T2做波特率 */ PCON &= ~SMOD0; /* SMOD0=0, 帧格式8位数据 */ /* 使能接收中断 */ ES = 1; RI = 0; } /* UART1 中断服务 */ void UART1_Interrupt(void) __interrupt(4) { if (RI) { RI = 0; uint8_t dat = SBUF; if (out_mode == OUT_MODE_CRFS) { /* CRFS 模式: 接收飞控发来的 CRSF 帧并缓存转发 */ if (dat == 0xEE) { /* CRSF 帧起始 */ crfs_forward_len = 0; crfs_forward_buf[crfs_forward_len++] = dat; } else if (crfs_forward_len > 0 && crfs_forward_len < sizeof(crfs_forward_buf)) { crfs_forward_buf[crfs_forward_len++] = dat; /* 如果收到完整帧 (根据长度字段), 标记为待转发 */ if (crfs_forward_len >= 3) { uint8_t frame_len = crfs_forward_buf[1] + 2; /* type+payload+crc = length field */ if (crfs_forward_len >= frame_len) { /* 完整帧已收到, 保持缓存, 主循环会处理转发 */ } } } } else { /* 命令接收: 回车/换行结束 */ if (dat == '\r' || dat == '\n') { if (uart_rx_idx > 0) { uart_rx_buf[uart_rx_idx] = '\0'; uart_cmd_ready = 1; } uart_rx_idx = 0; } else { if (uart_rx_idx < UART_BUF_SIZE - 1) { uart_rx_buf[uart_rx_idx++] = dat; } } } } if (TI) { TI = 0; } } static void UART1_SendByte(uint8_t dat) { SBUF = dat; while (!TI); TI = 0; } static void UART1_SendString(const char *s) { while (*s) { UART1_SendByte((uint8_t)(*s++)); } } static void UART1_SendStringLen(const char *s, uint8_t len) { for (uint8_t i = 0; i < len; i++) { UART1_SendByte((uint8_t)s[i]); } }