4 Commits

Author SHA1 Message Date
eeeck 9086bf3efb Fix buffer overwrite while DMA is not completed 2026-06-18 13:08:11 +02:00
eeeck 3bf5a8cc19 Fix spacing 2026-06-18 13:05:54 +02:00
eeeck b9c371ed58 Initialize semaphore with count of 1 2026-06-18 13:05:43 +02:00
eeeck 9d96b3d4f2 Start 2026-06-18 12:50:50 +02:00
3 changed files with 23 additions and 22 deletions
+5 -8
View File
@@ -49,19 +49,11 @@ void CAN_Logger_Init(CAN_HandleTypeDef *hcan1, CAN_HandleTypeDef *hcan2)
filter.FilterActivation = ENABLE; filter.FilterActivation = ENABLE;
filter.SlaveStartFilterBank = 14; filter.SlaveStartFilterBank = 14;
HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 6, 0);
HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);
HAL_NVIC_SetPriority(CAN2_RX0_IRQn, 6, 0);
HAL_NVIC_EnableIRQ(CAN2_RX0_IRQn);
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(hcan2) != HAL_OK) Error_Handler();
} }
/* END CAN_Logger_Init */ /* END CAN_Logger_Init */
@@ -120,8 +112,13 @@ void vCANListener(void *argument)
osMessageQueueId_t queue = (hcan->Instance == CAN1) ? xCAN1RxQueue : xCAN2RxQueue; osMessageQueueId_t queue = (hcan->Instance == CAN1) ? xCAN1RxQueue : xCAN2RxQueue;
CanMessage_t message; CanMessage_t message;
if (HAL_CAN_Start(hcan) != HAL_OK) Error_Handler();
HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING); HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
uint32_t irqn = (hcan->Instance == CAN1) ? CAN1_RX0_IRQn : CAN2_RX0_IRQn;
HAL_NVIC_SetPriority(irqn, 6, 0);
HAL_NVIC_EnableIRQ(irqn);
for (;;) for (;;)
{ {
if (osMessageQueueGet(queue, &message, NULL, osWaitForever) == osOK) if (osMessageQueueGet(queue, &message, NULL, osWaitForever) == osOK)
+17 -13
View File
@@ -101,23 +101,27 @@ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
*/ */
void vUARTLogger(void *argument) void vUARTLogger(void *argument)
{ {
CanMessage_t message; CanMessage_t message;
char tx_buffer[45]; char tx_buffer[45];
for (;;) for (;;)
{
DEBUG_PRINT("Waiting for CAN traffic...\r\n");
if (osMessageQueueGet(xUARTQueue, &message, NULL, osWaitForever) == osOK)
{ {
DEBUG_PRINT("Waiting for CAN traffic...\r\n"); osSemaphoreAcquire(xUARTDMASemaphore, osWaitForever);
if (osMessageQueueGet(xUARTQueue, &message, NULL, osWaitForever) == osOK) int len = format_can_message(tx_buffer, message.source, &message);
if (HAL_UART_Transmit_DMA(&huart1, (uint8_t*)tx_buffer, len) == HAL_OK)
{ {
DEBUG_PRINT("CAN frame detected\r\n"); DEBUG_PRINT("CAN frame sent via UART\r\n");
int len = format_can_message(tx_buffer, message.source, &message); }
if (HAL_UART_Transmit_DMA(&huart1, (uint8_t*)tx_buffer, len) == HAL_OK) else
{ {
osSemaphoreAcquire(xUARTDMASemaphore, osWaitForever); osSemaphoreRelease(xUARTDMASemaphore);
DEBUG_PRINT("CAN frame sent via UART\r\n"); DEBUG_PRINT("HAL error, CAN frame NOT sent!\r\n");
}
else DEBUG_PRINT("HAL error, CAN frame NOT sent!\r\n");
} }
} }
}
} }
/* END vUARTLoggerListen */ /* END vUARTLoggerListen */
+1 -1
View File
@@ -176,7 +176,7 @@ int main(void)
/* USER CODE END RTOS_MUTEX */ /* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES */ /* USER CODE BEGIN RTOS_SEMAPHORES */
xUARTDMASemaphore = osSemaphoreNew(1, 0, NULL); xUARTDMASemaphore = osSemaphoreNew(1, 1, NULL);
if (xUARTDMASemaphore == NULL) Error_Handler(); if (xUARTDMASemaphore == NULL) Error_Handler();
/* USER CODE END RTOS_SEMAPHORES */ /* USER CODE END RTOS_SEMAPHORES */