yincheng.zhong
8 天以前 68c43c5adef03f00836d83b37cb83a294d8b0354
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*******************************************************************************
 * 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_ */