84 lines
2.6 KiB
C
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]);
|
|
}
|
|
}
|