Files
2026-06-29 19:04:09 +08:00

106 lines
3.0 KiB
C

#include "STC8_SDCC.H"
/* ========================================================================
* 系统常量
* ======================================================================== */
#define UART_BUF_SIZE 32
/* 接收状态 */
#define RX_STATE_DISCONNECTED 0
#define RX_STATE_BINDING 1
#define RX_STATE_CONNECTED 2
/* 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 UNCONNECTED 0 /* 1Hz - 未连接 */
#define NRF_BINDING 1 /* 3Hz - 对频中 */
#define CONNECTED 2 /* 常亮 - 已连接 */
#define NRF_ERROR 4 /* 双闪 - NRF硬件错误 */
/* UART运行模式 */
#define UART_CMD 0
#define UART_SBUS 1
#define UART_CRSF 2
/* ========================================================================
* 全局变量
* ======================================================================== */
// 配置信息
struct CONFIG
{
// 运行模式
uint8 RunMode;
// nrf24使用的通道
uint8 NrfCH;
// nrf24使用的对频短语
uint8 BindPhr[6];
// nrf24地址,40位
uint8 RxAddr[5];
// 对频标志
uint8 BindMagic;
// 记录的发射机地址
uint8 TxAddr[5];
// 回传频率
uint8 TelemRate;
} Config;
// nrf24l01接收的数据
struct RFDATA
{
// nrf24l01一次性接收32byte数据
uint8 RefreshRate;
uint16 CH[15];
uint8 end;
} RF_Data;
// 系统滴答定时器计数 (用于LED闪烁)
static uint8 sys_tick = 0;
/* 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;
/* 定时器计数 (用于LED闪烁) */
static volatile uint16_t sys_tick = 0;
void (*code runModel)(void) = PwmModel;
void (*code outputFun)(void) = PwmUpdate;