# 萝莉3代 接收机固件 (STC8H1K08) ## MCU | 参数 | 值 | |------|-----| | 型号 | STC8H1K08-36I-QFN20 | | 内核 | 1T 8051 | | Flash | 8 KB | | RAM | 1.25 KB | | 主频 | 35 MHz IRC | --- ## 引脚分配 ### 舵机 / 串口引脚 | 功能 | 引脚 | 说明 | |---------|--------|-----------------------------------------| | CH1 | P3.7 | 舵机 PWM 输出 1 (50Hz) | | CH2 | P3.6 | 舵机 PWM 输出 2 | | CH3 | P3.5 | 舵机 PWM 输出 3 | | CH4 | P3.4 | 舵机 PWM 输出 4 | | BAT_ADC | P3.3 / ADC11 | 电池电压分压输入 | | LED | P3.2 | 状态指示灯 (1Hz 闪烁 = 正常) | | TX | P3.1 | UART1 TX / SBUS 输出 (经板上三极管反相) | | RX | P3.0 | UART1 RX / 命令输入 | ### NRF24L01 (硬件 SPI) | 信号 | 引脚 | |------|------| | SCK | P1.5 | | MOSI | P1.3 | | MISO | P1.4 | | CSN | P5.4 | | CE | P1.6 | | IRQ | P1.7 | --- ## 串口命令 通过 P3.0 (RX) 输入,**115200 8N1**,回车或换行结束命令。 ### 命令列表 | 命令 | 作用 | |------|------| | `MODEL(SBUS)` | 切换到 SBUS 反向 UART 输出 (100kbps 8N2) | | `MODEL(PWM)` | 切换到 4 路舵机 PWM 输出 (50Hz) | | `MODEL(UART)` | 切换到 UART 输出 (占位,功能待开发) | | `ADDR(0xHH HH HH HH HH)` | 切换 NRF24L01 地址 (5 字节十六进制) | | `TUN(N)` | 切换 RF 频道 (0~125 十进制) | ### 应答格式 每次命令有效都会应答: | 应答 | 含义 | |------|------| | `OK` | 成功 | | `ERR` | 命令格式错误 | | `ERR_ADDR` | 地址参数错误 | | `ERR_RANGE` | 范围错误 | | `UNK` | 未知命令 | --- ## 私有协议 (与 LoliCon 遥控器配套) ### NRF24L01 32 字节载荷 ``` [0] frame_id = 0xA0 (FRAME_ID_CHANNELS) [1] seq [2] model_id [3] flags [4..25] 16 路 SBUS 通道 (11 bit × 16 = 22 字节小端位流) [26..31] 保留 ``` ### ACK payload 回传 (32 字节) ``` [0] frame_id = 0xB0 (FRAME_ID_TELEMETRY) [1] seq [2..3] battery_mv (uint16_t 大端, 单位 mV) [4..31] 预留 ``` --- ## SBUS 输出 标准 SBUS 是 **100kbps 8E2 反向 UART**,25 字节一帧。板上 TX 经三极管反相,所以 MCU 发标准 UART 数据,三极管反相后变 SBUS 反向 UART。 ### 数据格式 | 字节 | 内容 | |------|------| | byte[0] | `0x0F` (起始) | | byte[1..22] | 16 通道 × 11 bit (176 bit, 小端位流) | | byte[23] | flags (CH17/CH18/failsafe/lost) | | byte[24] | `0x00` (结束) | > **注:** 实际发送格式为 **8N2** (8 数据位 + 2 停止位 + 无校验),多数 SBUS 接收器兼容无校验。 --- ## PWM 输出 4 路舵机 PWM (CH1~4 对应 P3.7/P3.6/P3.5/P3.4): | 参数 | 值 | |------|-----| | 周期 | 50 Hz (20 ms) | | 脉宽 | 800 μs ~ 2200 μs | | SBUS 中位 (1024) | → 1500 μs | | SBUS 范围 (200~1844) | → 1000 μs ~ 2000 μs | **实现:** 定时器 0 中断 (20 μs 周期) + 软件 PWM 模拟 --- ## 失联保护 定时器 1 每 20 ms 检测一次: - 如果 RX 计数器没有增加 → 标记 `lost` - `lost` 状态下: - **PWM 模式:** 输出 1500 μs 中位 - **SBUS 模式:** failsafe 标志位置 1 - **LED** 闪烁频率变为 4 Hz --- ## 编译 ```bash make # 编译生成 .ihx / .hex / .bin make size # 查看 Flash / RAM 占用 make flash # 用 stcgal 烧录 (需 USB-TTL) make clean # 清理 ``` **工具链:** `sdcc 4.2.0+` (通过 apt 安装) --- ## 烧录 ```bash stcgal -p stc8h1k08 -b 115200 LoliRX.bin ``` 用 USB-TTL 连接到 MCU 的 P3.0/P3.1,按住 MCU 复位键直到 `stcgal` 检测到芯片后松开。 --- ## 目录结构 ``` . ├── Makefile ├── README.md ├── inc/ # 头文件 │ ├── stc8h.h STC8H 寄存器定义 │ ├── config.h 引脚和参数 │ ├── delay.h │ ├── gpio.h │ ├── uart.h │ ├── spi.h │ ├── adc.h │ ├── pwm.h │ ├── eeprom.h │ ├── nrf24l01.h │ ├── sbus.h │ ├── cmd.h │ └── model.h ├── src/ # C 源文件 │ ├── delay.c │ ├── gpio.c │ ├── uart.c │ ├── spi.c │ ├── adc.c │ ├── pwm.c │ ├── eeprom.c │ ├── nrf24l01.c │ ├── sbus.c │ ├── cmd.c │ ├── model.c │ └── main.c └── build/ # 编译产物 ```