From 3d82c43f8e6babe16e27ea2fd0a722c319dcd2f2 Mon Sep 17 00:00:00 2001 From: unnamed2 <414874639@qq.com> Date: Sun, 1 Jun 2025 18:59:11 +0800 Subject: [PATCH 1/2] Update drv_can.c MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复CAN总线在出错时没能处理的问题 --- .../libraries/HAL_Drivers/drivers/drv_can.c | 88 +++++++++++-------- 1 file changed, 49 insertions(+), 39 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c index e12624a7098..7df94a52429 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c @@ -704,6 +704,53 @@ static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo) } } +static void _can_check_tx_complete(struct rt_can_device *can) +{ + CAN_HandleTypeDef *hcan; + RT_ASSERT(can); + hcan = &((struct stm32_can *) can->parent.user_data)->CanHandle; + + if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP0)) + { + if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0)) + { + rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 0 << 8); + } + SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0); + } + else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1)) + { + if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1)) + { + rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 1 << 8); + } + SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1); + } + else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2)) + { + if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2)) + { + rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 2 << 8); + } + SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2); + } + else + { + if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR0))/*IF AutoRetransmission = ENABLE,ACK ERR handler*/ + { + SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);/*Abort the send request, trigger the TX interrupt,release completion quantity*/ + } + else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR1)) + { + SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1); + } + else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR2)) + { + SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2); + } + } +} + static void _can_sce_isr(struct rt_can_device *can) { CAN_HandleTypeDef *hcan; @@ -715,51 +762,14 @@ static void _can_sce_isr(struct rt_can_device *can) { case RT_CAN_BUS_BIT_PAD_ERR: can->status.bitpaderrcnt++; + _can_check_tx_complete(can); break; case RT_CAN_BUS_FORMAT_ERR: can->status.formaterrcnt++; break; case RT_CAN_BUS_ACK_ERR:/* attention !!! test ack err's unit is transmit unit */ can->status.ackerrcnt++; - if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP0)) - { - if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0)) - { - rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 0 << 8); - } - SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0); - } - else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1)) - { - if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1)) - { - rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 1 << 8); - } - SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1); - } - else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2)) - { - if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2)) - { - rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 2 << 8); - } - SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2); - } - else - { - if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR0))/*IF AutoRetransmission = ENABLE,ACK ERR handler*/ - { - SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);/*Abort the send request, trigger the TX interrupt,release completion quantity*/ - } - else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR1)) - { - SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1); - } - else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR2)) - { - SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2); - } - } + _can_check_tx_complete(can); break; case RT_CAN_BUS_IMPLICIT_BIT_ERR: case RT_CAN_BUS_EXPLICIT_BIT_ERR: From 10a979f92ab80d6d64ef69625784804de4624a9a Mon Sep 17 00:00:00 2001 From: unnamed2 <414874639@qq.com> Date: Sun, 22 Jun 2025 13:28:30 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=9B=B4=E6=96=B0can=E7=9A=84isr=E4=B8=AD?= =?UTF-8?q?=E6=96=AD=EF=BC=8C=E5=9C=A8=E4=B8=AD=E6=96=AD=E4=B8=AD=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E5=8F=91=E9=80=81=E5=AE=8C=E6=88=90=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../libraries/HAL_Drivers/drivers/drv_can.c | 57 ++++++------------- 1 file changed, 18 insertions(+), 39 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c index 7df94a52429..da748590b08 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c @@ -718,7 +718,8 @@ static void _can_check_tx_complete(struct rt_can_device *can) } SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0); } - else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1)) + + if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1)) { if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1)) { @@ -726,7 +727,8 @@ static void _can_check_tx_complete(struct rt_can_device *can) } SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1); } - else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2)) + + if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2)) { if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2)) { @@ -734,20 +736,20 @@ static void _can_check_tx_complete(struct rt_can_device *can) } SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2); } - else + + if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR0))/*IF AutoRetransmission = ENABLE,ACK ERR handler*/ { - if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR0))/*IF AutoRetransmission = ENABLE,ACK ERR handler*/ - { - SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);/*Abort the send request, trigger the TX interrupt,release completion quantity*/ - } - else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR1)) - { - SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1); - } - else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR2)) - { - SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2); - } + SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);/*Abort the send request, trigger the TX interrupt,release completion quantity*/ + } + + if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR1)) + { + SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1); + } + + if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR2)) + { + SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2); } } @@ -762,14 +764,12 @@ static void _can_sce_isr(struct rt_can_device *can) { case RT_CAN_BUS_BIT_PAD_ERR: can->status.bitpaderrcnt++; - _can_check_tx_complete(can); break; case RT_CAN_BUS_FORMAT_ERR: can->status.formaterrcnt++; break; case RT_CAN_BUS_ACK_ERR:/* attention !!! test ack err's unit is transmit unit */ can->status.ackerrcnt++; - _can_check_tx_complete(can); break; case RT_CAN_BUS_IMPLICIT_BIT_ERR: case RT_CAN_BUS_EXPLICIT_BIT_ERR: @@ -779,6 +779,7 @@ static void _can_sce_isr(struct rt_can_device *can) can->status.crcerrcnt++; break; } + _can_check_tx_complete(can); can->status.lasterrtype = errtype & 0x70; can->status.rcverrcnt = errtype >> 24; @@ -918,28 +919,6 @@ void CAN2_SCE_IRQHandler(void) } #endif /* BSP_USING_CAN2 */ -/** - * @brief Error CAN callback. - * @param hcan pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval None - */ -void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan) -{ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_ERROR_WARNING | - CAN_IT_ERROR_PASSIVE | - CAN_IT_BUSOFF | - CAN_IT_LAST_ERROR_CODE | - CAN_IT_ERROR | - CAN_IT_RX_FIFO0_MSG_PENDING | - CAN_IT_RX_FIFO0_OVERRUN | - CAN_IT_RX_FIFO0_FULL | - CAN_IT_RX_FIFO1_MSG_PENDING | - CAN_IT_RX_FIFO1_OVERRUN | - CAN_IT_RX_FIFO1_FULL | - CAN_IT_TX_MAILBOX_EMPTY); -} - int rt_hw_can_init(void) { struct can_configure config = CANDEFAULTCONFIG;