From 8ef0980510adf83b8167726d4697ae5bb65d4d0f Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 13:53:40 +0200 Subject: [PATCH] Handle ISR for CANrx by saving message in FIFO buffer --- Core/Inc/canlog.h | 1 + Core/Src/canlog.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/Core/Inc/canlog.h b/Core/Inc/canlog.h index 679bcde..db865b1 100644 --- a/Core/Inc/canlog.h +++ b/Core/Inc/canlog.h @@ -45,6 +45,7 @@ extern const osThreadAttr_t vLED_CAN2_Heartbeat_attributes; * @param hcan2 Pointer to the CAN2 handle */ void vCANLoggerInit(CAN_HandleTypeDef *hcan1, CAN_HandleTypeDef *hcan2); +void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan); void vCANLoggerListen(void *argument); void vLEDHeartbeat(void *argument); diff --git a/Core/Src/canlog.c b/Core/Src/canlog.c index ab296fa..8732b08 100644 --- a/Core/Src/canlog.c +++ b/Core/Src/canlog.c @@ -61,6 +61,37 @@ void CAN_Logger_Init(CAN_HandleTypeDef *hcan1, CAN_HandleTypeDef *hcan2) } /* END CAN_Logger_Init */ +/* BEGIN HAL_CAN_RxFifo0MsgPendingCallback */ +/** + * @brief ISR for CAN message pending in FIFO0 + * @param argument: Can handle hcan (hcan1 or hcan2) + * @retval None + */ +void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) +{ + /* CODE BEGIN */ + CanMessage_t message; + CAN_RxHeaderTypeDef rxHeader; + uint8_t data[8]; + + if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rxHeader, data) != HAL_OK) Error_Handler(); + + message.id = rxHeader.ExtId; + message.dlc = rxHeader.DLC; + message.isExtended = (rxHeader.IDE == CAN_ID_EXT); + memcpy(message.payload, data, rxHeader.DLC); + + osMessageQueueId_t queue = (hcan->Instance == CAN1) ? xCAN1RxQueue : xCAN2RxQueue; + if (osMessageQueuePut(queue, &message, 0U, 0U) != osOK) Error_Handler(); + // TODO: better handling: flash error_led on osTimeout, call Error_Handler() when other errors + + // Issue #1: set an event flag for led task + // osEventFlagsSet(xCanEventFlags, (hcan->Instance == CAN1) ? 0x01 : 0x02); + + /* CODE END */ +} +/* END HAL_CAN_RxFifo0MsgPendingCallback */ + /* BEGIN vCANLoggerListen */ /** * @brief Log incoming CAN bus traffic in FIFO buffer