Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 657d6914ac | |||
| cad3d841f4 |
+9
-16
@@ -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 */
|
||||||
@@ -98,20 +98,13 @@ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
|
|||||||
void vCANLoggerListen(void *argument)
|
void vCANLoggerListen(void *argument)
|
||||||
{
|
{
|
||||||
/* CODE BEGIN */
|
/* CODE BEGIN */
|
||||||
CAN_HandleTypeDef *hcan = (CAN_HandleTypeDef*)argument;
|
LEDContext *context = (LEDContext*)argument;
|
||||||
osMessageQueueId_t queue = (hcan->Instance == CAN1) ? xCAN1RxQueue : xCAN2RxQueue;
|
|
||||||
CanMessage_t message;
|
|
||||||
|
|
||||||
HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
|
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if (osMessageQueueGet(queue, &message, NULL, osWaitForever) == osOK)
|
if (osSemaphoreAcquire(context->semaphore, 25U) == osOK) 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);
|
||||||
//
|
/* CODE END */
|
||||||
}
|
|
||||||
}
|
|
||||||
/* CODE END */
|
|
||||||
}
|
}
|
||||||
/* END vCANLoggerListen */
|
/* END vCANLoggerListen */
|
||||||
|
|
||||||
|
|||||||
+9
-47
@@ -28,28 +28,12 @@
|
|||||||
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
/* Private define ------------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN PD */
|
/* USER CODE BEGIN PD */
|
||||||
#define CAN_QUEUE_DEPTH 32
|
|
||||||
#define CAN_TASK_STACK_WORDS 128
|
|
||||||
#define CAN_QUEUE_CB_SIZE 128
|
|
||||||
#define CAN_MSG_SIZE sizeof(CanMessage_t)
|
|
||||||
/* USER CODE END PD */
|
/* USER CODE END PD */
|
||||||
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
/* Private macro -------------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN PM */
|
/* USER CODE BEGIN PM */
|
||||||
//CCRAM: stack; control bank; queue memory
|
|
||||||
__attribute__((section(".ccmram")))
|
|
||||||
StackType_t xCAN1_Stack[CAN_TASK_STACK_WORDS];
|
|
||||||
__attribute__((section(".ccmram"), aligned(4)))
|
|
||||||
uint8_t can1_queue_cb[CAN_QUEUE_CB_SIZE];
|
|
||||||
__attribute__((section(".ccmram"), aligned(4)))
|
|
||||||
uint8_t can1_queue_mq[CAN_QUEUE_DEPTH * CAN_MSG_SIZE];
|
|
||||||
|
|
||||||
__attribute__((section(".ccmram")))
|
|
||||||
StackType_t xCAN2_Stack[CAN_TASK_STACK_WORDS];
|
|
||||||
__attribute__((section(".ccmram"), aligned(4)))
|
|
||||||
uint8_t can2_queue_cb[CAN_QUEUE_CB_SIZE];
|
|
||||||
__attribute__((section(".ccmram"), aligned(4)))
|
|
||||||
uint8_t can2_queue_mq[CAN_QUEUE_DEPTH * CAN_MSG_SIZE];
|
|
||||||
/* USER CODE END PM */
|
/* USER CODE END PM */
|
||||||
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
/* Private variables ---------------------------------------------------------*/
|
||||||
@@ -136,26 +120,20 @@ int main(void)
|
|||||||
osThreadId_t xCAN1rx;
|
osThreadId_t xCAN1rx;
|
||||||
const osThreadAttr_t CAN1rxAttributes = {
|
const osThreadAttr_t CAN1rxAttributes = {
|
||||||
.name = "CAN1rx",
|
.name = "CAN1rx",
|
||||||
.stack_size = sizeof(xCAN1_Stack),
|
.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",
|
||||||
.cb_mem = NULL,
|
.stack_size = 128 * 4,
|
||||||
.cb_size = 0U,
|
|
||||||
.stack_mem = xCAN2_Stack,
|
|
||||||
.stack_size = sizeof(xCAN2_Stack),
|
|
||||||
.priority = (osPriority_t) osPriorityRealtime,
|
.priority = (osPriority_t) osPriorityRealtime,
|
||||||
};
|
};
|
||||||
|
|
||||||
osThreadId_t xLEDHeartbeatCAN1;
|
osThreadId_t xLEDHeartbeatCAN1;
|
||||||
const osThreadAttr_t LEDHeartbeatCAN1Attributes = {
|
const osThreadAttr_t LEDHeartbeatCAN1Attributes = {
|
||||||
.name = "LED_HB_CAN1",
|
.name = "LED_HB_CAN1",
|
||||||
.cb_mem = NULL,
|
|
||||||
.cb_size = 0U,
|
|
||||||
.stack_mem = xCAN2_Stack,
|
|
||||||
.stack_size = 128 * 4,
|
.stack_size = 128 * 4,
|
||||||
.priority = (osPriority_t) osPriorityVeryLow1,
|
.priority = (osPriority_t) osPriorityVeryLow1,
|
||||||
};
|
};
|
||||||
@@ -173,8 +151,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(CAN_QUEUE_DEPTH, 0, NULL);
|
xSemaphoreCAN1 = osSemaphoreNew(32, 0, NULL);
|
||||||
xSemaphoreCAN2 = osSemaphoreNew(CAN_QUEUE_DEPTH, 0, NULL);
|
xSemaphoreCAN2 = osSemaphoreNew(32, 0, NULL);
|
||||||
|
|
||||||
if (xSemaphoreCAN1 == NULL || xSemaphoreCAN2 == NULL) Error_Handler();
|
if (xSemaphoreCAN1 == NULL || xSemaphoreCAN2 == NULL) Error_Handler();
|
||||||
|
|
||||||
@@ -189,24 +167,10 @@ int main(void)
|
|||||||
/* USER CODE END RTOS_TIMERS */
|
/* USER CODE END RTOS_TIMERS */
|
||||||
|
|
||||||
/* USER CODE BEGIN RTOS_QUEUES */
|
/* USER CODE BEGIN RTOS_QUEUES */
|
||||||
const osMessageQueueAttr_t can1_queue_attr = {
|
xCAN1RxQueue = osMessageQueueNew(32, sizeof(CanMessage_t), NULL);
|
||||||
.name = "CAN1_Q",
|
xCAN2RxQueue = osMessageQueueNew(32, sizeof(CanMessage_t), NULL);
|
||||||
.cb_mem = can1_queue_cb,
|
xLEDHeartbeatCAN1 = osThreadNew(vLEDHeartbeat, &ledContextCAN1, &LEDHeartbeatCAN1Attributes);
|
||||||
.cb_size = sizeof(can1_queue_cb),
|
xLEDHeartbeatCAN2 = osThreadNew(vLEDHeartbeat, &ledContextCAN2, &LEDHeartbeatCAN2Attributes);
|
||||||
.mq_mem = can1_queue_mq,
|
|
||||||
.mq_size = sizeof(can1_queue_mq)
|
|
||||||
};
|
|
||||||
|
|
||||||
const osMessageQueueAttr_t can2_queue_attr = {
|
|
||||||
.name = "CAN2_Q",
|
|
||||||
.cb_mem = can2_queue_cb,
|
|
||||||
.cb_size = sizeof(can2_queue_cb),
|
|
||||||
.mq_mem = can2_queue_mq,
|
|
||||||
.mq_size = sizeof(can2_queue_mq)
|
|
||||||
};
|
|
||||||
|
|
||||||
xCAN1RxQueue = osMessageQueueNew(CAN_QUEUE_DEPTH, sizeof(CanMessage_t), &can1_queue_attr);
|
|
||||||
xCAN2RxQueue = osMessageQueueNew(CAN_QUEUE_DEPTH, sizeof(CanMessage_t), &can2_queue_attr);
|
|
||||||
|
|
||||||
if (xCAN1RxQueue == NULL || xCAN2RxQueue == NULL) Error_Handler();
|
if (xCAN1RxQueue == NULL || xCAN2RxQueue == NULL) Error_Handler();
|
||||||
/* USER CODE END RTOS_QUEUES */
|
/* USER CODE END RTOS_QUEUES */
|
||||||
@@ -214,8 +178,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 */
|
||||||
|
|||||||
Reference in New Issue
Block a user