/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : hal_can.c * @brief : CAN hardware abstraction layer source file ****************************************************************************** */ /* USER CODE END Header */ #include "hal.h" #include "hal_can.h" /** * @brief Initialize CAN hardware * @param config: CAN configuration structure * @retval HAL status code */ hal_status_t hal_can_init(const hal_can_config_t *config) { if (config == NULL) { return HAL_INVALID_PARAM; } if (config->instance >= HAL_CAN_INSTANCE_MAX) { return HAL_INVALID_PARAM; } /* Call architecture specific CAN initialization */ #if HAL_TARGET_ARCH == HAL_ARCH_STM32F1 /* TODO: Implement STM32F1 CAN initialization */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F4 /* TODO: Implement STM32F4 CAN initialization */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F7 /* TODO: Implement STM32F7 CAN initialization */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32L4 /* TODO: Implement STM32L4 CAN initialization */ return HAL_OK; #else #error "Unsupported HAL architecture" return HAL_ERROR; #endif } /** * @brief Deinitialize CAN hardware * @param instance: CAN instance identifier * @retval HAL status code */ hal_status_t hal_can_deinit(hal_can_instance_t instance) { if (instance >= HAL_CAN_INSTANCE_MAX) { return HAL_INVALID_PARAM; } /* Call architecture specific CAN deinitialization */ #if HAL_TARGET_ARCH == HAL_ARCH_STM32F1 /* TODO: Implement STM32F1 CAN deinitialization */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F4 /* TODO: Implement STM32F4 CAN deinitialization */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F7 /* TODO: Implement STM32F7 CAN deinitialization */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32L4 /* TODO: Implement STM32L4 CAN deinitialization */ return HAL_OK; #else #error "Unsupported HAL architecture" return HAL_ERROR; #endif } /** * @brief Start CAN peripheral * @param instance: CAN instance identifier * @retval HAL status code */ hal_status_t hal_can_start(hal_can_instance_t instance) { if (instance >= HAL_CAN_INSTANCE_MAX) { return HAL_INVALID_PARAM; } /* Call architecture specific CAN start implementation */ #if HAL_TARGET_ARCH == HAL_ARCH_STM32F1 /* TODO: Implement STM32F1 CAN start */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F4 /* TODO: Implement STM32F4 CAN start */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F7 /* TODO: Implement STM32F7 CAN start */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32L4 /* TODO: Implement STM32L4 CAN start */ return HAL_OK; #else #error "Unsupported HAL architecture" return HAL_ERROR; #endif } /** * @brief Stop CAN peripheral * @param instance: CAN instance identifier * @retval HAL status code */ hal_status_t hal_can_stop(hal_can_instance_t instance) { if (instance >= HAL_CAN_INSTANCE_MAX) { return HAL_INVALID_PARAM; } /* Call architecture specific CAN stop implementation */ #if HAL_TARGET_ARCH == HAL_ARCH_STM32F1 /* TODO: Implement STM32F1 CAN stop */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F4 /* TODO: Implement STM32F4 CAN stop */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F7 /* TODO: Implement STM32F7 CAN stop */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32L4 /* TODO: Implement STM32L4 CAN stop */ return HAL_OK; #else #error "Unsupported HAL architecture" return HAL_ERROR; #endif } /** * @brief Send CAN message * @param instance: CAN instance identifier * @param message: Pointer to CAN message structure * @param timeout: Timeout in milliseconds * @retval HAL status code */ hal_status_t hal_can_send(hal_can_instance_t instance, const hal_can_message_t *message, uint32_t timeout) { if (message == NULL) { return HAL_INVALID_PARAM; } if (instance >= HAL_CAN_INSTANCE_MAX) { return HAL_INVALID_PARAM; } /* Call architecture specific CAN send implementation */ #if HAL_TARGET_ARCH == HAL_ARCH_STM32F1 /* TODO: Implement STM32F1 CAN send */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F4 /* TODO: Implement STM32F4 CAN send */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F7 /* TODO: Implement STM32F7 CAN send */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32L4 /* TODO: Implement STM32L4 CAN send */ return HAL_OK; #else #error "Unsupported HAL architecture" return HAL_ERROR; #endif } /** * @brief Receive CAN message * @param instance: CAN instance identifier * @param fifo: FIFO number (0 or 1) * @param message: Pointer to CAN message structure * @param timeout: Timeout in milliseconds * @retval HAL status code */ hal_status_t hal_can_receive(hal_can_instance_t instance, uint8_t fifo, hal_can_message_t *message, uint32_t timeout) { if (message == NULL || fifo > 1) { return HAL_INVALID_PARAM; } if (instance >= HAL_CAN_INSTANCE_MAX) { return HAL_INVALID_PARAM; } /* Call architecture specific CAN receive implementation */ #if HAL_TARGET_ARCH == HAL_ARCH_STM32F1 /* TODO: Implement STM32F1 CAN receive */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F4 /* TODO: Implement STM32F4 CAN receive */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F7 /* TODO: Implement STM32F7 CAN receive */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32L4 /* TODO: Implement STM32L4 CAN receive */ return HAL_OK; #else #error "Unsupported HAL architecture" return HAL_ERROR; #endif } /** * @brief Get CAN receive FIFO message pending count * @param instance: CAN instance identifier * @param fifo: FIFO number (0 or 1) * @param count: Pointer to store pending message count * @retval HAL status code */ hal_status_t hal_can_get_pending_count(hal_can_instance_t instance, uint8_t fifo, uint8_t *count) { if (count == NULL || fifo > 1) { return HAL_INVALID_PARAM; } if (instance >= HAL_CAN_INSTANCE_MAX) { return HAL_INVALID_PARAM; } /* Call architecture specific CAN get pending count implementation */ #if HAL_TARGET_ARCH == HAL_ARCH_STM32F1 /* TODO: Implement STM32F1 CAN get pending count */ *count = 0; return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F4 /* TODO: Implement STM32F4 CAN get pending count */ *count = 0; return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F7 /* TODO: Implement STM32F7 CAN get pending count */ *count = 0; return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32L4 /* TODO: Implement STM32L4 CAN get pending count */ *count = 0; return HAL_OK; #else #error "Unsupported HAL architecture" return HAL_ERROR; #endif } /** * @brief Configure CAN filter * @param instance: CAN instance identifier * @param filter_config: Pointer to CAN filter configuration structure * @retval HAL status code */ hal_status_t hal_can_configure_filter(hal_can_instance_t instance, const hal_can_filter_config_t *filter_config) { if (filter_config == NULL) { return HAL_INVALID_PARAM; } if (instance >= HAL_CAN_INSTANCE_MAX) { return HAL_INVALID_PARAM; } /* Call architecture specific CAN filter configuration implementation */ #if HAL_TARGET_ARCH == HAL_ARCH_STM32F1 /* TODO: Implement STM32F1 CAN filter configuration */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F4 /* TODO: Implement STM32F4 CAN filter configuration */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32F7 /* TODO: Implement STM32F7 CAN filter configuration */ return HAL_OK; #elif HAL_TARGET_ARCH == HAL_ARCH_STM32L4 /* TODO: Implement STM32L4 CAN filter configuration */ return HAL_OK; #else #error "Unsupported HAL architecture" return HAL_ERROR; #endif }