From 0c3c93040bc6933dd9b674f18fb1c986a5881d1d Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Wed, 10 Jun 2026 13:15:01 +0200 Subject: [PATCH 1/3] Simplify CAN error code handler --- Core/Src/main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index 6b9264d..bd7b2a3 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -23,6 +23,7 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "canlog.h" +#include /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -445,11 +446,10 @@ void Error_Handler(void) //TODO: check if it is necessary to stop FreeRTOS - uint32_t error_can1 == 0; - uint32_t error_can2 == 0; + uint32_t error_code; if (HAL_CAN_GetState(&hcan1) != HAL_CAN_STATE_READY) error_code = HAL_CAN_GetError(&hcan1); - else if (HAL_CAN_GetState(&hcan2) != HAL_CAN_STATE_READY) error_code = HAL_CAN_GetError(&hcan2); + if (HAL_CAN_GetState(&hcan2) != HAL_CAN_STATE_READY) error_code = HAL_CAN_GetError(&hcan2); // TODO: write error to SD and/or serial From 59a58d1f1f814b85db260601b8565a98fba394bf Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Wed, 10 Jun 2026 13:56:52 +0200 Subject: [PATCH 2/3] Implement LED heartbeat with RTOS timers instead of threads - Less memory overhead (no stack allocation) - Better timing accuracy (less jitter) - CAN bus still has higher priority than timers --- Core/Src/canlog.c | 29 +---------------------------- Core/Src/main.c | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 34 deletions(-) diff --git a/Core/Src/canlog.c b/Core/Src/canlog.c index cfbf7e8..71d1ab4 100644 --- a/Core/Src/canlog.c +++ b/Core/Src/canlog.c @@ -43,22 +43,6 @@ const osThreadAttr_t vCAN2_rx_attributes = { .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityRealtime, }; - -/* Definitions for CAN1 LED heartbeat */ -osThreadId_t vLED_CAN1_Heartbeat; -const osThreadAttr_t vLED_CAN1_Heartbeat_attributes = { - .name = "vLED_CAN1_HeartbeatTask", - .stack_size = 128 * 4, - .priority = (osPriority_t) osPriorityVeryLow1, -}; - -/* Definitions for CAN2 LED heartbeat */ -osThreadId_t vLED_CAN2_Heartbeat; -const osThreadAttr_t vLED_CAN2_Heartbeat_attributes = { - .name = "vLED_CAN2_HeartbeatTask", - .stack_size = 128 * 4, - .priority = (osPriority_t) osPriorityVeryLow, -}; /* USER END RTOS_TASKS */ @@ -121,18 +105,7 @@ void vLED_Heartbeat(void *argument) { /* CODE BEGIN */ LED_Config *led = (LED_Config*)argument; - - for(;;) - { - //HAL_GPIO_WritePin(led->port, led->pin, GPIO_PIN_RESET); - // if semaphore for canrx, do the rest - - - HAL_GPIO_WritePin(led->port, led->pin, GPIO_PIN_SET); - osDelay(100); - HAL_GPIO_WritePin(led->port, led->pin, GPIO_PIN_RESET); - osDelay(100); - } + HAL_GPIO_TogglePin(led->port, led->pin); /* CODE END */ } /* END vLED_HeartbeatOnCanRx */ diff --git a/Core/Src/main.c b/Core/Src/main.c index bd7b2a3..e424652 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -56,6 +56,9 @@ DMA_HandleTypeDef hdma_sdio_tx; LED_Config led_can1 = {GPIOB, GPIO_PIN_2}; LED_Config led_can2 = {GPIOB, GPIO_PIN_5}; LED_Config led_error = {GPIOB, GPIO_PIN_3}; + +osTimerId_t heartbeat_timer_can1; +osTimerId_t heartbeat_timer_can2; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -127,7 +130,11 @@ int main(void) /* USER CODE END RTOS_SEMAPHORES */ /* USER CODE BEGIN RTOS_TIMERS */ - /* start timers, add new ones, ... */ + heartbeat_timer_can1 = osTimerNew(vLED_Heartbeat, osTimerPeriodic, &led_can1, NULL); + if (heartbeat_timer_can1 != NULL) osTimerStart(heartbeat_timer_can1, 250U); + + heartbeat_timer_can2 = osTimerNew(vLED_Heartbeat, osTimerPeriodic, &led_can2, NULL); + if (heartbeat_timer_can2 != NULL) osTimerStart(heartbeat_timer_can2, 250U); /* USER CODE END RTOS_TIMERS */ /* USER CODE BEGIN RTOS_QUEUES */ @@ -137,8 +144,6 @@ int main(void) /* USER CODE BEGIN RTOS_THREADS */ vCAN1_rx = osThreadNew(vCAN_Logger_Listen, &hcan1, &vCAN1_rx_attributes); vCAN2_rx = osThreadNew(vCAN_Logger_Listen, &hcan2, &vCAN2_rx_attributes); - vLED_CAN1_Heartbeat = osThreadNew(vLED_Heartbeat, &led_can1, &vLED_CAN1_Heartbeat_attributes); - vLED_CAN2_Heartbeat = osThreadNew(vLED_Heartbeat, &led_can2, &vLED_CAN2_Heartbeat_attributes); /* USER CODE END RTOS_THREADS */ /* USER CODE BEGIN RTOS_EVENTS */ @@ -446,10 +451,11 @@ void Error_Handler(void) //TODO: check if it is necessary to stop FreeRTOS - uint32_t error_code; + uint32_t error_code_can1; + uint32_t error_code_can2; - if (HAL_CAN_GetState(&hcan1) != HAL_CAN_STATE_READY) error_code = HAL_CAN_GetError(&hcan1); - if (HAL_CAN_GetState(&hcan2) != HAL_CAN_STATE_READY) error_code = HAL_CAN_GetError(&hcan2); + if (HAL_CAN_GetState(&hcan1) != HAL_CAN_STATE_READY) error_code_can1 = HAL_CAN_GetError(&hcan1); + if (HAL_CAN_GetState(&hcan2) != HAL_CAN_STATE_READY) error_code_can2 = HAL_CAN_GetError(&hcan2); // TODO: write error to SD and/or serial From de7c817471c057e927cd62d2f75dd2dcf5f6a882 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Wed, 10 Jun 2026 14:27:39 +0200 Subject: [PATCH 3/3] Reset LEDs in error handler --- Core/Src/main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Core/Src/main.c b/Core/Src/main.c index e424652..28d7de2 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -459,6 +459,9 @@ void Error_Handler(void) // TODO: write error to SD and/or serial + HAL_GPIO_WritePin(led_can1.port, led_can1.pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(led_can2.port, led_can2.pin, GPIO_PIN_RESET); + while (1) { HAL_GPIO_TogglePin(led_error.port, led_error.pin);