/******************************************************************************* * 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_ */