Files

197 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 萝莉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/ # 编译产物
```