Files
ZhaTianRC/rx/src/uart.c
T
2026-06-27 19:36:53 +08:00

84 lines
2.6 KiB
C

#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]);
}
}