From 7070545aa218dbb2f20e918b955f0a8167f189b8 Mon Sep 17 00:00:00 2001 From: Robofish <1683502971@qq.com> Date: Wed, 15 Oct 2025 00:31:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9can?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- User/bsp/can.c | 79 +++++++++++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/User/bsp/can.c b/User/bsp/can.c index e401cdd..e094ea1 100644 --- a/User/bsp/can.c +++ b/User/bsp/can.c @@ -45,7 +45,9 @@ static osMessageQueueId_t BSP_CAN_FindQueue(BSP_CAN_t can, uint32_t can_id); static int8_t BSP_CAN_CreateIdQueue(BSP_CAN_t can, uint32_t can_id, uint8_t queue_size); static void BSP_CAN_RxFifo0Callback(void); static void BSP_CAN_RxFifo1Callback(void); -static void BSP_CAN_TxCompleteCallback(void); +static void BSP_CAN_TxCompleteCallback_Internal(BSP_CAN_t can); +static void BSP_CAN_1_TxCompleteCallback(void); +static void BSP_CAN_2_TxCompleteCallback(void); 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 void BSP_CAN_TxQueueInit(BSP_CAN_t can); @@ -212,39 +214,50 @@ static bool BSP_CAN_TxQueueIsEmpty(BSP_CAN_t can) { } /** - * @brief 处理所有CAN实例的发送队列 + * @brief 处理指定CAN实例的发送队列 */ -static void BSP_CAN_TxCompleteCallback(void) { - // 处理所有CAN实例的发送队列 - for (int i = 0; i < BSP_CAN_NUM; i++) { - BSP_CAN_t can = (BSP_CAN_t)i; - CAN_HandleTypeDef *hcan = BSP_CAN_GetHandle(can); - if (hcan == NULL) continue; +static void BSP_CAN_TxCompleteCallback_Internal(BSP_CAN_t can) { + CAN_HandleTypeDef *hcan = BSP_CAN_GetHandle(can); + if (hcan == NULL) return; + + BSP_CAN_TxMessage_t msg; + uint32_t mailbox; + + // 尝试发送队列中的消息 + while (!BSP_CAN_TxQueueIsEmpty(can)) { + // 检查是否有空闲邮箱 + if (HAL_CAN_GetTxMailboxesFreeLevel(hcan) == 0) { + break; // 没有空闲邮箱,等待下次中断 + } - BSP_CAN_TxMessage_t msg; - uint32_t mailbox; + // 从队列中取出消息 + if (!BSP_CAN_TxQueuePop(can, &msg)) { + break; + } - // 尝试发送队列中的消息 - while (!BSP_CAN_TxQueueIsEmpty(can)) { - // 检查是否有空闲邮箱 - if (HAL_CAN_GetTxMailboxesFreeLevel(hcan) == 0) { - break; // 没有空闲邮箱,等待下次中断 - } - - // 从队列中取出消息 - if (!BSP_CAN_TxQueuePop(can, &msg)) { - break; - } - - // 发送消息 - if (HAL_CAN_AddTxMessage(hcan, &msg.header, msg.data, &mailbox) != HAL_OK) { - // 发送失败,消息已经从队列中移除,直接丢弃 - break; - } + // 发送消息 + if (HAL_CAN_AddTxMessage(hcan, &msg.header, msg.data, &mailbox) != HAL_OK) { + // 发送失败,消息已经从队列中移除,直接丢弃 + break; } } } +/** + * @brief 1发送完成回调 + */ +static void BSP_CAN_1_TxCompleteCallback(void) { + BSP_CAN_TxCompleteCallback_Internal(BSP_CAN_1); +} + +/** + * @brief 2发送完成回调 + */ +static void BSP_CAN_2_TxCompleteCallback(void) { + BSP_CAN_TxCompleteCallback_Internal(BSP_CAN_2); +} + + /** * @brief FIFO0接收处理函数 @@ -465,9 +478,9 @@ int8_t BSP_CAN_Init(void) { // 自动注册CAN1接收回调函数 BSP_CAN_RegisterCallback(BSP_CAN_1, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback); - BSP_CAN_RegisterCallback(BSP_CAN_1, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_TxCompleteCallback); - BSP_CAN_RegisterCallback(BSP_CAN_1, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_TxCompleteCallback); - BSP_CAN_RegisterCallback(BSP_CAN_1, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_TxCompleteCallback); + BSP_CAN_RegisterCallback(BSP_CAN_1, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_1_TxCompleteCallback); + BSP_CAN_RegisterCallback(BSP_CAN_1, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_1_TxCompleteCallback); + BSP_CAN_RegisterCallback(BSP_CAN_1, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_1_TxCompleteCallback); // 激活CAN1中断 HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING | @@ -481,9 +494,9 @@ int8_t BSP_CAN_Init(void) { // 自动注册CAN2接收回调函数 BSP_CAN_RegisterCallback(BSP_CAN_2, HAL_CAN_RX_FIFO1_MSG_PENDING_CB, BSP_CAN_RxFifo1Callback); - BSP_CAN_RegisterCallback(BSP_CAN_2, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_TxCompleteCallback); - BSP_CAN_RegisterCallback(BSP_CAN_2, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_TxCompleteCallback); - BSP_CAN_RegisterCallback(BSP_CAN_2, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_TxCompleteCallback); + BSP_CAN_RegisterCallback(BSP_CAN_2, HAL_CAN_TX_MAILBOX0_CPLT_CB, BSP_CAN_2_TxCompleteCallback); + BSP_CAN_RegisterCallback(BSP_CAN_2, HAL_CAN_TX_MAILBOX1_CPLT_CB, BSP_CAN_2_TxCompleteCallback); + BSP_CAN_RegisterCallback(BSP_CAN_2, HAL_CAN_TX_MAILBOX2_CPLT_CB, BSP_CAN_2_TxCompleteCallback); // 激活CAN2中断 HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO1_MSG_PENDING |