90 lines
3.0 KiB
C
90 lines
3.0 KiB
C
#include "STC8_SDCC.H"
|
|
#include <string.h>
|
|
|
|
/* ========================================================================
|
|
* 系统常量
|
|
* ======================================================================== */
|
|
|
|
#define FOSC 24000000UL /* 系统主频 24MHz */
|
|
#define PWM_PERIOD 5000 /* 20ms / 4us = 5000 步 */
|
|
#define PWM_MIN 250 /* 1.0ms 脉宽 (4us/步) */
|
|
#define PWM_MAX 500 /* 2.0ms 脉宽 */
|
|
#define PWM_MID 375 /* 1.5ms 脉宽 */
|
|
#define CHANNEL_COUNT 4 /* 4路PWM输出 */
|
|
|
|
#define UART_BUF_SIZE 32
|
|
|
|
/* 接收状态 */
|
|
#define RX_STATE_DISCONNECTED 0
|
|
#define RX_STATE_BINDING 1
|
|
#define RX_STATE_CONNECTED 2
|
|
|
|
/* 输出模式 */
|
|
#define OUT_MODE_PWM 0
|
|
#define OUT_MODE_SBUS 1
|
|
#define OUT_MODE_UART 2
|
|
#define OUT_MODE_CRFS 3
|
|
|
|
/* EEPROM 地址 (IAP) */
|
|
#define EEPROM_ADDR_BIND_FLAG 0x0000
|
|
#define EEPROM_ADDR_TX_ADDR 0x0001 /* 5字节 */
|
|
#define EEPROM_ADDR_RF_CH 0x0006
|
|
#define EEPROM_ADDR_BIND_PHRASE 0x0007 /* 6字节 */
|
|
#define EEPROM_BIND_MAGIC 0x5A /* 已对频标志 */
|
|
|
|
/* 数据包格式 (与发射机一致) */
|
|
#define RF_SYNC_BYTE0 0xAA
|
|
#define RF_SYNC_BYTE1 0x55
|
|
#define RF_PACKET_SIZE 32
|
|
#define RF_PHRASE_LEN 6
|
|
|
|
/* LED 闪烁模式 */
|
|
#define LED_BLINK_SLOW 0 /* 1Hz - 未连接 */
|
|
#define LED_BLINK_FAST 1 /* 3Hz - 对频中 */
|
|
#define LED_ON 2 /* 常亮 - 已连接 */
|
|
#define LED_OFF 3 /* 熄灭 */
|
|
#define LED_BLINK_DOUBLE 4 /* 双闪 - NRF硬件错误 */
|
|
|
|
/* ========================================================================
|
|
* 全局变量
|
|
* ======================================================================== */
|
|
|
|
/* PWM 通道脉宽值 (4us单位, 放在 xdata) */
|
|
static volatile uint16_t __xdata pwm_ch[CHANNEL_COUNT];
|
|
|
|
/* 接收状态 */
|
|
static uint8_t rx_state = RX_STATE_DISCONNECTED;
|
|
static uint8_t out_mode = OUT_MODE_PWM;
|
|
|
|
/* 对频信息 (放在 xdata) */
|
|
static uint8_t __xdata bind_phrase[RF_PHRASE_LEN] = "LOVE";
|
|
static uint8_t __xdata tx_addr[NRF_ADDR_WIDTH] = {0xE7, 0xE7, 0xE7, 0xE7, 0xE7};
|
|
static uint8_t rf_channel = 40;
|
|
|
|
/* 信号丢失计数 */
|
|
static uint16_t lost_packet_cnt = 0;
|
|
#define LOST_PACKET_TIMEOUT 500 /* 500次接收超时后判丢失 (~5秒 @ 100Hz) */
|
|
|
|
/* NRF 硬件错误标志 */
|
|
static uint8_t nrf_hw_error = 0;
|
|
|
|
/* 电池电压 */
|
|
static volatile uint16_t bat_voltage_mv = 0;
|
|
|
|
/* 回传数据 */
|
|
static uint8_t telem_rssi = 0; /* 信号强度 (0-100) */
|
|
static uint8_t telem_packet_loss = 0; /* 丢包率 (0-100%) */
|
|
static uint8_t telem_rate_hz = 2; /* 回传频率 1-10Hz, 默认2Hz */
|
|
|
|
/* CRFS 模式下接收的飞控转发数据 */
|
|
static uint8_t __xdata crfs_forward_buf[24];
|
|
static uint8_t crfs_forward_len = 0;
|
|
|
|
/* UART 接收缓冲 (放在 xdata) */
|
|
static uint8_t __xdata uart_rx_buf[UART_BUF_SIZE];
|
|
static uint8_t uart_rx_idx = 0;
|
|
static volatile uint8_t uart_cmd_ready = 0;
|
|
|
|
/* 定时器计数 (用于LED闪烁) */
|
|
static volatile uint16_t sys_tick = 0;
|