mirror of
https://github.com/goldenfishs/MRobot.git
synced 2025-09-17 22:34:33 +08:00
Compare commits
2 Commits
485e25fec2
...
f1c6b085a4
Author | SHA1 | Date | |
---|---|---|---|
f1c6b085a4 | |||
d626e4e656 |
8
.vscode/settings.json
vendored
8
.vscode/settings.json
vendored
@ -11,6 +11,12 @@
|
|||||||
"device.h": "c",
|
"device.h": "c",
|
||||||
"gpio.h": "c",
|
"gpio.h": "c",
|
||||||
"uart.h": "c",
|
"uart.h": "c",
|
||||||
"motor_rm.h": "c"
|
"motor_rm.h": "c",
|
||||||
|
"mm.h": "c",
|
||||||
|
"capacity.h": "c",
|
||||||
|
"error_detect.h": "c",
|
||||||
|
"bmi088.h": "c",
|
||||||
|
"time.h": "c",
|
||||||
|
"motor.h": "c"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -433,6 +433,27 @@ class bsp_can(BspPeripheralBase):
|
|||||||
|
|
||||||
# 生成CAN初始化代码
|
# 生成CAN初始化代码
|
||||||
init_lines = []
|
init_lines = []
|
||||||
|
# 初始化发送信号量
|
||||||
|
init_lines.append(" // 创建发送信号量,每个CAN通道有3个发送邮箱")
|
||||||
|
init_lines.append(" for (int i = 0; i < BSP_CAN_NUM; i++) {")
|
||||||
|
init_lines.append(" tx_semaphore[i] = osSemaphoreNew(CAN_TX_MAILBOX_NUM, CAN_TX_MAILBOX_NUM, NULL);")
|
||||||
|
init_lines.append(" if (tx_semaphore[i] == NULL) {")
|
||||||
|
init_lines.append(" // 清理已创建的信号量")
|
||||||
|
init_lines.append(" for (int j = 0; j < i; j++) {")
|
||||||
|
init_lines.append(" if (tx_semaphore[j] != NULL) {")
|
||||||
|
init_lines.append(" osSemaphoreDelete(tx_semaphore[j]);")
|
||||||
|
init_lines.append(" tx_semaphore[j] = NULL;")
|
||||||
|
init_lines.append(" }")
|
||||||
|
init_lines.append(" }")
|
||||||
|
init_lines.append(" if (queue_mutex != NULL) {")
|
||||||
|
init_lines.append(" osMutexDelete(queue_mutex);")
|
||||||
|
init_lines.append(" queue_mutex = NULL;")
|
||||||
|
init_lines.append(" }")
|
||||||
|
init_lines.append(" return BSP_ERR;")
|
||||||
|
init_lines.append(" }")
|
||||||
|
init_lines.append(" }")
|
||||||
|
init_lines.append("")
|
||||||
|
|
||||||
# 先设置初始化标志
|
# 先设置初始化标志
|
||||||
init_lines.append(" // 先设置初始化标志,以便后续回调注册能通过检查")
|
init_lines.append(" // 先设置初始化标志,以便后续回调注册能通过检查")
|
||||||
init_lines.append(" inited = true;")
|
init_lines.append(" inited = true;")
|
||||||
@ -482,10 +503,19 @@ class bsp_can(BspPeripheralBase):
|
|||||||
f" HAL_CAN_ConfigFilter(&hcan{can_num}, &can{can_num}_filter);",
|
f" HAL_CAN_ConfigFilter(&hcan{can_num}, &can{can_num}_filter);",
|
||||||
f" HAL_CAN_Start(&hcan{can_num});",
|
f" HAL_CAN_Start(&hcan{can_num});",
|
||||||
"",
|
"",
|
||||||
f" // 注册{instance}回调函数",
|
f" // 注册{instance}发送完成回调(用于释放信号量)",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
"",
|
||||||
|
f" // 注册{instance}接收回调函数",
|
||||||
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);",
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);",
|
||||||
"",
|
"",
|
||||||
f" HAL_CAN_ActivateNotification(&hcan{can_num}, CAN_IT_RX_FIFO0_MSG_PENDING);",
|
f" HAL_CAN_ActivateNotification(&hcan{can_num}, CAN_IT_RX_FIFO0_MSG_PENDING | ",
|
||||||
|
f" CAN_IT_TX_MAILBOX_EMPTY); // 激活发送邮箱空中断",
|
||||||
""
|
""
|
||||||
])
|
])
|
||||||
|
|
||||||
@ -513,10 +543,19 @@ class bsp_can(BspPeripheralBase):
|
|||||||
f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter);",
|
f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter);",
|
||||||
f" HAL_CAN_Start(&hcan1);",
|
f" HAL_CAN_Start(&hcan1);",
|
||||||
"",
|
"",
|
||||||
f" // 注册CAN1回调函数",
|
f" // 注册CAN1发送完成回调(用于释放信号量)",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
"",
|
||||||
|
f" // 注册CAN1接收回调函数",
|
||||||
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);",
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);",
|
||||||
"",
|
"",
|
||||||
f" HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);",
|
f" HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING | ",
|
||||||
|
f" CAN_IT_TX_MAILBOX_EMPTY); // 激活发送邮箱空中断",
|
||||||
""
|
""
|
||||||
])
|
])
|
||||||
|
|
||||||
@ -529,9 +568,18 @@ class bsp_can(BspPeripheralBase):
|
|||||||
f" HAL_CAN_ConfigFilter(&hcan2, &can1_filter); // 通过 CAN1 配置",
|
f" HAL_CAN_ConfigFilter(&hcan2, &can1_filter); // 通过 CAN1 配置",
|
||||||
f" HAL_CAN_Start(&hcan2);",
|
f" HAL_CAN_Start(&hcan2);",
|
||||||
"",
|
"",
|
||||||
f" // 注册CAN2回调函数",
|
f" // 注册CAN2发送完成回调(用于释放信号量)",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
"",
|
||||||
|
f" // 注册CAN2接收回调函数",
|
||||||
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO1_MSG_PENDING_CB, BSP_CAN_RxFifo1Callback);",
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO1_MSG_PENDING_CB, BSP_CAN_RxFifo1Callback);",
|
||||||
f" HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO1_MSG_PENDING);",
|
f" HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO1_MSG_PENDING | ",
|
||||||
|
f" CAN_IT_TX_MAILBOX_EMPTY); // 激活发送邮箱空中断",
|
||||||
""
|
""
|
||||||
])
|
])
|
||||||
|
|
||||||
@ -560,10 +608,19 @@ class bsp_can(BspPeripheralBase):
|
|||||||
f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter);",
|
f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter);",
|
||||||
f" HAL_CAN_Start(&hcan1);",
|
f" HAL_CAN_Start(&hcan1);",
|
||||||
"",
|
"",
|
||||||
f" // 注册CAN1回调函数",
|
f" // 注册CAN1发送完成回调(用于释放信号量)",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
"",
|
||||||
|
f" // 注册CAN1接收回调函数",
|
||||||
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);",
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);",
|
||||||
"",
|
"",
|
||||||
f" HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);",
|
f" HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING | ",
|
||||||
|
f" CAN_IT_TX_MAILBOX_EMPTY); // 激活发送邮箱空中断",
|
||||||
""
|
""
|
||||||
])
|
])
|
||||||
|
|
||||||
@ -577,9 +634,18 @@ class bsp_can(BspPeripheralBase):
|
|||||||
f" HAL_CAN_ConfigFilter(&hcan2, &can1_filter); // 通过 CAN1 配置",
|
f" HAL_CAN_ConfigFilter(&hcan2, &can1_filter); // 通过 CAN1 配置",
|
||||||
f" HAL_CAN_Start(&hcan2);",
|
f" HAL_CAN_Start(&hcan2);",
|
||||||
"",
|
"",
|
||||||
f" // 注册CAN2回调函数",
|
f" // 注册CAN2发送完成回调(用于释放信号量)",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
"",
|
||||||
|
f" // 注册CAN2接收回调函数",
|
||||||
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);",
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);",
|
||||||
f" HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);",
|
f" HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING | ",
|
||||||
|
f" CAN_IT_TX_MAILBOX_EMPTY); // 激活发送邮箱空中断",
|
||||||
""
|
""
|
||||||
])
|
])
|
||||||
|
|
||||||
@ -595,9 +661,18 @@ class bsp_can(BspPeripheralBase):
|
|||||||
f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter); // 通过 CAN1 配置",
|
f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter); // 通过 CAN1 配置",
|
||||||
f" HAL_CAN_Start(&hcan{can_num});",
|
f" HAL_CAN_Start(&hcan{can_num});",
|
||||||
"",
|
"",
|
||||||
f" // 注册{instance}回调函数",
|
f" // 注册{instance}发送完成回调(用于释放信号量)",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_TxCompleteCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX0_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX1_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_TX_MAILBOX2_ABORT_CB, BSP_CAN_TxAbortCallback);",
|
||||||
|
"",
|
||||||
|
f" // 注册{instance}接收回调函数",
|
||||||
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO1_MSG_PENDING_CB, BSP_CAN_RxFifo1Callback);",
|
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO1_MSG_PENDING_CB, BSP_CAN_RxFifo1Callback);",
|
||||||
f" HAL_CAN_ActivateNotification(&hcan{can_num}, CAN_IT_RX_FIFO1_MSG_PENDING);",
|
f" HAL_CAN_ActivateNotification(&hcan{can_num}, CAN_IT_RX_FIFO1_MSG_PENDING | ",
|
||||||
|
f" CAN_IT_TX_MAILBOX_EMPTY); // 激活发送邮箱空中断",
|
||||||
""
|
""
|
||||||
])
|
])
|
||||||
filter_bank += 1 # 为下一个CAN分配不同的过滤器组
|
filter_bank += 1 # 为下一个CAN分配不同的过滤器组
|
||||||
|
BIN
assets/.DS_Store
vendored
BIN
assets/.DS_Store
vendored
Binary file not shown.
@ -7,6 +7,8 @@
|
|||||||
|
|
||||||
/* Private define ----------------------------------------------------------- */
|
/* Private define ----------------------------------------------------------- */
|
||||||
#define CAN_QUEUE_MUTEX_TIMEOUT 100 /* 队列互斥锁超时时间(ms) */
|
#define CAN_QUEUE_MUTEX_TIMEOUT 100 /* 队列互斥锁超时时间(ms) */
|
||||||
|
#define CAN_TX_SEMAPHORE_TIMEOUT 1000 /* 发送信号量超时时间(ms) */
|
||||||
|
#define CAN_TX_MAILBOX_NUM 3 /* CAN发送邮箱数量 */
|
||||||
|
|
||||||
/* Private macro ------------------------------------------------------------ */
|
/* Private macro ------------------------------------------------------------ */
|
||||||
/* Private typedef ---------------------------------------------------------- */
|
/* Private typedef ---------------------------------------------------------- */
|
||||||
@ -21,6 +23,7 @@ typedef struct BSP_CAN_QueueNode {
|
|||||||
/* Private variables -------------------------------------------------------- */
|
/* Private variables -------------------------------------------------------- */
|
||||||
static BSP_CAN_QueueNode_t *queue_list = NULL;
|
static BSP_CAN_QueueNode_t *queue_list = NULL;
|
||||||
static osMutexId_t queue_mutex = NULL;
|
static osMutexId_t queue_mutex = NULL;
|
||||||
|
static osSemaphoreId_t tx_semaphore[BSP_CAN_NUM] = {NULL}; /* 发送信号量,用于控制发送邮箱访问 */
|
||||||
static void (*CAN_Callback[BSP_CAN_NUM][BSP_CAN_CB_NUM])(void);
|
static void (*CAN_Callback[BSP_CAN_NUM][BSP_CAN_CB_NUM])(void);
|
||||||
static bool inited = false;
|
static bool inited = false;
|
||||||
static BSP_CAN_IdParser_t id_parser = NULL; /* ID解析器 */
|
static BSP_CAN_IdParser_t id_parser = NULL; /* ID解析器 */
|
||||||
@ -32,6 +35,8 @@ static int8_t BSP_CAN_CreateIdQueue(BSP_CAN_t can, uint32_t can_id, uint8_t queu
|
|||||||
static int8_t BSP_CAN_DeleteIdQueue(BSP_CAN_t can, uint32_t can_id);
|
static int8_t BSP_CAN_DeleteIdQueue(BSP_CAN_t can, uint32_t can_id);
|
||||||
static void BSP_CAN_RxFifo0Callback(void);
|
static void BSP_CAN_RxFifo0Callback(void);
|
||||||
static void BSP_CAN_RxFifo1Callback(void);
|
static void BSP_CAN_RxFifo1Callback(void);
|
||||||
|
static void BSP_CAN_TxCompleteCallback(CAN_HandleTypeDef *hcan);
|
||||||
|
static void BSP_CAN_TxAbortCallback(CAN_HandleTypeDef *hcan);
|
||||||
static BSP_CAN_FrameType_t BSP_CAN_GetFrameType(CAN_RxHeaderTypeDef *header);
|
static BSP_CAN_FrameType_t BSP_CAN_GetFrameType(CAN_RxHeaderTypeDef *header);
|
||||||
static uint32_t BSP_CAN_DefaultIdParser(uint32_t original_id, BSP_CAN_FrameType_t frame_type);
|
static uint32_t BSP_CAN_DefaultIdParser(uint32_t original_id, BSP_CAN_FrameType_t frame_type);
|
||||||
|
|
||||||
@ -208,53 +213,79 @@ static void BSP_CAN_RxFifo1Callback(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 发送完成回调统一处理函数
|
||||||
|
*/
|
||||||
|
static void BSP_CAN_TxCompleteCallback(CAN_HandleTypeDef *hcan) {
|
||||||
|
BSP_CAN_t bsp_can = CAN_Get(hcan);
|
||||||
|
if (bsp_can != BSP_CAN_ERR) {
|
||||||
|
// 释放发送信号量
|
||||||
|
if (tx_semaphore[bsp_can] != NULL) {
|
||||||
|
osSemaphoreRelease(tx_semaphore[bsp_can]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 发送中止回调统一处理函数
|
||||||
|
*/
|
||||||
|
static void BSP_CAN_TxAbortCallback(CAN_HandleTypeDef *hcan) {
|
||||||
|
BSP_CAN_t bsp_can = CAN_Get(hcan);
|
||||||
|
if (bsp_can != BSP_CAN_ERR) {
|
||||||
|
// 释放发送信号量(发送中止也要释放)
|
||||||
|
if (tx_semaphore[bsp_can] != NULL) {
|
||||||
|
osSemaphoreRelease(tx_semaphore[bsp_can]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* HAL Callback Functions --------------------------------------------------- */
|
/* HAL Callback Functions --------------------------------------------------- */
|
||||||
void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) {
|
void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) {
|
||||||
BSP_CAN_t bsp_can = CAN_Get(hcan);
|
BSP_CAN_t bsp_can = CAN_Get(hcan);
|
||||||
if (bsp_can != BSP_CAN_ERR) {
|
if (bsp_can != BSP_CAN_ERR) {
|
||||||
if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX0_CPLT_CB])
|
if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX0_CPLT_CB])
|
||||||
CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX0_CPLT_CB]();
|
CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX0_CPLT_CB]();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan) {
|
void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan) {
|
||||||
BSP_CAN_t bsp_can = CAN_Get(hcan);
|
BSP_CAN_t bsp_can = CAN_Get(hcan);
|
||||||
if (bsp_can != BSP_CAN_ERR) {
|
if (bsp_can != BSP_CAN_ERR) {
|
||||||
if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX1_CPLT_CB])
|
if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX1_CPLT_CB])
|
||||||
CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX1_CPLT_CB]();
|
CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX1_CPLT_CB]();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan) {
|
void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan) {
|
||||||
BSP_CAN_t bsp_can = CAN_Get(hcan);
|
BSP_CAN_t bsp_can = CAN_Get(hcan);
|
||||||
if (bsp_can != BSP_CAN_ERR) {
|
if (bsp_can != BSP_CAN_ERR) {
|
||||||
if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX2_CPLT_CB])
|
if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX2_CPLT_CB])
|
||||||
CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX2_CPLT_CB]();
|
CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX2_CPLT_CB]();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan) {
|
void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan) {
|
||||||
BSP_CAN_t bsp_can = CAN_Get(hcan);
|
BSP_CAN_t bsp_can = CAN_Get(hcan);
|
||||||
if (bsp_can != BSP_CAN_ERR) {
|
if (bsp_can != BSP_CAN_ERR) {
|
||||||
if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX0_ABORT_CB])
|
if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX0_ABORT_CB])
|
||||||
CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX0_ABORT_CB]();
|
CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX0_ABORT_CB]();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan) {
|
void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan) {
|
||||||
BSP_CAN_t bsp_can = CAN_Get(hcan);
|
BSP_CAN_t bsp_can = CAN_Get(hcan);
|
||||||
if (bsp_can != BSP_CAN_ERR) {
|
if (bsp_can != BSP_CAN_ERR) {
|
||||||
if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX1_ABORT_CB])
|
if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX1_ABORT_CB])
|
||||||
CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX1_ABORT_CB]();
|
CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX1_ABORT_CB]();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan) {
|
void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan) {
|
||||||
BSP_CAN_t bsp_can = CAN_Get(hcan);
|
BSP_CAN_t bsp_can = CAN_Get(hcan);
|
||||||
if (bsp_can != BSP_CAN_ERR) {
|
if (bsp_can != BSP_CAN_ERR) {
|
||||||
if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX2_ABORT_CB])
|
if (CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX2_ABORT_CB])
|
||||||
CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX2_ABORT_CB]();
|
CAN_Callback[bsp_can][HAL_CAN_TX_MAILBOX2_ABORT_CB]();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {
|
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {
|
||||||
@ -332,6 +363,25 @@ int8_t BSP_CAN_Init(void) {
|
|||||||
return BSP_ERR;
|
return BSP_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 创建发送信号量,每个CAN通道有3个发送邮箱
|
||||||
|
for (int i = 0; i < BSP_CAN_NUM; i++) {
|
||||||
|
tx_semaphore[i] = osSemaphoreNew(CAN_TX_MAILBOX_NUM, CAN_TX_MAILBOX_NUM, NULL);
|
||||||
|
if (tx_semaphore[i] == NULL) {
|
||||||
|
// 清理已创建的信号量
|
||||||
|
for (int j = 0; j < i; j++) {
|
||||||
|
if (tx_semaphore[j] != NULL) {
|
||||||
|
osSemaphoreDelete(tx_semaphore[j]);
|
||||||
|
tx_semaphore[j] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (queue_mutex != NULL) {
|
||||||
|
osMutexDelete(queue_mutex);
|
||||||
|
queue_mutex = NULL;
|
||||||
|
}
|
||||||
|
return BSP_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* AUTO GENERATED CAN_INIT */
|
/* AUTO GENERATED CAN_INIT */
|
||||||
|
|
||||||
inited = true;
|
inited = true;
|
||||||
@ -356,6 +406,14 @@ int8_t BSP_CAN_DeInit(void) {
|
|||||||
osMutexRelease(queue_mutex);
|
osMutexRelease(queue_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 删除发送信号量
|
||||||
|
for (int i = 0; i < BSP_CAN_NUM; i++) {
|
||||||
|
if (tx_semaphore[i] != NULL) {
|
||||||
|
osSemaphoreDelete(tx_semaphore[i]);
|
||||||
|
tx_semaphore[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 删除互斥锁
|
// 删除互斥锁
|
||||||
if (queue_mutex != NULL) {
|
if (queue_mutex != NULL) {
|
||||||
osMutexDelete(queue_mutex);
|
osMutexDelete(queue_mutex);
|
||||||
@ -418,8 +476,20 @@ int8_t BSP_CAN_Transmit(BSP_CAN_t can, BSP_CAN_Format_t format,
|
|||||||
return BSP_ERR;
|
return BSP_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取发送信号量,确保有可用的发送邮箱
|
||||||
|
if (tx_semaphore[can] == NULL) {
|
||||||
|
return BSP_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
osStatus_t sem_status = osSemaphoreAcquire(tx_semaphore[can], CAN_TX_SEMAPHORE_TIMEOUT);
|
||||||
|
if (sem_status != osOK) {
|
||||||
|
return BSP_ERR_TIMEOUT; // 获取信号量超时,表示发送邮箱已满
|
||||||
|
}
|
||||||
|
|
||||||
CAN_HandleTypeDef *hcan = BSP_CAN_GetHandle(can);
|
CAN_HandleTypeDef *hcan = BSP_CAN_GetHandle(can);
|
||||||
if (hcan == NULL) {
|
if (hcan == NULL) {
|
||||||
|
// 如果获取句柄失败,需要释放信号量
|
||||||
|
osSemaphoreRelease(tx_semaphore[can]);
|
||||||
return BSP_ERR_NULL;
|
return BSP_ERR_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -448,6 +518,8 @@ int8_t BSP_CAN_Transmit(BSP_CAN_t can, BSP_CAN_Format_t format,
|
|||||||
header.RTR = CAN_RTR_REMOTE;
|
header.RTR = CAN_RTR_REMOTE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
// 如果格式错误,需要释放信号量
|
||||||
|
osSemaphoreRelease(tx_semaphore[can]);
|
||||||
return BSP_ERR;
|
return BSP_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -455,7 +527,15 @@ int8_t BSP_CAN_Transmit(BSP_CAN_t can, BSP_CAN_Format_t format,
|
|||||||
header.TransmitGlobalTime = DISABLE;
|
header.TransmitGlobalTime = DISABLE;
|
||||||
|
|
||||||
HAL_StatusTypeDef result = HAL_CAN_AddTxMessage(hcan, &header, data, &mailbox);
|
HAL_StatusTypeDef result = HAL_CAN_AddTxMessage(hcan, &header, data, &mailbox);
|
||||||
return (result == HAL_OK) ? BSP_OK : BSP_ERR;
|
|
||||||
|
if (result != HAL_OK) {
|
||||||
|
// 如果发送失败,需要释放信号量
|
||||||
|
osSemaphoreRelease(tx_semaphore[can]);
|
||||||
|
return BSP_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送成功,信号量将在发送完成回调中释放
|
||||||
|
return BSP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t BSP_CAN_TransmitStdDataFrame(BSP_CAN_t can, BSP_CAN_StdDataFrame_t *frame) {
|
int8_t BSP_CAN_TransmitStdDataFrame(BSP_CAN_t can, BSP_CAN_StdDataFrame_t *frame) {
|
||||||
@ -574,6 +654,3 @@ uint32_t BSP_CAN_ParseId(uint32_t original_id, BSP_CAN_FrameType_t frame_type) {
|
|||||||
}
|
}
|
||||||
return BSP_CAN_DefaultIdParser(original_id, frame_type);
|
return BSP_CAN_DefaultIdParser(original_id, frame_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* USER CAN FUNCTIONS BEGIN */
|
|
||||||
/* USER CAN FUNCTIONS END */
|
|
@ -17,6 +17,7 @@ extern "C" {
|
|||||||
#define BSP_CAN_DEFAULT_QUEUE_SIZE 10
|
#define BSP_CAN_DEFAULT_QUEUE_SIZE 10
|
||||||
#define BSP_CAN_TIMEOUT_IMMEDIATE 0
|
#define BSP_CAN_TIMEOUT_IMMEDIATE 0
|
||||||
#define BSP_CAN_TIMEOUT_FOREVER osWaitForever
|
#define BSP_CAN_TIMEOUT_FOREVER osWaitForever
|
||||||
|
#define CAN_TX_SEMAPHORE_TIMEOUT 1000 /* 发送信号量超时时间(ms) */
|
||||||
|
|
||||||
/* Exported macro ----------------------------------------------------------- */
|
/* Exported macro ----------------------------------------------------------- */
|
||||||
/* Exported types ----------------------------------------------------------- */
|
/* Exported types ----------------------------------------------------------- */
|
||||||
@ -224,9 +225,6 @@ int8_t BSP_CAN_UnregisterIdParser(void);
|
|||||||
*/
|
*/
|
||||||
uint32_t BSP_CAN_ParseId(uint32_t original_id, BSP_CAN_FrameType_t frame_type);
|
uint32_t BSP_CAN_ParseId(uint32_t original_id, BSP_CAN_FrameType_t frame_type);
|
||||||
|
|
||||||
/* USER CAN FUNCTIONS BEGIN */
|
|
||||||
/* USER CAN FUNCTIONS END */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
@ -1,7 +1,11 @@
|
|||||||
uart,要求开启dma和中断
|
uart,请开启uart的dma和中断
|
||||||
can,2222
|
can,请开启can中断,使用函数前请确保can已经初始化。
|
||||||
gpio,要求设置label开启中断
|
gpio,会自动读取cubemx中配置为gpio的引脚,并自动区分输入输出和中断。
|
||||||
spi,要求开启spi中断
|
spi,请开启spi的dma和中断
|
||||||
i2c,要求开始spi中断
|
i2c,要求开始spi中断
|
||||||
mm,这是套了一层的内存
|
mm,这是套了一层的动态内存分配
|
||||||
time,需要使用开启freerots
|
time,获取时间戳函数,需要开启freerots
|
||||||
|
dwt,需要开启dwt,获取时间
|
||||||
|
i2c,请开启i2c的dma和中断
|
||||||
|
pwm,用于选择那些勇于输出pwm
|
||||||
|
|
||||||
|
|
@ -35,7 +35,6 @@ int8_t BSP_PWM_SetComp(BSP_PWM_Channel_t ch, float duty_cycle) {
|
|||||||
if (duty_cycle < 0.0f) {
|
if (duty_cycle < 0.0f) {
|
||||||
duty_cycle = 0.0f;
|
duty_cycle = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取ARR值(周期值)
|
// 获取ARR值(周期值)
|
||||||
uint32_t arr = __HAL_TIM_GET_AUTORELOAD(PWM_Map[ch].tim);
|
uint32_t arr = __HAL_TIM_GET_AUTORELOAD(PWM_Map[ch].tim);
|
||||||
|
|
||||||
@ -43,6 +42,7 @@ int8_t BSP_PWM_SetComp(BSP_PWM_Channel_t ch, float duty_cycle) {
|
|||||||
uint32_t ccr = (uint32_t)(duty_cycle * (arr + 1));
|
uint32_t ccr = (uint32_t)(duty_cycle * (arr + 1));
|
||||||
|
|
||||||
__HAL_TIM_SET_COMPARE(PWM_Map[ch].tim, PWM_Map[ch].channel, ccr);
|
__HAL_TIM_SET_COMPARE(PWM_Map[ch].tim, PWM_Map[ch].channel, ccr);
|
||||||
|
|
||||||
return BSP_OK;
|
return BSP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
/*
|
|
||||||
弹道补偿算法。
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ballistics.h"
|
|
||||||
|
|
||||||
void Ballistics_Init(Ballistics_t *b) { (void)b; }
|
|
||||||
void Ballistics_Apply(Ballistics_t *b, float bullet_speed) {
|
|
||||||
(void)b;
|
|
||||||
(void)bullet_speed;
|
|
||||||
}
|
|
||||||
void Ballistics_Reset(Ballistics_t *b) { (void)b; }
|
|
@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
弹道补偿算法。
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "ahrs.h"
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
AHRS_Eulr_t *eulr;
|
|
||||||
} Ballistics_t;
|
|
||||||
|
|
||||||
void Ballistics_Init(Ballistics_t *b);
|
|
||||||
void Ballistics_Apply(Ballistics_t *b, float bullet_speed);
|
|
||||||
void Ballistics_Reset(Ballistics_t *b);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
@ -1,6 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
剩余电量算法。
|
剩余电量算法。
|
||||||
|
|
||||||
通过电压值计算剩余电量。
|
通过电压值计算剩余电量。
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ extern "C" {
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "ahrs.h"
|
#include "component/ahrs.h"
|
||||||
|
|
||||||
#define CMD_REFEREE_MAX_NUM (3) /* 发送命令限定的最大数量 */
|
#define CMD_REFEREE_MAX_NUM (3) /* 发送命令限定的最大数量 */
|
||||||
|
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
ahrs,component/user_math.h
|
||||||
|
capacity,component/user_math.h
|
||||||
|
cmd,component/ahrs
|
||||||
|
error_detect,bsp/mm
|
||||||
pid,component/filter
|
pid,component/filter
|
||||||
ahrs,component/filter
|
filter,component/ahrs
|
||||||
filter,component/ahrs
|
mixer,component/user_math.h
|
||||||
|
ui,component/user_math.h
|
|
@ -1,2 +1,14 @@
|
|||||||
pid,好用的
|
pid,好用的
|
||||||
ahrs,开源的
|
ahrs,开源的AHRS算法,MadgwickAHRS
|
||||||
|
capacity,电池容量计算
|
||||||
|
cmd,通用控制命令
|
||||||
|
crc8,CRC8校验rm
|
||||||
|
crc16,CRC16校验rm
|
||||||
|
error_detect,错误检测
|
||||||
|
filter,各类滤波器
|
||||||
|
FreeRTOS_CLI,FreeRTOS命令行接口
|
||||||
|
limiter,限幅器
|
||||||
|
mixer,混控器
|
||||||
|
ui,用户交互
|
||||||
|
user_math,用户自定义数学函数
|
||||||
|
pid,PID控制器
|
|
@ -1,4 +1,4 @@
|
|||||||
bsp,can,dwt,gpio,i2c,mm,spi,uart,pwm,time
|
bsp,can,dwt,gpio,i2c,mm,spi,uart,pwm,time
|
||||||
component,ahrs,ballistics,capacity,cmd,crc8,crc16,error_detect,filter,FreeRTOS_CLI,limiter,mixer,pid,ui,user_math
|
component,ahrs,capacity,cmd,crc8,crc16,error_detect,filter,FreeRTOS_CLI,limiter,mixer,pid,ui,user_math
|
||||||
device,dr16,bmi088,ist8310,motor,motor_rm,motor_vesc,motor_lk,motor_lz,motor_odrive,dm_imu,servo,buzzer,led,ws2812
|
device,dr16,bmi088,ist8310,motor,motor_rm,motor_vesc,motor_lk,motor_lz,motor_odrive,dm_imu,servo,buzzer,led,ws2812
|
||||||
module,
|
module,
|
|
BIN
assets/User_code/device/.DS_Store
vendored
BIN
assets/User_code/device/.DS_Store
vendored
Binary file not shown.
@ -1,6 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
BMI088 陀螺仪+加速度计传感器。
|
BMI088 陀螺仪+加速度计传感器。
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Includes ----------------------------------------------------------------- */
|
/* Includes ----------------------------------------------------------------- */
|
||||||
|
@ -79,7 +79,10 @@ devices:
|
|||||||
name: "VESC 电调"
|
name: "VESC 电调"
|
||||||
description: "VESC 电调驱动"
|
description: "VESC 电调驱动"
|
||||||
dependencies:
|
dependencies:
|
||||||
bsp: ["can", "time"]
|
bsp: ["can", "time", "mm"]
|
||||||
|
component: ["user_math"]
|
||||||
|
thread_signals:
|
||||||
|
- name: "SIGNAL_VESC_DATA_REDY"
|
||||||
files:
|
files:
|
||||||
header: "motor_vesc.h"
|
header: "motor_vesc.h"
|
||||||
source: "motor_vesc.c"
|
source: "motor_vesc.c"
|
||||||
@ -88,7 +91,10 @@ devices:
|
|||||||
name: "ODrive 电机"
|
name: "ODrive 电机"
|
||||||
description: "ODrive 电机驱动"
|
description: "ODrive 电机驱动"
|
||||||
dependencies:
|
dependencies:
|
||||||
bsp: ["can", "time"]
|
bsp: ["can", "time", "mm"]
|
||||||
|
component: ["user_math"]
|
||||||
|
thread_signals:
|
||||||
|
- name: "SIGNAL_ODRIVE_DATA_REDY"
|
||||||
files:
|
files:
|
||||||
header: "motor_odrive.h"
|
header: "motor_odrive.h"
|
||||||
source: "motor_odrive.c"
|
source: "motor_odrive.c"
|
||||||
@ -97,7 +103,10 @@ devices:
|
|||||||
name: "RM 电机"
|
name: "RM 电机"
|
||||||
description: "RM 电机驱动"
|
description: "RM 电机驱动"
|
||||||
dependencies:
|
dependencies:
|
||||||
bsp: ["can", "time"]
|
bsp: ["can", "time", "mm"]
|
||||||
|
component: ["user_math"]
|
||||||
|
thread_signals:
|
||||||
|
- name: "SIGNAL_RM_MOTOR_DATA_REDY"
|
||||||
files:
|
files:
|
||||||
header: "motor_rm.h"
|
header: "motor_rm.h"
|
||||||
source: "motor_rm.c"
|
source: "motor_rm.c"
|
||||||
@ -105,6 +114,11 @@ devices:
|
|||||||
motor:
|
motor:
|
||||||
name: "通用电机"
|
name: "通用电机"
|
||||||
description: "通用电机驱动"
|
description: "通用电机驱动"
|
||||||
|
dependencies:
|
||||||
|
bsp: []
|
||||||
|
component: []
|
||||||
|
bsp_requirements: []
|
||||||
|
thread_signals: []
|
||||||
files:
|
files:
|
||||||
header: "motor.h"
|
header: "motor.h"
|
||||||
source: "motor.c"
|
source: "motor.c"
|
||||||
@ -115,11 +129,91 @@ devices:
|
|||||||
dependencies:
|
dependencies:
|
||||||
bsp: ["pwm", "time"]
|
bsp: ["pwm", "time"]
|
||||||
component: []
|
component: []
|
||||||
bsp_requirements:
|
|
||||||
- type: "pwm"
|
|
||||||
var_name: "BSP_PWM_WS2812"
|
|
||||||
description: "用于WS2812数据传输的PWM通道"
|
|
||||||
thread_signals: []
|
thread_signals: []
|
||||||
files:
|
files:
|
||||||
header: "ws2812.h"
|
header: "ws2812.h"
|
||||||
source: "ws2812.c"
|
source: "ws2812.c"
|
||||||
|
|
||||||
|
buzzer:
|
||||||
|
name: "蜂鸣器"
|
||||||
|
description: "蜂鸣器驱动"
|
||||||
|
dependencies:
|
||||||
|
bsp: ["pwm"]
|
||||||
|
component: []
|
||||||
|
bsp_requirements:
|
||||||
|
- type: "pwm"
|
||||||
|
var_name: "BSP_PWM_BUZZER"
|
||||||
|
description: "用于蜂鸣器的PWM通道"
|
||||||
|
thread_signals: []
|
||||||
|
files:
|
||||||
|
header: "buzzer.h"
|
||||||
|
source: "buzzer.c"
|
||||||
|
|
||||||
|
dm_imu:
|
||||||
|
name: "DM IMU"
|
||||||
|
description: "DM IMU 传感器"
|
||||||
|
dependencies:
|
||||||
|
bsp: ["can", "time"]
|
||||||
|
component: ["user_math"]
|
||||||
|
thread_signals:
|
||||||
|
- name: "SIGNAL_DM_IMU_DATA_REDY"
|
||||||
|
files:
|
||||||
|
header: "dm_imu.h"
|
||||||
|
source: "dm_imu.c"
|
||||||
|
|
||||||
|
led:
|
||||||
|
name: "LED 灯"
|
||||||
|
description: "LED 灯驱动"
|
||||||
|
dependencies:
|
||||||
|
bsp: ["gpio", "pwm"]
|
||||||
|
component: []
|
||||||
|
thread_signals: []
|
||||||
|
files:
|
||||||
|
header: "led.h"
|
||||||
|
source: "led.c"
|
||||||
|
|
||||||
|
motor_lk:
|
||||||
|
name: "LK 电机"
|
||||||
|
description: "LK 电机驱动"
|
||||||
|
dependencies:
|
||||||
|
bsp: ["can", "time", "mm"]
|
||||||
|
component: ["user_math"]
|
||||||
|
thread_signals:
|
||||||
|
- name: "SIGNAL_LK_MOTOR_DATA_REDY"
|
||||||
|
files:
|
||||||
|
header: "motor_lk.h"
|
||||||
|
source: "motor_lk.c"
|
||||||
|
|
||||||
|
motor_lz:
|
||||||
|
name: "LZ 电机"
|
||||||
|
description: "LZ 电机驱动"
|
||||||
|
dependencies:
|
||||||
|
bsp: ["can", "time", "mm"]
|
||||||
|
component: ["user_math"]
|
||||||
|
thread_signals:
|
||||||
|
- name: "SIGNAL_LZ_MOTOR_DATA_REDY"
|
||||||
|
files:
|
||||||
|
header: "motor_lz.h"
|
||||||
|
source: "motor_lz.c"
|
||||||
|
|
||||||
|
servo:
|
||||||
|
name: "舵机"
|
||||||
|
description: "舵机驱动"
|
||||||
|
dependencies:
|
||||||
|
bsp: ["pwm"]
|
||||||
|
component: []
|
||||||
|
thread_signals: []
|
||||||
|
files:
|
||||||
|
header: "servo.h"
|
||||||
|
source: "servo.c"
|
||||||
|
|
||||||
|
vofa:
|
||||||
|
name: "VOFA"
|
||||||
|
description: "VOFA 数据传输协议"
|
||||||
|
dependencies:
|
||||||
|
bsp: ["uart"]
|
||||||
|
component: []
|
||||||
|
thread_signals: []
|
||||||
|
files:
|
||||||
|
header: "vofa.h"
|
||||||
|
source: "vofa.c"
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
DM_IMU数据获取
|
DM_IMU数据获取(CAN)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Includes ----------------------------------------------------------------- */
|
/* Includes ----------------------------------------------------------------- */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
DR16接收机
|
DR16接收机
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Includes ----------------------------------------------------------------- */
|
/* Includes ----------------------------------------------------------------- */
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
IST8310 地磁传感器。
|
IST8310 地磁传感器。
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Includes ----------------------------------------------------------------- */
|
/* Includes ----------------------------------------------------------------- */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
DR16接收机
|
电机通用函数
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Includes ----------------------------------------------------------------- */
|
/* Includes ----------------------------------------------------------------- */
|
||||||
@ -18,29 +18,17 @@
|
|||||||
/* Exported functions ------------------------------------------------------- */
|
/* Exported functions ------------------------------------------------------- */
|
||||||
float MOTOR_GetRotorAbsAngle(const MOTOR_t *motor) {
|
float MOTOR_GetRotorAbsAngle(const MOTOR_t *motor) {
|
||||||
if (motor == NULL) return DEVICE_ERR_NULL;
|
if (motor == NULL) return DEVICE_ERR_NULL;
|
||||||
if (motor->reverse) {
|
motor->feedback.rotor_abs_angle;
|
||||||
return -motor->feedback.rotor_abs_angle;
|
|
||||||
}else{
|
|
||||||
return motor->feedback.rotor_abs_angle;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float MOTOR_GetRotorSpeed(const MOTOR_t *motor) {
|
float MOTOR_GetRotorSpeed(const MOTOR_t *motor) {
|
||||||
if (motor == NULL) return DEVICE_ERR_NULL;
|
if (motor == NULL) return DEVICE_ERR_NULL;
|
||||||
if (motor->reverse) {
|
return motor->feedback.rotor_speed;
|
||||||
return -motor->feedback.rotor_speed;
|
|
||||||
}else{
|
|
||||||
return motor->feedback.rotor_speed;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float MOTOR_GetTorqueCurrent(const MOTOR_t *motor) {
|
float MOTOR_GetTorqueCurrent(const MOTOR_t *motor) {
|
||||||
if (motor == NULL) return DEVICE_ERR_NULL;
|
if (motor == NULL) return DEVICE_ERR_NULL;
|
||||||
if (motor->reverse) {
|
return motor->feedback.torque_current;
|
||||||
return -motor->feedback.torque_current;
|
|
||||||
}else{
|
|
||||||
return motor->feedback.torque_current;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float MOTOR_GetTemp(const MOTOR_t *motor) {
|
float MOTOR_GetTemp(const MOTOR_t *motor) {
|
||||||
|
@ -1,10 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
灵足电机驱动
|
灵足电机驱动
|
||||||
|
|
||||||
灵足电机通信协议:
|
|
||||||
- CAN 2.0通信接口,波特率1Mbps
|
|
||||||
- 采用扩展帧格式(29位ID)
|
|
||||||
- ID格式:Bit28~24(通信类型) + Bit23~8(数据区2) + Bit7~0(目标地址)
|
|
||||||
*/
|
*/
|
||||||
/* Includes ----------------------------------------------------------------- */
|
/* Includes ----------------------------------------------------------------- */
|
||||||
#include "motor_lz.h"
|
#include "motor_lz.h"
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
CAN总线上的设备
|
Odrive电机驱动
|
||||||
将所有CAN总线上挂载的设备抽象成一个设备进行配置和控制
|
|
||||||
*/
|
*/
|
||||||
/* Includes ----------------------------------------------------------------- */
|
/* Includes ----------------------------------------------------------------- */
|
||||||
#include "motor_odrive.h"
|
#include "motor_odrive.h"
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
CAN总线上的设备
|
RM电机驱动
|
||||||
将所有CAN总线上挂载的设备抽象成一个设备进行配置和控制
|
|
||||||
*/
|
*/
|
||||||
/* Includes ----------------------------------------------------------------- */
|
/* Includes ----------------------------------------------------------------- */
|
||||||
#include "motor_rm.h"
|
#include "motor_rm.h"
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
CAN总线上的设备
|
VESC电机驱动
|
||||||
将所有CAN总线上挂载的设备抽象成一个设备进行配置和控制
|
|
||||||
*/
|
*/
|
||||||
/* Includes ----------------------------------------------------------------- */
|
/* Includes ----------------------------------------------------------------- */
|
||||||
#include "motor_vesc.h"
|
#include "motor_vesc.h"
|
||||||
|
@ -20,125 +20,125 @@ extern "C"
|
|||||||
// VESC数量根据实际情况调整
|
// VESC数量根据实际情况调整
|
||||||
#define VESC_MAX_MOTORS 4
|
#define VESC_MAX_MOTORS 4
|
||||||
|
|
||||||
/* Exported constants ------------------------------------------------------- */
|
/* Exported constants ------------------------------------------------------- */
|
||||||
|
|
||||||
/* Exported macro ----------------------------------------------------------- */
|
/* Exported macro ----------------------------------------------------------- */
|
||||||
/* Exported types ----------------------------------------------------------- */
|
/* Exported types ----------------------------------------------------------- */
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
VESC_1 = 1,
|
VESC_1 = 1,
|
||||||
VESC_2 = 2,
|
VESC_2 = 2,
|
||||||
VESC_3 = 3,
|
VESC_3 = 3,
|
||||||
VESC_4 = 4,
|
VESC_4 = 4,
|
||||||
CAN_VESC5065_M1_MSG1 = 0x901, // vesc的数据回传使用了扩展id,[0:7]为驱动器id,[8:15]为帧类型
|
CAN_VESC5065_M1_MSG1 = 0x901, // vesc的数据回传使用了扩展id,[0:7]为驱动器id,[8:15]为帧类型
|
||||||
CAN_VESC5065_M2_MSG1 = 0x902,
|
CAN_VESC5065_M2_MSG1 = 0x902,
|
||||||
CAN_VESC5065_M3_MSG1 = 0x903,
|
CAN_VESC5065_M3_MSG1 = 0x903,
|
||||||
CAN_VESC5065_M4_MSG1 = 0x904,
|
CAN_VESC5065_M4_MSG1 = 0x904,
|
||||||
}VESC_ID;
|
}VESC_ID;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
CAN_PACKET_SET_DUTY = 0,
|
CAN_PACKET_SET_DUTY = 0,
|
||||||
CAN_PACKET_SET_CURRENT = 1,
|
CAN_PACKET_SET_CURRENT = 1,
|
||||||
CAN_PACKET_SET_CURRENT_BRAKE = 2,
|
CAN_PACKET_SET_CURRENT_BRAKE = 2,
|
||||||
CAN_PACKET_SET_RPM = 3,
|
CAN_PACKET_SET_RPM = 3,
|
||||||
CAN_PACKET_SET_POS = 4,
|
CAN_PACKET_SET_POS = 4,
|
||||||
CAN_PACKET_FILL_RX_BUFFER = 5,
|
CAN_PACKET_FILL_RX_BUFFER = 5,
|
||||||
CAN_PACKET_FILL_RX_BUFFER_LONG = 6,
|
CAN_PACKET_FILL_RX_BUFFER_LONG = 6,
|
||||||
CAN_PACKET_PROCESS_RX_BUFFER = 7,
|
CAN_PACKET_PROCESS_RX_BUFFER = 7,
|
||||||
CAN_PACKET_PROCESS_SHORT_BUFFER = 8,
|
CAN_PACKET_PROCESS_SHORT_BUFFER = 8,
|
||||||
CAN_PACKET_STATUS = 9,
|
CAN_PACKET_STATUS = 9,
|
||||||
CAN_PACKET_SET_CURRENT_REL = 10,
|
CAN_PACKET_SET_CURRENT_REL = 10,
|
||||||
CAN_PACKET_SET_CURRENT_BRAKE_REL = 11,
|
CAN_PACKET_SET_CURRENT_BRAKE_REL = 11,
|
||||||
CAN_PACKET_SET_CURRENT_HANDBRAKE = 12,
|
CAN_PACKET_SET_CURRENT_HANDBRAKE = 12,
|
||||||
CAN_PACKET_SET_CURRENT_HANDBRAKE_REL = 13
|
CAN_PACKET_SET_CURRENT_HANDBRAKE_REL = 13
|
||||||
} CAN_PACKET_ID;
|
} CAN_PACKET_ID;
|
||||||
|
|
||||||
// Control Modes
|
// Control Modes
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
DUTY_CONTROL = 0x0,
|
DUTY_CONTROL = 0x0,
|
||||||
RPM_CONTROL = 0x1,
|
RPM_CONTROL = 0x1,
|
||||||
CURRENT_CONTROL = 0x2,
|
CURRENT_CONTROL = 0x2,
|
||||||
POSITION_CONTROL = 0x3
|
POSITION_CONTROL = 0x3
|
||||||
} Control_Mode;
|
} Control_Mode;
|
||||||
|
|
||||||
/*每个电机需要的参数*/
|
/*每个电机需要的参数*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
BSP_CAN_t can;
|
BSP_CAN_t can;
|
||||||
uint16_t id;
|
uint16_t id;
|
||||||
uint16_t mode;
|
uint16_t mode;
|
||||||
bool reverse;
|
bool reverse;
|
||||||
} VESC_Param_t;
|
} VESC_Param_t;
|
||||||
|
|
||||||
/*电机实例*/
|
/*电机实例*/
|
||||||
typedef struct ODrive_t
|
typedef struct ODrive_t
|
||||||
{
|
{
|
||||||
VESC_Param_t param;
|
VESC_Param_t param;
|
||||||
MOTOR_t motor;
|
MOTOR_t motor;
|
||||||
} VESC_t;
|
} VESC_t;
|
||||||
|
|
||||||
/*CAN管理器,管理一个CAN总线上所有的电机*/
|
/*CAN管理器,管理一个CAN总线上所有的电机*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
BSP_CAN_t can;
|
BSP_CAN_t can;
|
||||||
VESC_t *motors[VESC_MAX_MOTORS];
|
VESC_t *motors[VESC_MAX_MOTORS];
|
||||||
uint8_t motor_count;
|
uint8_t motor_count;
|
||||||
} VESC_CANManager_t;
|
} VESC_CANManager_t;
|
||||||
|
|
||||||
/* Exported functions prototypes -------------------------------------------- */
|
/* Exported functions prototypes -------------------------------------------- */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 注册一个vesc电机
|
* @brief 注册一个vesc电机
|
||||||
* @param param 电机参数
|
* @param param 电机参数
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int8_t VESC_Register(VESC_Param_t *param);
|
int8_t VESC_Register(VESC_Param_t *param);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 更新指定电机数据
|
* @brief 更新指定电机数据
|
||||||
* @param param 电机参数
|
* @param param 电机参数
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int8_t VESC_Update(VESC_Param_t *param);
|
int8_t VESC_Update(VESC_Param_t *param);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 更新所有电机数据
|
* @brief 更新所有电机数据
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int8_t VESC_UpdateAll(void);
|
int8_t VESC_UpdateAll(void);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 设置一个电机的输出
|
|
||||||
* @param param 电机参数
|
|
||||||
* @param value 输出值
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
|
|
||||||
int8_t VESC_SetOutput(VESC_Param_t *param, float value);
|
/**
|
||||||
|
* @brief 设置一个电机的输出
|
||||||
|
* @param param 电机参数
|
||||||
|
* @param value 输出值
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
int8_t VESC_SetOutput(VESC_Param_t *param, float value);
|
||||||
* @brief 获取指定电机的实例指针
|
|
||||||
* @param param 电机参数
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
|
|
||||||
VESC_t* VESC_GetMotor(VESC_Param_t *param);
|
/**
|
||||||
|
* @brief 获取指定电机的实例指针
|
||||||
|
* @param param 电机参数
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
VESC_t* VESC_GetMotor(VESC_Param_t *param);
|
||||||
* @brief 使电机松弛(设置输出为0)
|
|
||||||
* @param param
|
/**
|
||||||
* @return
|
* @brief 使电机松弛(设置输出为0)
|
||||||
*/
|
* @param param
|
||||||
int8_t VESC_Relax(VESC_Param_t *param);
|
* @return
|
||||||
/**
|
*/
|
||||||
* @brief 使电机离线(设置在线状态为false)
|
int8_t VESC_Relax(VESC_Param_t *param);
|
||||||
* @param param
|
/**
|
||||||
* @return
|
* @brief 使电机离线(设置在线状态为false)
|
||||||
*/
|
* @param param
|
||||||
int8_t VESC_Offine(VESC_Param_t *param);
|
* @return
|
||||||
|
*/
|
||||||
|
int8_t VESC_Offine(VESC_Param_t *param);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
89
assets/User_code/device/vofa.c
Normal file
89
assets/User_code/device/vofa.c
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
/* Includes ----------------------------------------------------------------- */
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "device/vofa.h"
|
||||||
|
#include "bsp/uart.h"
|
||||||
|
/* Private define ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
#define MAX_CHANNEL 64u // 根据实际最大通道数调整
|
||||||
|
|
||||||
|
#define JUSTFLOAT_TAIL 0x7F800000
|
||||||
|
/* Private macro ------------------------------------------------------------ */
|
||||||
|
/* Private typedef ---------------------------------------------------------- */
|
||||||
|
/* Private variables -------------------------------------------------------- */
|
||||||
|
static uint8_t vofa_tx_buf[sizeof(float) * MAX_CHANNEL + sizeof(uint32_t)];
|
||||||
|
static VOFA_Protocol_t current_protocol = VOFA_PROTOCOL_FIREWATER; // 默认协议
|
||||||
|
|
||||||
|
/* Private function -------------------------------------------------------- */
|
||||||
|
|
||||||
|
/************************ RawData *************************/
|
||||||
|
void VOFA_RawData_Send(const char* data, bool dma) {
|
||||||
|
BSP_UART_Transmit(BSP_UART_VOFA, (uint8_t*)data, strlen(data), dma);
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************ FireWater *************************/
|
||||||
|
void VOFA_FireWater_Send(float *channels, uint8_t channel_count, bool dma)
|
||||||
|
{
|
||||||
|
if (channel_count == 0 || channel_count > MAX_CHANNEL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char *buf = (char *)vofa_tx_buf;
|
||||||
|
size_t len = 0;
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < channel_count; ++i) {
|
||||||
|
len += snprintf(buf + len,
|
||||||
|
sizeof(vofa_tx_buf) - len,
|
||||||
|
"%s%.2f",
|
||||||
|
(i ? "," : ""),
|
||||||
|
channels[i]);
|
||||||
|
}
|
||||||
|
snprintf(buf + len, sizeof(vofa_tx_buf) - len, "\n");
|
||||||
|
|
||||||
|
BSP_UART_Transmit(BSP_UART_VOFA, vofa_tx_buf, strlen(buf), dma);
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************ JustFloat *************************/
|
||||||
|
void VOFA_JustFloat_Send(float *channels, uint8_t channel_count, bool dma)
|
||||||
|
{
|
||||||
|
if (channel_count == 0 || channel_count > MAX_CHANNEL)
|
||||||
|
return;
|
||||||
|
memcpy(vofa_tx_buf, channels, channel_count * sizeof(float));
|
||||||
|
|
||||||
|
uint32_t tail = JUSTFLOAT_TAIL; // 0x7F800000
|
||||||
|
memcpy(vofa_tx_buf + channel_count * sizeof(float), &tail, sizeof(tail));
|
||||||
|
|
||||||
|
BSP_UART_Transmit(BSP_UART_VOFA, vofa_tx_buf, channel_count * sizeof(float) + sizeof(tail), dma);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Exported functions ------------------------------------------------------- */
|
||||||
|
int8_t VOFA_init(VOFA_Protocol_t protocol) {
|
||||||
|
current_protocol = protocol;
|
||||||
|
return DEVICE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int8_t VOFA_Send(float* channels, uint8_t channel_count, bool dma) {
|
||||||
|
switch (current_protocol) {
|
||||||
|
case VOFA_PROTOCOL_RAWDATA:
|
||||||
|
{
|
||||||
|
char data[256];
|
||||||
|
if (channel_count >= 1) {
|
||||||
|
sprintf(data, "Channel1: %.2f", channels[0]);
|
||||||
|
if (channel_count >= 2) {
|
||||||
|
sprintf(data + strlen(data), ", Channel2: %.2f", channels[1]);
|
||||||
|
}
|
||||||
|
strcat(data, "\n");
|
||||||
|
VOFA_RawData_Send(data, dma);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case VOFA_PROTOCOL_FIREWATER:
|
||||||
|
VOFA_FireWater_Send(channels, channel_count, dma);
|
||||||
|
break;
|
||||||
|
case VOFA_PROTOCOL_JUSTFLOAT:
|
||||||
|
VOFA_JustFloat_Send(channels, channel_count, dma);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return DEVICE_ERR;
|
||||||
|
}
|
||||||
|
return DEVICE_OK;
|
||||||
|
}
|
39
assets/User_code/device/vofa.h
Normal file
39
assets/User_code/device/vofa.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Includes ----------------------------------------------------------------- */
|
||||||
|
#include "bsp/uart.h"
|
||||||
|
#include ”device/device.h“
|
||||||
|
/* Exported constants ------------------------------------------------------- */
|
||||||
|
/* Exported macro ----------------------------------------------------------- */
|
||||||
|
/* Exported types ----------------------------------------------------------- */
|
||||||
|
/* Exported functions prototypes -------------------------------------------- */
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
VOFA_PROTOCOL_RAWDATA,
|
||||||
|
VOFA_PROTOCOL_FIREWATER,
|
||||||
|
VOFA_PROTOCOL_JUSTFLOAT,
|
||||||
|
} VOFA_Protocol_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 初始化VOFA设备
|
||||||
|
* @param protocol 设置通信协议
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
int8_t VOFA_init(VOFA_Protocol_t protocol);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 发送数据到VOFA
|
||||||
|
* @param channels 要发送的通道数据
|
||||||
|
* @param channel_count 通道数量
|
||||||
|
* @param dma 是否使用DMA发送
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
int8_t VOFA_Send(float* channels, uint8_t channel_count, bool dma);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user