/*******************************************************************************
|
* File Name : SBUS.h
|
* Description : SBUS RC receiver protocol parser for STM32H7
|
* UART4 (100kbps, 8E2) + DMA reception
|
* Created on : 2025-11-13
|
* Author : Auto-generated
|
*******************************************************************************/
|
|
#ifndef FML_SBUS_H_
|
#define FML_SBUS_H_
|
|
/*******************************************************************************
|
* Include Files *
|
*******************************************************************************/
|
#include "HIDO_TypeDef.h"
|
|
/*******************************************************************************
|
* Macro *
|
*******************************************************************************/
|
#define SBUS_FRAME_SIZE 25 // SBUS帧长度 (字节)
|
#define SBUS_HEADER 0x0F // 帧头
|
#define SBUS_FOOTER 0x00 // 帧尾
|
#define SBUS_NUM_CHANNELS 16 // 通道数量
|
#define SBUS_CHANNEL_BITS 11 // 每通道位数
|
#define SBUS_MIN_VALUE 0 // 通道最小值
|
#define SBUS_MAX_VALUE 2047 // 通道最大值 (11-bit)
|
#define SBUS_CENTER_VALUE 1024 // 通道中心值
|
|
// 缓冲区大小 (建议保留多帧空间以应对DMA环形接收)
|
#define SBUS_UART_RX_BUF_SIZE 128 // DMA 接收缓冲区
|
|
/*******************************************************************************
|
* Type Definition *
|
*******************************************************************************/
|
|
/**
|
* @brief SBUS 通道数据结构
|
*/
|
typedef struct
|
{
|
HIDO_UINT16 m_au16Channels[SBUS_NUM_CHANNELS]; // 16个通道值 (0~2047)
|
HIDO_UINT8 m_u8Ch17; // 数字通道 CH17 (0/1)
|
HIDO_UINT8 m_u8Ch18; // 数字通道 CH18 (0/1)
|
HIDO_UINT8 m_u8FrameLost; // 帧丢失标志
|
HIDO_UINT8 m_u8Failsafe; // 失控保护标志
|
HIDO_UINT32 m_u32LastUpdateTick; // 最后更新时刻 (ms)
|
HIDO_UINT32 m_u32FrameCount; // 累计帧数
|
HIDO_UINT32 m_u32ErrorCount; // 错误帧数
|
} ST_SBUSData;
|
|
/*******************************************************************************
|
* Global Function *
|
*******************************************************************************/
|
|
/**
|
* @brief 初始化 SBUS 接收模块
|
* - 注册 UART4 DMA 接收回调
|
* - 启动 DMA 循环接收
|
* @return HIDO_TRUE: 成功, HIDO_FALSE: 失败
|
*/
|
HIDO_INT32 SBUS_Init(HIDO_VOID);
|
|
/**
|
* @brief SBUS 轮询函数 (需在主循环中定期调用)
|
* - 检查 DMA 接收缓冲区
|
* - 解析 SBUS 帧
|
* - 更新通道数据
|
* @return 无
|
*/
|
HIDO_VOID SBUS_Poll(HIDO_VOID);
|
|
/**
|
* @brief 获取 SBUS 通道数据副本 (线程安全)
|
* @param _pstData: 输出参数, 填充通道数据
|
* @return HIDO_TRUE: 成功, HIDO_FALSE: 无有效数据
|
*/
|
HIDO_INT32 SBUS_GetData(ST_SBUSData *_pstData);
|
|
/**
|
* @brief 获取单个通道值
|
* @param _u8Channel: 通道号 (0~15)
|
* @return 通道值 (0~2047), 失败返回 SBUS_CENTER_VALUE
|
*/
|
HIDO_UINT16 SBUS_GetChannel(HIDO_UINT8 _u8Channel);
|
|
/**
|
* @brief 获取数字通道状态
|
* @param _u8DigitalChannel: 数字通道号 (17 或 18)
|
* @return 0 或 1, 失败返回 0
|
*/
|
HIDO_UINT8 SBUS_GetDigitalChannel(HIDO_UINT8 _u8DigitalChannel);
|
|
/**
|
* @brief 检查 SBUS 信号是否有效 (最近是否收到帧)
|
* @param _u32TimeoutMs: 超时阈值 (ms), 默认 100ms
|
* @return HIDO_TRUE: 有效, HIDO_FALSE: 超时无信号
|
*/
|
HIDO_INT32 SBUS_IsSignalValid(HIDO_UINT32 _u32TimeoutMs);
|
|
/**
|
* @brief 获取接收统计信息
|
* @param _pu32FrameCount: 输出累计帧数
|
* @param _pu32ErrorCount: 输出错误帧数
|
* @return 无
|
*/
|
HIDO_VOID SBUS_GetStats(HIDO_UINT32 *_pu32FrameCount, HIDO_UINT32 *_pu32ErrorCount);
|
|
/**
|
* @brief 调试函数:打印 SBUS 详细状态信息
|
* 包括 DMA 状态、缓冲区内容、通道值等
|
* @return 无
|
*/
|
// SBUS Debug function (使用 HIDO_Debug2 输出到 UART_ID_DBG)
|
HIDO_VOID SBUS_PrintDebugInfo(void);
|
|
// 声明 HIDO_Debug2 函数
|
extern HIDO_INT32 HIDO_Debug2(const HIDO_CHAR *_pcFmt, ...);
|
|
#endif /* FML_SBUS_H_ */
|