| .settings | ||
| .vscode | ||
| cmake | ||
| Core | ||
| Drivers | ||
| MDK-ARM | ||
| Middlewares/Third_Party/FreeRTOS/Source | ||
| User | ||
| .clangd | ||
| .gitignore | ||
| .mxproject | ||
| CMakeLists.txt | ||
| CMakePresets.json | ||
| MR16.ioc | ||
| README.md | ||
| startup_stm32f103xb.s | ||
| STM32F103XX_FLASH.ld | ||
MR16 模块说明文档
概述
MR16 是基于 SX1281 2.4GHz 无线收发芯片的遥控数据传输系统,支持多种无线协议(BLE/LoRa/GFSK/FLRC),提供 FreeRTOS CLI 命令行接口和 LCD 状态显示。
⚠️ 通信要求 (Critical Requirements)
发送端和接收端必须配置一致,否则无法通信!
必须匹配的参数:
-
无线协议模式 -
radio mode <BLE|LORA|GFSK|FLRC>- 双方必须使用相同的协议(如都用 FLRC)
-
波特率 -
radio baudrate <index>- 同一协议下,双方必须使用相同的波特率索引
- 例如:FLRC 模式下,双方都用
radio baudrate 2(520kbps)
-
频率 -
radio channel <MHz>- 双方必须工作在相同频率
- 例如:都设置为
radio channel 2450
-
TX/RX ID -
mr16 txid <id>/mr16 rxid <id>- 发送端的 TX_ID 必须等于接收端的 RX_ID
- 例如:发送端
txid 0x1234,接收端rxid 0x1234
配置示例
# 发送端配置
radio mode FLRC # 选择 FLRC 协议
radio baudrate 2 # 波特率索引 2 (520kbps)
radio channel 2450 # 频率 2450MHz
mr16 txid 0x1234 # 发送ID
# 接收端配置(必须完全一致)
radio mode FLRC # 相同协议
radio baudrate 2 # 相同波特率
radio channel 2450 # 相同频率
mr16 rxid 0x1234 # 接收ID = 发送端的TX_ID
验证方法
# 使用 show 命令查看当前配置
mr16 show # 查看 TX_ID/RX_ID
radio mode # 查看当前协议
radio baudrate # 查看当前波特率
radio modulation # 查看详细调制参数
常见错误
- ❌ 双方协议不同(一个BLE,一个FLRC)→ 完全无法通信
- ❌ 波特率索引不同(一个用2,一个用3)→ 解调失败
- ❌ 频率偏差过大 → 接收不到信号
- ❌ ID不匹配 → 接收到数据但被过滤丢弃
硬件平台
- MCU: STM32F103C8T6 (20KB RAM, 64KB Flash)
- 无线芯片: SX1281 2.4GHz 收发器
- 显示: LCD 彩屏 (240x135)
- 接口: UART2 (CLI + 数据输入), DBUS (数据输出)
代码结构
文件组织
mr16.c - 主实现文件 (1788行)
├─ [PART 1] 核心功能 (MR16 CORE FUNCTIONS)
│ ├─ 无线事件回调
│ ├─ 系统初始化
│ ├─ 主循环
│ └─ 数据包处理
├─ [PART 2] UI显示 (UI DISPLAY FUNCTIONS)
│ ├─ 开机动画
│ ├─ 主界面显示
│ └─ 状态更新
└─ [PART 3] CLI命令 (CLI COMMAND FUNCTIONS)
├─ 帮助文本
├─ MR16命令处理器
├─ Radio命令处理器
└─ CLI初始化
PART 1: 核心功能模块
1.1 数据格式 (Data Format)
可变长度模式 (VARIABLE)
- 触发方式: UART 空闲中断
- 长度: 动态,根据实际接收数据
- 适用场景: 不定长数据传输
固定长度模式 (FIXED)
- 长度: 预定义 (默认122字节)
- 可调范围: 1-123 字节 (纯用户数据)
- 适用场景: 固定格式数据,如遥控器
1.2 数据包格式
完整数据包结构 (最大127字节):
┌─────────┬──────────────────┬─────────┐
│ Header │ User Data │ CRC │
│ 2 bytes │ 1-123 bytes │ 2 bytes │
└─────────┴──────────────────┴─────────┘
Header (2字节)
- Byte 0: TX_ID 高字节
- Byte 1: TX_ID 低字节
- 用途: 识别发送端,支持多机接收
User Data (1-123字节)
- 用户纯数据,不包含 Header 和 CRC
- VARIABLE 模式: 实际接收长度
- FIXED 模式: 配置的
fixedLength值
CRC (2字节)
- 算法: CRC16
- 校验范围: Header + User Data
- Byte N+2: CRC 高字节
- Byte N+3: CRC 低字节
1.3 数据流向
TX 端 (发送端)
用户数据 (UART2)
↓
MR16_PackTxBuffer() ← 添加 Header + CRC
↓
完整数据包 → SX1281 无线发送
RX 端 (接收端)
SX1281 无线接收
↓
验证 Header (RX_ID 匹配)
↓
验证 CRC (数据完整性)
↓
输出完整包 (含Header) → DBUS/UART
1.4 失控保护 (Failsafe)
仅在 RX 端启用
触发条件
- 100ms 未接收到有效数据
安全帧格式
安全帧结构:
┌─────────┬────────────────────────┬─────────┐
│ Header │ 0xFF 0x00 0xFF 0x00 │ 0x00... │
│ 2 bytes │ 4 bytes (安全标识) │ 填充0 │
└─────────┴────────────────────────┴─────────┘
实现位置
MR16_Main()函数中- 自动构造安全帧到
txbuffer - DBUS 输出自动发送安全帧
1.5 核心函数
MR16_Init()
功能: 系统初始化
- 从 Flash 加载配置(失败则用默认值)
- 初始化 CLI 命令系统
- 初始化 SX1281 无线模块
- 初始化 LCD 显示
MR16_Main()
功能: 主循环
- 处理 UART2 数据(区分 CLI 命令 / 用户数据)
- 执行无线收发
- RX 端失控保护
- 定时更新 UI 显示
MR16_PackTxBuffer()
功能: 封装数据包
- 输入: 用户纯数据
- 输出: Header + 数据 + CRC
- 自动添加 TX_ID 和 CRC16 校验
SX1281_Callback()
功能: 无线事件回调
RX_DONE: 接收成功,验证ID,更新计数TX_DONE: 发送成功,继续发送RX_TIMEOUT/TX_TIMEOUT: 超时处理
PART 2: UI 显示模块
2.1 显示界面
开机动画 (MR16_UI_PowerON)
- MR16 Logo
- "Initializing..." 提示
主界面 (MR16_UI_Home)
TX 模式显示:
┌──────────────────────────────┐
│ MR16 Status [TX] │
├──────────────────────────────┤
│ Mode: FIXED Power: 10dBm │
│ Radio: FLRC DataLen: 122B│
│ Freq: 2450MHz │
│ TXID: 0x1234 │
└──────────────────────────────┘
RX 模式显示:
┌──────────────────────────────┐
│ MR16 Status [RX] │
├──────────────────────────────┤
│ Mode: FIXED rxcount: │
│ Radio: FLRC ch1: 1234 │
│ Freq: 2450MHz ch2: 567 │
│ rxid: 0x1234 0x5678 0x9ABC │
└──────────────────────────────┘
2.2 UI 函数
| 函数 | 功能 | 调用时机 |
|---|---|---|
MR16_UI_PowerON() |
开机动画 | 系统初始化时 |
MR16_UI_Home() |
主界面 | 初始化完成 / 模式切换 |
MR16_UI_UpdateStatus() |
状态更新 | RX模式 1秒刷新一次 |
PART 3: CLI 命令模块
3.1 MR16 系统命令
配置管理
mr16 save # 保存配置到 Flash
mr16 get # 从 Flash 加载配置
mr16 reset # 恢复默认配置
数据格式
mr16 mode # 查看当前格式
mr16 mode VARIABLE # 设置可变长度模式
mr16 mode FIXED # 设置固定长度模式
固定长度设置
mr16 fixedlen # 查看当前长度
mr16 fixedlen 100 # 设置用户数据长度为100字节
# 范围: 1-123 字节(不含Header和CRC)
# 总包长 = fixedlen + 4
发射功率
mr16 power # 查看当前功率
mr16 power 10 # 设置功率为 10dBm
# 范围: -18 到 +13 dBm
RX ID 配置
mr16 rxid # 显示所有 RX ID
mr16 rxid1 0x1234 # 设置 RX ID 1 为 0x1234
mr16 rxid2 0x5678 # 设置 RX ID 2
mr16 rxid3 0x9ABC # 设置 RX ID 3
# 有效范围: 0x0001-0xFFFE
操作命令
mr16 tx # 启动发送模式
mr16 rx # 启动接收模式
信息查看
mr16 show # 显示所有配置
mr16 help # 显示帮助信息
3.2 Radio 无线命令
协议模式
radio mode # 查看当前协议
radio mode BLE # 切换到 BLE 模式
radio mode LORA # 切换到 LoRa 模式
radio mode GFSK # 切换到 GFSK 模式
radio mode FLRC # 切换到 FLRC 模式
频率设置
radio rffreq # 查看当前频率
radio rffreq 2450000000 # 设置为 2450MHz
调制参数
radio modulation help # 查看调制参数帮助
radio modulation # 显示当前调制参数
# BLE/GFSK 示例:
radio modulation br_bw 0x4C # 设置比特率/带宽
radio modulation modindex 1 # 设置调制指数
radio modulation shaping 0x10 # 设置波形整形
# LoRa 示例:
radio modulation sf 0x70 # 设置扩频因子 SF7
radio modulation bw 0x18 # 设置带宽 800kHz
radio modulation cr 0x01 # 设置编码率 4/5
# FLRC 示例:
radio modulation br_bw 0x45 # 比特率/带宽
radio modulation cr 0x00 # 编码率
radio modulation shaping 0x10 # 波形整形
数据包参数
radio packet help # 查看数据包参数帮助
radio packet # 显示当前包参数
# GFSK/FLRC 示例:
radio packet Preamble 0x30 # 前导码长度
radio packet SyncWordLength 0x04 # 同步字长度
radio packet Header 0x00 # 包头类型 (VARIABLE)
radio packet Payload 127 # 载荷长度
radio packet Crc 0x20 # CRC 类型
radio packet Whitening 0x00 # 白化开启
# 同步字设置:
radio packet SyncWord # 显示所有同步字
radio packet SyncWord1 0x12345678 # 设置同步字1
radio packet SyncWord2 0xABCDEF00 # 设置同步字2
radio packet SyncWord3 0x11223344 # 设置同步字3
# LoRa 示例:
radio packet Preamble 8 # 前导码符号数
radio packet Header 0x00 # 显式包头
radio packet Payload 64 # 载荷长度
radio packet Crc 0x20 # CRC 开启
radio packet InvertIQ 0x40 # IQ 正常
波特率
radio baudrate # 显示所有协议波特率
radio baudrate BLE 1 # 设置 BLE 波特率
radio baudrate LORA 3 # 设置 LoRa 波特率
radio baudrate GFSK 2 # 设置 GFSK 波特率
radio baudrate FLRC 3 # 设置 FLRC 波特率
其他参数
radio power 10 # 设置发射功率 (dBm)
radio ramptime 10 # 设置上升时间 (us)
# 可选: 2/4/6/8/10/12/16/20
3.3 命令特性
- 不区分大小写:
MODE=mode=Mode - 参数自动解析: 支持十进制、十六进制 (0x前缀)
- 帮助系统: 所有命令支持
help子命令 - 分页输出: 长帮助文本自动分页显示
- 实时生效: 参数修改后立即更新硬件
- 自动刷新: 参数变更后自动更新 LCD 显示
典型应用场景
场景1: 遥控器发射端
# 初始配置
mr16 mode FIXED # 固定长度模式
mr16 fixedlen 18 # 18字节遥控数据
radio mode FLRC # 使用 FLRC 协议(低延迟)
mr16 power 10 # 10dBm 发射功率
mr16 save # 保存配置
# 启动发送
mr16 tx
场景2: 接收机
# 配置多机接收
mr16 rxid1 0x1234 # 遥控器1
mr16 rxid2 0x5678 # 遥控器2
mr16 rxid3 0x9ABC # 遥控器3
radio mode FLRC
mr16 save
# 启动接收(带失控保护)
mr16 rx
场景3: 透传模式
# 可变长度透传
mr16 mode VARIABLE # 不定长数据
radio mode GFSK # GFSK 协议
mr16 save
配置参数说明
Flash 存储结构
Config_t {
MR16_Param_t mr16; // MR16 参数
uint32_t earsed_count; // 擦写次数
}
MR16_Param_t {
SX1281_Params_t radioParams; // 无线参数
MR16_DataFormat_t format; // 数据格式
uint16_t fixedLength; // 固定长度
uint16_t TX_ID; // 发送ID
uint16_t RX_ID[3]; // 接收ID (3个)
}
默认配置
format = MR16_FORMAT_FIXED
fixedLength = 122
TX_ID = 0x1234
RX_ID[0] = 0x5678
RX_ID[1] = 0x0000 (禁用)
RX_ID[2] = 0x0000 (禁用)
radioMode = FLRC
rfFrequency = 2450000000 (2450MHz)
txOutputPower = 10 (dBm)
性能指标
| 参数 | 值 |
|---|---|
| 最大数据包长度 | 127 字节 |
| 最大用户数据 | 123 字节 |
| DBUS 输出频率 | 71Hz (14ms间隔) |
| 失控检测延迟 | 100ms |
| UI 刷新频率 | 1Hz (RX模式) |
| 命令响应 | <10ms |
注意事项
数据长度限制
⚠️ 已知问题: 117-118 字节总包长(113-114字节用户数据)会触发 SX1281 TX 超时
- 建议用户数据不超过 112 字节
- 固定长度模式建议设置 ≤ 110 字节
ID 配置
- TX_ID / RX_ID 有效范围:
0x0001-0xFFFE 0x0000和0xFFFF为无效值,用于禁用通道
失控保护
- 仅 RX 端检测: TX 端正常发送,不关心接收状态
- 安全帧识别: 下游设备需检测
0xFF 0x00 0xFF 0x00模式 - 避免冲突: 正常数据避免出现连续的安全帧模式
Flash 寿命
- STM32 Flash 擦写次数: 约 10,000 次
- 避免频繁
mr16 save操作 - 建议只在配置完成后保存一次
开发者信息
- 版本: 2.0
- 最后更新: 2024-12-09
- 开发团队: MR16 Development Team
相关文件
mr16.c- 主实现文件mr16.h- 头文件定义config.c- 配置管理sx1281_driver.c- SX1281 驱动lcd.c- LCD 驱动
文档结束