197 lines
4.6 KiB
Markdown
197 lines
4.6 KiB
Markdown
# 萝莉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/ # 编译产物
|
||
```
|