From 3ed0b642763fd0867481e715f97c17cc9a5dfb9f Mon Sep 17 00:00:00 2001 From: wdfk-prog <1425075683@qq.com> Date: Thu, 13 Nov 2025 10:55:15 +0800 Subject: [PATCH] feat:[stm32][can]: enhance control logic and refactor sendmsg --- .../libraries/HAL_Drivers/drivers/drv_can.c | 47 ++++++++++++------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c index 196cc94a529..e3e52c391ac 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c @@ -472,11 +472,23 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg) argval = (rt_uint32_t) arg; if (argval == 0) { - HAL_CAN_Stop(&drv_can->CanHandle); + if (HAL_CAN_DeInit(&drv_can->CanHandle) != HAL_OK) + { + LOG_E("CAN deinitialization failed"); + return -RT_ERROR; + } } else { - HAL_CAN_Start(&drv_can->CanHandle); + rt_err_t result = _can_config(&drv_can->device, &drv_can->device.config); + if (result != RT_EOK) + { + return result; + } + if (HAL_CAN_Start(&drv_can->CanHandle) != HAL_OK) + { + return -RT_ERROR; + } } break; @@ -515,32 +527,31 @@ static int _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t (state == HAL_CAN_STATE_LISTENING)) { /*check select mailbox is empty */ + uint32_t mailbox_mask; + uint32_t tme_flag; + switch (1 << box_num) { case CAN_TX_MAILBOX0: - if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME0) != SET) - { - /* Return function status */ - return -RT_ERROR; - } + mailbox_mask = CAN_TX_MAILBOX0; + tme_flag = CAN_TSR_TME0; break; case CAN_TX_MAILBOX1: - if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME1) != SET) - { - /* Return function status */ - return -RT_ERROR; - } + mailbox_mask = CAN_TX_MAILBOX1; + tme_flag = CAN_TSR_TME1; break; case CAN_TX_MAILBOX2: - if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME2) != SET) - { - /* Return function status */ - return -RT_ERROR; - } + mailbox_mask = CAN_TX_MAILBOX2; + tme_flag = CAN_TSR_TME2; break; default: RT_ASSERT(0); - break; + return -RT_ERROR; + } + + if (HAL_IS_BIT_SET(hcan->Instance->TSR, tme_flag) != SET) + { + return -RT_ERROR; } if (RT_CAN_STDID == pmsg->ide)