Initial commit - sync AliceRC to Gitea
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* @file adc.h
|
||||
* @brief ADC 单通道查询 (电池电压检测)
|
||||
*/
|
||||
#ifndef __ADC_H
|
||||
#define __ADC_H
|
||||
|
||||
#include "stc8h.h"
|
||||
#include <stdint.h>
|
||||
|
||||
void adc_init(void);
|
||||
uint16_t adc_read(uint8_t ch); /* ch = 0..15 (通道号) */
|
||||
|
||||
/* 计算电池电压 (mV),需要根据实际分压电路 */
|
||||
uint16_t battery_read_mv(void);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* @file cmd.h
|
||||
* @brief 串口命令解析
|
||||
* 支持格式:
|
||||
* MODEL(SBUS) - 切换到 SBUS 输出模式
|
||||
* MODEL(PWM) - 切换到 PWM 输出模式
|
||||
* MODEL(UART) - 切换到 UART 输出模式
|
||||
* ADDR(0xXX) - 修改 NRF24L01 地址 5 字节
|
||||
* TUN(N) - 修改 RF 频道 (0..125)
|
||||
*
|
||||
* 命令以回车或换行结束 (\r 或 \n)
|
||||
* 命令缓冲区最大 32 字节
|
||||
*/
|
||||
#ifndef __CMD_H
|
||||
#define __CMD_H
|
||||
|
||||
#include "stc8h.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#define CMD_BUF_SIZE 32
|
||||
|
||||
/* 命令处理结果,通过 model.h 中的 setter 应用 */
|
||||
typedef struct {
|
||||
uint8_t set_mode; /* 1 = 需要切换模式 */
|
||||
uint8_t new_mode; /* RxMode_e */
|
||||
uint8_t set_addr; /* 1 = 需要更新地址 */
|
||||
uint8_t new_addr[5];
|
||||
uint8_t set_channel; /* 1 = 需要更新频道 */
|
||||
uint8_t new_channel;
|
||||
} CmdResult_t;
|
||||
|
||||
/* 主循环调用 */
|
||||
void cmd_poll(void);
|
||||
|
||||
/* 处理单个字节 (UART 中断已入队) */
|
||||
void cmd_feed_byte(uint8_t b);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,118 @@
|
||||
/**
|
||||
* @file config.h
|
||||
* @brief 萝莉3代 接收机系统配置
|
||||
* MCU:STC8H1K08-36I-QFN20
|
||||
*
|
||||
* 引脚分配 (来自主人注释):
|
||||
* CH1-P3.7 CH2-P3.6 CH3-P3.5 CH4-P3.4 (PWM/舵机输出)
|
||||
* BAT_ADC-P3.3 (ADC11) (电池电压检测)
|
||||
* LEDA-P3.2 (状态指示灯)
|
||||
* TX-P3.1, RX-P3.0 (串口1)
|
||||
* - SBUS 连接到 TX 经板上三极管反相
|
||||
* - 串口命令解析走 RX (P3.0)
|
||||
*
|
||||
* NRF24L01 (硬件 SPI):
|
||||
* SCK=P1.5, MOSI=P1.3 (主机输出), MISO=P1.4 (主机输入)
|
||||
* CSN=P5.4, CE=P1.6, IRQ=P1.7
|
||||
*
|
||||
* UART1 复用:
|
||||
* - 默认模式:命令解析 (115200 8N1)
|
||||
* - MODEL(SBUS):切换到 SBUS 输出 (100kbps 8N2 反相逻辑)
|
||||
* - MODEL(PWM):切换到 4 路舵机 PWM 输出
|
||||
* - MODEL(UART):切换到 UART 输出 (占位)
|
||||
*/
|
||||
#ifndef __LOLI_RX_CONFIG_H
|
||||
#define __LOLI_RX_CONFIG_H
|
||||
|
||||
#include "stc8h.h"
|
||||
|
||||
/* 系统时钟:24MHz 内部高速 IRC */
|
||||
#define SYS_CLK_HZ 24000000UL
|
||||
#define MCU_MHZ 24
|
||||
|
||||
/* ─────────────── 通道定义 ─────────────── */
|
||||
#define CH_COUNT 4
|
||||
|
||||
/* 4 路 PWM 输出引脚 */
|
||||
#define CH1_PORT PORT_P3
|
||||
#define CH1_BIT 7
|
||||
#define CH2_PORT PORT_P3
|
||||
#define CH2_BIT 6
|
||||
#define CH3_PORT PORT_P3
|
||||
#define CH3_BIT 5
|
||||
#define CH4_PORT PORT_P3
|
||||
#define CH4_BIT 4
|
||||
|
||||
/* LED 引脚 */
|
||||
#define LED_PORT PORT_P3
|
||||
#define LED_BIT 2
|
||||
|
||||
/* 电池电压 ADC */
|
||||
#define ADC_BAT_CH 11 /* P3.3 = ADC11 */
|
||||
|
||||
/* NRF24L01 引脚 */
|
||||
#define NRF_SCK_PORT PORT_P1
|
||||
#define NRF_SCK_BIT 5
|
||||
#define NRF_MOSI_PORT PORT_P1
|
||||
#define NRF_MOSI_BIT 3 /* 主机输出 */
|
||||
#define NRF_MISO_PORT PORT_P1
|
||||
#define NRF_MISO_BIT 4 /* 主机输入 */
|
||||
#define NRF_CSN_PORT PORT_P5
|
||||
#define NRF_CSN_BIT 4
|
||||
#define NRF_CE_PORT PORT_P1
|
||||
#define NRF_CE_BIT 6
|
||||
#define NRF_IRQ_PORT PORT_P1
|
||||
#define NRF_IRQ_BIT 7
|
||||
|
||||
/* ─────────────── 协议参数 ─────────────── */
|
||||
|
||||
/* SBUS 通道:16 路,11 bit */
|
||||
#define SBUS_CH_COUNT 16
|
||||
#define SBUS_VALUE_MIN 172
|
||||
#define SBUS_VALUE_MID 992
|
||||
#define SBUS_VALUE_MAX 1811
|
||||
|
||||
/* 私有 NRF24L01 协议(与 LoliCon 兼容) */
|
||||
#define NRF_PAYLOAD_LEN 32
|
||||
#define NRF_ADDR_WIDTH 5
|
||||
|
||||
/* 默认地址:萝莉3代标准地址 */
|
||||
static const uint8_t __code DEFAULT_ADDR[5] = { 0xE7, 0xE7, 0xE7, 0xE7, 0xC2 };
|
||||
|
||||
/* 默认频道 */
|
||||
#define DEFAULT_RF_CH 76 /* 2476MHz */
|
||||
|
||||
/* ─────────────── UART 参数 ─────────────── */
|
||||
#define UART_BAUD_CMD 115200UL /* 命令解析默认波特率 */
|
||||
#define UART_BAUD_SBUS 100000UL /* SBUS 100kbps */
|
||||
#define UART_BAUD_SBUS_NEAR 100000UL /* BRT 实际 100k */
|
||||
|
||||
/* ─────────────── 模式定义 ─────────────── */
|
||||
typedef enum {
|
||||
MODE_SBUS = 0,
|
||||
MODE_PWM = 1,
|
||||
MODE_UART = 2,
|
||||
} RxMode_e;
|
||||
|
||||
/* ─────────────── 配置存储 (IAP) ───────────────
|
||||
* STC8H1K08 的 Flash 末段用作 EEPROM
|
||||
* 每个 IAP 扇区 512 字节
|
||||
* 我们只用最后 1 个扇区 (512 字节) 作为配置存储
|
||||
*/
|
||||
#define IAP_EEPROM_BASE 0xFC00 /* Flash 末 1KB(实际只用 1 个扇区 512 字节) */
|
||||
#define IAP_EEPROM_SECTORS 1
|
||||
|
||||
#define EEPROM_MAGIC 0x4C33 /* "L3" */
|
||||
|
||||
/* ─────────────── 帧速率 / 输出更新 ─────────────── */
|
||||
#define OUTPUT_PERIOD_MS 20 /* PWM 输出 50Hz (20ms 周期) */
|
||||
|
||||
/* ─────────────── 电池电压 ───────────────
|
||||
* 板上分压 (假设):BAT → 1/2 分压 → P3.3
|
||||
* Vref = VCC = 5V
|
||||
* 实际电压 = ADC * 5.0 / 1024 * 2
|
||||
*/
|
||||
#define BATTERY_DIVIDER 2.0f
|
||||
#define ADC_VREF_VOLT 5.0f
|
||||
|
||||
#endif /* __LOLI_RX_CONFIG_H */
|
||||
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* @file delay.h
|
||||
* @brief 短延时函数
|
||||
*/
|
||||
#ifndef __DELAY_H
|
||||
#define __DELAY_H
|
||||
|
||||
#include "stc8h.h"
|
||||
#include "config.h"
|
||||
|
||||
void delay_us(uint16_t us);
|
||||
void delay_ms(uint16_t ms);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
* @file eeprom.h
|
||||
* @brief IAP (在应用编程) 模拟 EEPROM
|
||||
* STC8H 的 IAP 允许读/写/擦除 Flash 的某个扇区 (512 字节)
|
||||
* 我们用最后 1 个扇区 (512B @ IAP_EEPROM_BASE)
|
||||
*
|
||||
* 存储布局:
|
||||
* [0..3] magic "L3" + 版本
|
||||
* [4] mode (RxMode_e)
|
||||
* [5] rf_channel
|
||||
* [6..10] rf_address (5 字节)
|
||||
* [11] checksum
|
||||
*/
|
||||
#ifndef __EEPROM_H
|
||||
#define __EEPROM_H
|
||||
|
||||
#include "stc8h.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#define EEPROM_OK 0
|
||||
#define EEPROM_ERR 1
|
||||
|
||||
uint8_t eeprom_init(void);
|
||||
uint8_t eeprom_read(uint8_t *mode, uint8_t *ch, uint8_t addr[5]);
|
||||
uint8_t eeprom_write(uint8_t mode, uint8_t ch, const uint8_t addr[5]);
|
||||
uint8_t eeprom_format(void); /* 恢复默认 */
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* @file gpio.h
|
||||
* @brief GPIO 模式配置和读写
|
||||
* STC8H 端口模式由 PxM0/PxM1 控制:
|
||||
* 00: 准双向口 (弱上拉)
|
||||
* 01: 推挽输出
|
||||
* 10: 高阻输入
|
||||
* 11: 开漏输出
|
||||
*/
|
||||
#ifndef __GPIO_H
|
||||
#define __GPIO_H
|
||||
|
||||
#include "stc8h.h"
|
||||
|
||||
typedef enum {
|
||||
GPIO_MODE_BIDIR = 0x00, /* 准双向 */
|
||||
GPIO_MODE_PUSHPULL = 0x01, /* 推挽输出 */
|
||||
GPIO_MODE_INPUT = 0x02, /* 高阻输入 */
|
||||
GPIO_MODE_OD = 0x03, /* 开漏输出 */
|
||||
} GPIOMode_e;
|
||||
|
||||
void gpio_set_mode(uint8_t port, uint8_t pin, GPIOMode_e mode);
|
||||
void gpio_write(uint8_t port, uint8_t pin, uint8_t val);
|
||||
uint8_t gpio_read(uint8_t port, uint8_t pin);
|
||||
void gpio_toggle(uint8_t port, uint8_t pin);
|
||||
|
||||
/* 端口编号 */
|
||||
#define PORT_P0 0
|
||||
#define PORT_P1 1
|
||||
#define PORT_P2 2
|
||||
#define PORT_P3 3
|
||||
#define PORT_P4 4
|
||||
#define PORT_P5 5
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
* @file model.h
|
||||
* @brief 接收机运行时配置
|
||||
* - mode:SBUS / PWM / UART
|
||||
* - rf_address:5 字节
|
||||
* - rf_channel:0..125
|
||||
* - 上电从 EEPROM 加载,修改时写回 EEPROM
|
||||
*
|
||||
* model_set_* 函数会被 cmd.c 调用,也可能在 main 中调用
|
||||
*/
|
||||
#ifndef __MODEL_H
|
||||
#define __MODEL_H
|
||||
|
||||
#include "stc8h.h"
|
||||
#include "config.h"
|
||||
|
||||
void model_init(void);
|
||||
uint8_t model_get_mode(void);
|
||||
uint8_t model_get_channel(void);
|
||||
const uint8_t *model_get_address(void);
|
||||
|
||||
/* setter (内部会写 EEPROM) */
|
||||
void model_set_mode(uint8_t mode);
|
||||
void model_set_address(const uint8_t *addr);
|
||||
void model_set_channel(uint8_t ch);
|
||||
|
||||
/* 将当前模型应用到硬件 (NRF 频率/地址) */
|
||||
void model_apply(void);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,71 @@
|
||||
/**
|
||||
* @file nrf24l01.h
|
||||
* @brief NRF24L01 驱动 - 接收机端 (RX 模式 + ACK 发送)
|
||||
*/
|
||||
#ifndef __NRF24L01_H
|
||||
#define __NRF24L01_H
|
||||
|
||||
#include "stc8h.h"
|
||||
#include <stdint.h>
|
||||
#include "config.h"
|
||||
|
||||
/* SPI 命令 */
|
||||
#define NRF_CMD_R_REGISTER 0x00
|
||||
#define NRF_CMD_W_REGISTER 0x20
|
||||
#define NRF_CMD_R_RX_PAYLOAD 0x61
|
||||
#define NRF_CMD_W_TX_PAYLOAD 0xA0
|
||||
#define NRF_CMD_FLUSH_TX 0xE1
|
||||
#define NRF_CMD_FLUSH_RX 0xE2
|
||||
#define NRF_CMD_REUSE_TX_PL 0xE3
|
||||
#define NRF_CMD_NOP 0xFF
|
||||
#define NRF_CMD_W_ACK_PAYLOAD 0xA8 /* P0: 0xA8, P1: 0xA9 ... */
|
||||
|
||||
/* 寄存器 */
|
||||
#define NRF_REG_CONFIG 0x00
|
||||
#define NRF_REG_EN_AA 0x01
|
||||
#define NRF_REG_EN_RXADDR 0x02
|
||||
#define NRF_REG_SETUP_AW 0x03
|
||||
#define NRF_REG_SETUP_RETR 0x04
|
||||
#define NRF_REG_RF_CH 0x05
|
||||
#define NRF_REG_RF_SETUP 0x06
|
||||
#define NRF_REG_STATUS 0x07
|
||||
#define NRF_REG_OBSERVE_TX 0x08
|
||||
#define NRF_REG_RPD 0x09
|
||||
#define NRF_REG_RX_ADDR_P0 0x0A
|
||||
#define NRF_REG_TX_ADDR 0x10
|
||||
#define NRF_REG_RX_PW_P0 0x11
|
||||
#define NRF_REG_FIFO_STATUS 0x17
|
||||
#define NRF_REG_DYNPD 0x1C
|
||||
#define NRF_REG_FEATURE 0x1D
|
||||
|
||||
#define NRF_STATUS_RX_DR (1 << 6)
|
||||
#define NRF_STATUS_TX_DS (1 << 5)
|
||||
#define NRF_STATUS_MAX_RT (1 << 4)
|
||||
|
||||
/* 操作结果 */
|
||||
#define NRF_OK 0
|
||||
#define NRF_ERR_CHECK 1
|
||||
|
||||
/* 运行时状态 */
|
||||
typedef struct {
|
||||
uint8_t last_status;
|
||||
uint8_t rx_count; /* 接收帧计数 */
|
||||
uint8_t bind_state; /* 0=正常,1=对频中 */
|
||||
uint8_t ack_pending; /* 有待发送的 ACK payload */
|
||||
uint8_t ack_payload[NRF_PAYLOAD_LEN];
|
||||
} NRF_Status_t;
|
||||
|
||||
extern NRF_Status_t __xdata g_nrf_status;
|
||||
|
||||
void nrf24_init(void);
|
||||
uint8_t nrf24_check(void);
|
||||
void nrf24_set_channel(uint8_t ch);
|
||||
void nrf24_set_address(const uint8_t *addr5);
|
||||
void nrf24_set_rx_mode(void); /* 进入 RX 模式 */
|
||||
uint8_t nrf24_data_ready(void); /* 检查是否有数据,有则读出到 buf */
|
||||
void nrf24_write_ack_payload(const uint8_t *buf); /* 写入 ACK payload */
|
||||
|
||||
/* IRQ 中断处理 (NRF IRQ 接 P1.7) */
|
||||
void nrf24_irq_handler(void);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,20 @@
|
||||
/**
|
||||
* @file pwm.h
|
||||
* @brief 4 路舵机 PWM 输出 (50Hz, 1ms ~ 2ms 脉宽)
|
||||
* 实现方式:定时器 0 中断 (20us 周期) + 软件 PWM 模拟
|
||||
* 精度:20us,SBUS 通道值精度 ≈ 12 SBUS 单位 (≈ 0.6% 行程)
|
||||
*
|
||||
* 周期:20ms = 1000 个 20us 计数
|
||||
* 通道脉宽:1000us ~ 2000us = 50 ~ 100 个 20us 计数
|
||||
*/
|
||||
#ifndef __PWM_H
|
||||
#define __PWM_H
|
||||
|
||||
#include "stc8h.h"
|
||||
#include <stdint.h>
|
||||
|
||||
void pwm_init(void); /* 初始化 PWM 输出 */
|
||||
void pwm_set(uint8_t ch, uint16_t width_us); /* 设置通道脉宽 (us) */
|
||||
void pwm_set_from_sbus(uint8_t ch, uint16_t sbus_val); /* 从 SBUS 值设置 */
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,34 @@
|
||||
/**
|
||||
* @file sbus.h
|
||||
* @brief SBUS 协议 (与 LoliCon 遥控器配套)
|
||||
*
|
||||
* 私有 NRF24L01 32 字节协议:
|
||||
* [0] frame_id = FRAME_ID_CHANNELS
|
||||
* [1] seq
|
||||
* [2] model_id
|
||||
* [3] flags
|
||||
* [4..25] 16 路 SBUS 通道 (11 bit×16 = 22 字节小端位流)
|
||||
* [26..31] 保留
|
||||
*
|
||||
* 标准 SBUS (反向 UART 100k 8E2):
|
||||
* 25 字节:0x0F + 22 字节通道 + flags + 0x00
|
||||
*/
|
||||
#ifndef __SBUS_H
|
||||
#define __SBUS_H
|
||||
|
||||
#include "stc8h.h"
|
||||
#include <stdint.h>
|
||||
#include "config.h"
|
||||
|
||||
/* 协议帧 ID (与 LoliCon 一致) */
|
||||
#define FRAME_ID_CHANNELS 0xA0
|
||||
#define FRAME_ID_TELEMETRY 0xB0
|
||||
#define FRAME_ID_BIND 0xC0
|
||||
|
||||
/* 解包 SBUS 11-bit × 16 通道 → uint16_t[16] (范围 200..1844) */
|
||||
void sbus_unpack_channels(const uint8_t in[22], uint16_t ch[SBUS_CH_COUNT]);
|
||||
|
||||
/* 把 16 路通道打包成标准 SBUS 25 字节帧 */
|
||||
void sbus_make_uart_frame(const uint16_t ch[SBUS_CH_COUNT], uint8_t out[25]);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,15 @@
|
||||
/**
|
||||
* @file spi.h
|
||||
* @brief 硬件 SPI 驱动 - 用于 NRF24L01 通信
|
||||
* SPI 引脚:P1.5 (SCK), P1.3 (MOSI), P1.4 (MISO)
|
||||
*/
|
||||
#ifndef __SPI_H
|
||||
#define __SPI_H
|
||||
|
||||
#include "stc8h.h"
|
||||
#include <stdint.h>
|
||||
|
||||
void spi_init(void);
|
||||
uint8_t spi_transfer(uint8_t data);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,255 @@
|
||||
/**
|
||||
* @file stc8h.h
|
||||
* @brief STC8H 系列单片机寄存器定义 (SDCC 风格)
|
||||
* 适配 STC8H1K08 系列。
|
||||
* 寄存器地址来源:STC8H 系列技术参考手册 9.1/9.9 节 SFR 映射图
|
||||
*
|
||||
* 使用方法:
|
||||
* #include "stc8h.h"
|
||||
* P3 = 0x01; // 直接 SFR 访问
|
||||
* P3 |= 0x02;
|
||||
* __critical { ... } // 关键段
|
||||
*/
|
||||
#ifndef __STC8H_H
|
||||
#define __STC8H_H
|
||||
|
||||
/* ─────────────── 8051 基础 SFR ─────────────── */
|
||||
__sfr __at (0x80) P0;
|
||||
__sfr __at (0x90) P1;
|
||||
__sfr __at (0xA0) P2;
|
||||
__sfr __at (0xB0) P3;
|
||||
__sfr __at (0xC0) P4;
|
||||
__sfr __at (0xC8) P5;
|
||||
__sfr __at (0x81) SP;
|
||||
__sfr __at (0x82) DPL;
|
||||
__sfr __at (0x83) DPH;
|
||||
__sfr __at (0x87) PCON;
|
||||
__sfr __at (0xE0) ACC;
|
||||
__sfr __at (0xF0) B;
|
||||
__sfr __at (0xD0) PSW;
|
||||
|
||||
/* ─────────────── 端口模式配置 ─────────────── */
|
||||
__sfr __at (0x93) P0M1;
|
||||
__sfr __at (0x94) P0M0;
|
||||
__sfr __at (0x91) P1M1;
|
||||
__sfr __at (0x92) P1M0;
|
||||
__sfr __at (0x95) P2M1;
|
||||
__sfr __at (0x96) P2M0;
|
||||
__sfr __at (0xB1) P3M1;
|
||||
__sfr __at (0xB2) P3M0;
|
||||
__sfr __at (0xB3) P4M1;
|
||||
__sfr __at (0xB4) P4M0;
|
||||
__sfr __at (0xC9) P5M1;
|
||||
__sfr __at (0xCA) P5M0;
|
||||
|
||||
/* 端口上拉 / 速度 / 数字输入使能寄存器 (XFR) */
|
||||
__sfr __at (0xBA) P_SW2; /* bit7 = 1 使能 XFR 访问 */
|
||||
|
||||
#define P0PU_XDATA 0xFE10
|
||||
#define P1PU_XDATA 0xFE11
|
||||
#define P2PU_XDATA 0xFE12
|
||||
#define P3PU_XDATA 0xFE13
|
||||
#define P5PU_XDATA 0xFE15
|
||||
#define P0SR_XDATA 0xFE20
|
||||
#define P1SR_XDATA 0xFE21
|
||||
#define P2SR_XDATA 0xFE22
|
||||
#define P3SR_XDATA 0xFE23
|
||||
#define P5SR_XDATA 0xFE25
|
||||
#define P0DR_XDATA 0xFE28
|
||||
#define P1DR_XDATA 0xFE29
|
||||
#define P2DR_XDATA 0xFE2A
|
||||
#define P3DR_XDATA 0xFE2B
|
||||
#define P5DR_XDATA 0xFE2D
|
||||
#define P0IE_XDATA 0xFE30
|
||||
#define P1IE_XDATA 0xFE31
|
||||
|
||||
/* ─────────────── 定时器 0/1 ─────────────── */
|
||||
__sfr __at (0x88) TCON;
|
||||
__sfr __at (0x89) TMOD;
|
||||
__sfr __at (0x8A) TL0;
|
||||
__sfr __at (0x8B) TL1;
|
||||
__sfr __at (0x8C) TH0;
|
||||
__sfr __at (0x8D) TH1;
|
||||
__sfr __at (0x8E) AUXR;
|
||||
__sfr __at (0x8F) INTCLKO;
|
||||
|
||||
/* 定时器 2/3/4 */
|
||||
__sfr __at (0xD6) T2H;
|
||||
__sfr __at (0xD7) T2L;
|
||||
__sfr __at (0xD4) T3H;
|
||||
__sfr __at (0xD5) T3L;
|
||||
__sfr __at (0xD2) T4H;
|
||||
__sfr __at (0xD3) T4L;
|
||||
__sfr __at (0xD1) T4T3M;
|
||||
__sfr __at (0xFEA1) TM2PS_X;
|
||||
__sfr __at (0xFEA2) TM3PS_X;
|
||||
__sfr __at (0xFEA3) TM4PS_X;
|
||||
|
||||
/* TCON 位 (SDCC 风格) - 位地址 = 字节地址 + 位号 */
|
||||
__sbit __at (0x8D) TF0; /* TCON.5 = 0x88 + 5 = 0x8D */
|
||||
__sbit __at (0x8C) TR0; /* TCON.4 = 0x88 + 4 = 0x8C */
|
||||
__sbit __at (0x89) IE0; /* TCON.1 */
|
||||
__sbit __at (0x88) IT0; /* TCON.0 */
|
||||
__sbit __at (0x8F) TF1; /* TCON.7 */
|
||||
__sbit __at (0x8E) TR1; /* TCON.6 */
|
||||
|
||||
/* AUXR 位 */
|
||||
#define S1ST2 0x10 /* UART1 波特率发生器选择: 0=T1, 1=T2 */
|
||||
#define T2R 0x10 /* AUXR.4: T2 运行控制 */
|
||||
#define T2_CT 0x04
|
||||
#define T2x12 0x04 /* T2 时钟 1T 模式 */
|
||||
#define S1SMOD 0x02 /* UART1 波特率加倍 */
|
||||
|
||||
/* ─────────────── UART1 ─────────────── */
|
||||
__sfr __at (0x98) SCON;
|
||||
__sfr __at (0x99) SBUF;
|
||||
__sfr __at (0x9A) S2CON;
|
||||
__sfr __at (0x9B) S2BUF;
|
||||
__sfr __at (0xA9) SADDR;
|
||||
__sfr __at (0xB9) SADEN;
|
||||
__sfr __at (0xA2) P_SW1; /* UART1/SPI 端口切换 */
|
||||
__sfr __at (0x9C) BRT; /* 独立波特率发生器 */
|
||||
|
||||
/* SCON 位 */
|
||||
__sbit __at (0x99) TI; /* SCON.1 = 0x98 + 1 = 0x99 */
|
||||
__sbit __at (0x98) RI; /* SCON.0 = 0x98 */
|
||||
__sbit __at (0x9C) REN; /* SCON.4 = 0x98 + 4 = 0x9C */
|
||||
|
||||
/* IE / 中断 */
|
||||
__sfr __at (0xA8) IE;
|
||||
__sfr __at (0xAF) IE2;
|
||||
__sfr __at (0xB8) IP;
|
||||
__sfr __at (0xB6) IP2;
|
||||
__sfr __at (0xB7) IP2H;
|
||||
__sbit __at (0xAF) EA; /* IE.7 = 0xA8 + 7 = 0xAF */
|
||||
__sbit __at (0xAC) ES; /* IE.4 */
|
||||
__sbit __at (0xA9) ET0; /* IE.1 */
|
||||
__sbit __at (0xAB) ET1; /* IE.3 */
|
||||
__sbit __at (0xAD) EADC; /* IE.5 = 0xA8 + 5 = 0xAD */
|
||||
|
||||
/* ─────────────── SPI ─────────────── */
|
||||
__sfr __at (0xCD) SPSTAT;
|
||||
__sfr __at (0xCE) SPCTL;
|
||||
__sfr __at (0xCF) SPDAT;
|
||||
|
||||
#define SPEN 0x40
|
||||
#define MSTR 0x10
|
||||
#define CPOL 0x08
|
||||
#define CPHA 0x04
|
||||
#define SPR1 0x01
|
||||
#define SPR0 0x00
|
||||
#define SSIG 0x80
|
||||
|
||||
#define SPIF 0x80
|
||||
#define WCOL 0x40
|
||||
|
||||
/* ─────────────── ADC ─────────────── */
|
||||
__sfr __at (0xBC) ADC_CONTR;
|
||||
__sfr __at (0xBD) ADC_RES;
|
||||
__sfr __at (0xBE) ADC_RESL;
|
||||
__sfr __at (0xDE) ADCCFG;
|
||||
__sfr __at (0xFEA8) ADCTIM_X;
|
||||
|
||||
/* ADC_CONTR 位 */
|
||||
#define ADC_POWER 0x80
|
||||
#define ADC_START 0x40
|
||||
#define ADC_FLAG 0x20
|
||||
#define ADC_CHS_MASK 0x0F
|
||||
|
||||
/* ─────────────── PCA ─────────────── */
|
||||
__sfr __at (0xD8) CCON;
|
||||
__sfr __at (0xD9) CMOD;
|
||||
__sfr __at (0xDA) CCAPM0;
|
||||
__sfr __at (0xDB) CCAPM1;
|
||||
__sfr __at (0xDC) CCAPM2;
|
||||
__sfr __at (0xDD) CCAPM3;
|
||||
__sfr __at (0xEA) CCAP0L;
|
||||
__sfr __at (0xEB) CCAP1L;
|
||||
__sfr __at (0xEC) CCAP2L;
|
||||
__sfr __at (0xED) CCAP3L;
|
||||
__sfr __at (0xF2) PCA_PWM0;
|
||||
__sfr __at (0xF3) PCA_PWM1;
|
||||
__sfr __at (0xF4) PCA_PWM2;
|
||||
__sfr __at (0xF5) PCA_PWM3;
|
||||
|
||||
/* ─────────────── IAP (用于模拟 EEPROM) ─────────────── */
|
||||
__sfr __at (0xC1) WDT_CONTR;
|
||||
__sfr __at (0xC2) IAP_DATA;
|
||||
__sfr __at (0xC3) IAP_ADDRH;
|
||||
__sfr __at (0xC4) IAP_ADDRL;
|
||||
__sfr __at (0xC5) IAP_CMD;
|
||||
__sfr __at (0xC6) IAP_TRIG;
|
||||
__sfr __at (0xC7) IAP_CONTR;
|
||||
__sfr __at (0xF7) IAP_TPS;
|
||||
|
||||
#define IAP_CMD_IDLE 0
|
||||
#define IAP_CMD_READ 1
|
||||
#define IAP_CMD_WRITE 2
|
||||
#define IAP_CMD_ERASE 3
|
||||
|
||||
/* ─────────────── 时钟配置 XFR ─────────────── */
|
||||
#define CLKSEL_X 0xFE00
|
||||
#define CLKDIV_X 0xFE01
|
||||
#define HIRCCR_X 0xFE02
|
||||
#define IRC32KCR_X 0xFE04
|
||||
#define IRCBAND 0x9D
|
||||
__sfr __at (0x9D) IRCBAND_REG;
|
||||
|
||||
/* ─────────────── 比较器 / 其他 ─────────────── */
|
||||
__sfr __at (0xAE) TA; /* 写 0xAA,0x55 解锁特殊寄存器 */
|
||||
__sfr __at (0xE6) CMPCR1;
|
||||
__sfr __at (0xE7) CMPCR2;
|
||||
|
||||
/* ─────────────── 中断向量号 (SDCC 用地址) ───────────────
|
||||
* SDCC for 8051: __interrupt (addr) 直接写中断向量地址
|
||||
*/
|
||||
#define INT_ADDR_EXT0 0x0003
|
||||
#define INT_ADDR_T0 0x000B
|
||||
#define INT_ADDR_EXT1 0x0013
|
||||
#define INT_ADDR_T1 0x001B
|
||||
#define INT_ADDR_UART1 0x0023
|
||||
#define INT_ADDR_ADC 0x002B
|
||||
#define INT_ADDR_PCA 0x0033
|
||||
#define INT_ADDR_UART2 0x003B
|
||||
#define INT_ADDR_SPI 0x0043
|
||||
#define INT_ADDR_EXT2 0x004B
|
||||
#define INT_ADDR_EXT3 0x0053
|
||||
#define INT_ADDR_T2 0x005B
|
||||
#define INT_ADDR_CAN 0x0063
|
||||
#define INT_ADDR_PWM 0x006B /* PWMA 中断 */
|
||||
#define INT_ADDR_EXT4 0x0073
|
||||
#define INT_ADDR_UART3 0x007B
|
||||
#define INT_ADDR_UART4 0x0083
|
||||
#define INT_ADDR_T3 0x008B
|
||||
#define INT_ADDR_T4 0x0093
|
||||
#define INT_ADDR_CMP 0x009B
|
||||
#define INT_ADDR_I2C 0x00A3
|
||||
#define INT_ADDR_USB 0x00AB
|
||||
|
||||
/* ─────────────── 8051 类型别名 ─────────────── */
|
||||
typedef unsigned char uint8_t;
|
||||
typedef signed char int8_t;
|
||||
typedef unsigned short uint16_t;
|
||||
typedef signed short int16_t;
|
||||
typedef unsigned long uint32_t;
|
||||
typedef signed long int32_t;
|
||||
|
||||
typedef __bit bool_t;
|
||||
|
||||
/* 内存区域 */
|
||||
#define DATA_SEG __data
|
||||
#define XDATA_SEG __xdata
|
||||
#define IDATA_SEG __idata
|
||||
#define PDATA_SEG __pdata
|
||||
#define CODE_SEG __code
|
||||
|
||||
/* 常用宏 */
|
||||
#define NOP() __asm__("nop")
|
||||
#define DISABLE_INT() EA = 0
|
||||
#define ENABLE_INT() EA = 1
|
||||
#define CRITICAL(x) { EA = 0; x; EA = 1; }
|
||||
|
||||
/* XFR 访问宏: P_SW2 |= 0x80 后访问 0xFE00+ 地址 */
|
||||
#define XFR_ADDR(addr) ((volatile uint8_t __xdata *)(addr))
|
||||
|
||||
#endif /* __STC8H_H */
|
||||
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* @file uart.h
|
||||
* @brief UART1 驱动 (命令解析 / SBUS 输出复用)
|
||||
* UART1 资源:
|
||||
* - P3.0 = RX (命令输入)
|
||||
* - P3.1 = TX (默认调试输出/SBUS 输出经板上三极管反相)
|
||||
*
|
||||
* 主循环调用 uart_poll() 处理命令接收
|
||||
* SBUS 输出由调用者直接调用 uart1_send_byte()
|
||||
*/
|
||||
#ifndef __UART_H
|
||||
#define __UART_H
|
||||
|
||||
#include "stc8h.h"
|
||||
#include <stdint.h>
|
||||
|
||||
void uart1_init(uint32_t baud);
|
||||
void uart1_send_byte(uint8_t b);
|
||||
void uart1_send_bytes(const uint8_t *buf, uint8_t len);
|
||||
uint8_t uart1_rx_available(void);
|
||||
uint8_t uart1_read_byte(void);
|
||||
|
||||
/* 接收环形缓冲区 (64 字节,放 XDATA) */
|
||||
#define UART1_RX_BUF_SIZE 64
|
||||
extern volatile uint8_t __xdata g_uart1_rx_buf[UART1_RX_BUF_SIZE];
|
||||
extern volatile uint8_t __xdata g_uart1_rx_head;
|
||||
extern volatile uint8_t __xdata g_uart1_rx_tail;
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user