1 Commits

Author SHA1 Message Date
eeeck c3b1ac24e3 Merge branch 'j1939' 2026-06-15 10:30:34 +02:00
3 changed files with 55 additions and 46 deletions
+1
View File
@@ -45,6 +45,7 @@ typedef struct {
typedef struct { typedef struct {
LED_Config *led; LED_Config *led;
osSemaphoreId_t semaphore; osSemaphoreId_t semaphore;
osTimerId_t timer;
} LEDContext; } LEDContext;
/* USER CODE END PTD */ /* USER CODE END PTD */
+17 -11
View File
@@ -47,11 +47,14 @@ void CAN_Logger_Init(CAN_HandleTypeDef *hcan1, CAN_HandleTypeDef *hcan2)
filter.FilterBank = 0; filter.FilterBank = 0;
if (HAL_CAN_ConfigFilter(hcan1, &filter) != HAL_OK) Error_Handler(); if (HAL_CAN_ConfigFilter(hcan1, &filter) != HAL_OK) Error_Handler();
if (HAL_CAN_Start(hcan1) != HAL_OK) Error_Handler();
filter.FilterBank = 14; filter.FilterBank = 14;
if (HAL_CAN_ConfigFilter(hcan2, &filter) != HAL_OK) Error_Handler(); if (HAL_CAN_ConfigFilter(hcan2, &filter) != HAL_OK) Error_Handler();
if (HAL_CAN_Start(hcan1) != HAL_OK) Error_Handler();
if (HAL_CAN_Start(hcan2) != HAL_OK) Error_Handler(); if (HAL_CAN_Start(hcan2) != HAL_OK) Error_Handler();
if (HAL_CAN_ActivateNotification(hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) Error_Handler();
if (HAL_CAN_ActivateNotification(hcan2, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) Error_Handler();
} }
/* END CAN_Logger_Init */ /* END CAN_Logger_Init */
@@ -82,9 +85,6 @@ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
// send errors like queue full via UART // send errors like queue full via UART
} }
osSemaphoreId_t semaphore = (hcan->Instance == CAN1) ? xSemaphoreCAN1 : xSemaphoreCAN2;
osSemaphoreRelease(semaphore);
/* CODE END */ /* CODE END */
} }
/* END HAL_CAN_RxFifo0MsgPendingCallback */ /* END HAL_CAN_RxFifo0MsgPendingCallback */
@@ -99,17 +99,19 @@ void vCANLoggerListen(void *argument)
{ {
/* CODE BEGIN */ /* CODE BEGIN */
CAN_HandleTypeDef *hcan = (CAN_HandleTypeDef*)argument; CAN_HandleTypeDef *hcan = (CAN_HandleTypeDef*)argument;
osMessageQueueId_t queue = (hcan->Instance == CAN1) ? xCAN1RxQueue : xCAN2RxQueue; osMessageQueueId_t queue;
CanMessage_t message; CanMessage_t message;
HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING); queue = (hcan->Instance == CAN1) ? xCAN1RxQueue : xCAN2RxQueue;
for (;;) for (;;)
{ {
if (osMessageQueueGet(queue, &message, NULL, osWaitForever) == osOK) if (osMessageQueueGet(queue, &message, NULL, osWaitForever) == osOK)
{ {
// osSemaphoreRelease( (hcan->Instance == CAN1) ? xSemaphoreCAN1 : xSemaphoreCAN2 );
// TODO: use this semaphore
} }
} }
/* CODE END */ /* CODE END */
} }
@@ -126,10 +128,14 @@ void vLEDHeartbeat(void *argument)
/* CODE BEGIN */ /* CODE BEGIN */
LEDContext *context = (LEDContext*)argument; LEDContext *context = (LEDContext*)argument;
for (;;) if (osSemaphoreAcquire(context->semaphore, 0U) == osOK)
{ {
if (osSemaphoreAcquire(context->semaphore, 25U) == osOK) HAL_GPIO_WritePin(context->led->port, context->led->pin, GPIO_PIN_SET); HAL_GPIO_WritePin(context->led->port, context->led->pin, GPIO_PIN_SET);
else HAL_GPIO_WritePin(context->led->port, context->led->pin, GPIO_PIN_RESET); osTimerStart(context->timer, 25U);
}
else
{
HAL_GPIO_WritePin(context->led->port, context->led->pin, GPIO_PIN_RESET);
} }
/* CODE END */ /* CODE END */
} }
+22 -20
View File
@@ -55,6 +55,9 @@ LEDContext ledContextCAN2;
osSemaphoreId_t xSemaphoreCAN1; osSemaphoreId_t xSemaphoreCAN1;
osSemaphoreId_t xSemaphoreCAN2; osSemaphoreId_t xSemaphoreCAN2;
osTimerId_t xHeartbeatTimerCAN1;
osTimerId_t xHeartbeatTimerCAN2;
osMessageQueueId_t xCAN1RxQueue; osMessageQueueId_t xCAN1RxQueue;
osMessageQueueId_t xCAN2RxQueue; osMessageQueueId_t xCAN2RxQueue;
/* USER CODE END PV */ /* USER CODE END PV */
@@ -123,27 +126,12 @@ int main(void)
.stack_size = 128 * 4, .stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityRealtime1, .priority = (osPriority_t) osPriorityRealtime1,
}; };
osThreadId_t xCAN2rx; osThreadId_t xCAN2rx;
const osThreadAttr_t CAN2rxAttributes = { const osThreadAttr_t CAN2rxAttributes = {
.name = "CAN2rx", .name = "CAN2rx",
.stack_size = 128 * 4, .stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityRealtime, .priority = (osPriority_t) osPriorityRealtime,
}; };
osThreadId_t xLEDHeartbeatCAN1;
const osThreadAttr_t LEDHeartbeatCAN1Attributes = {
.name = "LED_HB_CAN1",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityVeryLow1,
};
osThreadId_t xLEDHeartbeatCAN2;
const osThreadAttr_t LEDHeartbeatCAN2Attributes = {
.name = "LED_HB_CAN2",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityVeryLow,
};
/* USER END RTOS_TASKS */ /* USER END RTOS_TASKS */
/* USER CODE BEGIN RTOS_MUTEX */ /* USER CODE BEGIN RTOS_MUTEX */
@@ -151,8 +139,8 @@ int main(void)
/* USER CODE END RTOS_MUTEX */ /* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES */ /* USER CODE BEGIN RTOS_SEMAPHORES */
xSemaphoreCAN1 = osSemaphoreNew(32, 0, NULL); xSemaphoreCAN1 = osSemaphoreNew(10, 0, NULL);
xSemaphoreCAN2 = osSemaphoreNew(32, 0, NULL); xSemaphoreCAN2 = osSemaphoreNew(10, 0, NULL);
if (xSemaphoreCAN1 == NULL || xSemaphoreCAN2 == NULL) Error_Handler(); if (xSemaphoreCAN1 == NULL || xSemaphoreCAN2 == NULL) Error_Handler();
@@ -163,7 +151,16 @@ int main(void)
/* USER CODE END RTOS_SEMAPHORES */ /* USER CODE END RTOS_SEMAPHORES */
/* USER CODE BEGIN RTOS_TIMERS */ /* USER CODE BEGIN RTOS_TIMERS */
/* add timers, ... */ xHeartbeatTimerCAN1 = osTimerNew(vLEDHeartbeat, osTimerOnce, &ledContextCAN1, NULL);
xHeartbeatTimerCAN2 = osTimerNew(vLEDHeartbeat, osTimerOnce, &ledContextCAN2, NULL);
osTimerStart(xHeartbeatTimerCAN1, 25U);
osTimerStart(xHeartbeatTimerCAN2, 25U);
if (xHeartbeatTimerCAN1 == NULL || xHeartbeatTimerCAN2 == NULL) Error_Handler();
ledContextCAN1.timer = xHeartbeatTimerCAN1;
ledContextCAN2.timer = xHeartbeatTimerCAN2;
/* USER CODE END RTOS_TIMERS */ /* USER CODE END RTOS_TIMERS */
/* USER CODE BEGIN RTOS_QUEUES */ /* USER CODE BEGIN RTOS_QUEUES */
@@ -176,8 +173,6 @@ int main(void)
/* USER CODE BEGIN RTOS_THREADS */ /* USER CODE BEGIN RTOS_THREADS */
xCAN1rx = osThreadNew(vCANLoggerListen, &hcan1, &CAN1rxAttributes); xCAN1rx = osThreadNew(vCANLoggerListen, &hcan1, &CAN1rxAttributes);
xCAN2rx = osThreadNew(vCANLoggerListen, &hcan2, &CAN2rxAttributes); xCAN2rx = osThreadNew(vCANLoggerListen, &hcan2, &CAN2rxAttributes);
xLEDHeartbeatCAN1 = osThreadNew(vLEDHeartbeat, &ledContextCAN1, &LEDHeartbeatCAN1Attributes);
xLEDHeartbeatCAN2 = osThreadNew(vLEDHeartbeat, &ledContextCAN2, &LEDHeartbeatCAN2Attributes);
/* USER CODE END RTOS_THREADS */ /* USER CODE END RTOS_THREADS */
/* USER CODE BEGIN RTOS_EVENTS */ /* USER CODE BEGIN RTOS_EVENTS */
@@ -185,6 +180,13 @@ int main(void)
/* USER CODE END RTOS_EVENTS */ /* USER CODE END RTOS_EVENTS */
/* USER CODE BEGIN 3 */ /* USER CODE BEGIN 3 */
ledContextCAN1.led = &led_can1;
ledContextCAN1.semaphore = xSemaphoreCAN1;
ledContextCAN1.timer = xHeartbeatTimerCAN1;
ledContextCAN2.led = &led_can2;
ledContextCAN2.semaphore = xSemaphoreCAN2;
ledContextCAN2.timer = xHeartbeatTimerCAN2;
/* USER CODE END 3 */ /* USER CODE END 3 */
/* Start scheduler */ /* Start scheduler */