/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file usart_if.c * @author MCD Application Team * @brief Configuration of UART driver interface for hyperterminal communication ****************************************************************************** * @attention * * Copyright (c) 2021 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "usart_if.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* External variables ---------------------------------------------------------*/ /** * @brief DMA handle */ extern DMA_HandleTypeDef hdma_usart2_tx; /** * @brief UART handle */ extern UART_HandleTypeDef huart2; /** * @brief buffer to receive 1 character */ uint8_t charRx; /* USER CODE BEGIN EV */ /* USER CODE END EV */ /* Private typedef -----------------------------------------------------------*/ /** * @brief Trace driver callbacks handler */ const UTIL_ADV_TRACE_Driver_s UTIL_TraceDriver = { vcom_Init, vcom_DeInit, vcom_ReceiveInit, vcom_Trace_DMA, }; /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /** * @brief TX complete callback * @return none */ static void (*TxCpltCallback)(void *); /** * @brief RX complete callback * @param rxChar ptr of chars buffer sent by user * @param size buffer size * @param error errorcode * @return none */ static void (*RxCpltCallback)(uint8_t *rxChar, uint16_t size, uint8_t error); /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Exported functions --------------------------------------------------------*/ UTIL_ADV_TRACE_Status_t vcom_Init(void (*cb)(void *)) { /* USER CODE BEGIN vcom_Init_1 */ /* USER CODE END vcom_Init_1 */ TxCpltCallback = cb; MX_DMA_Init(); MX_USART2_UART_Init(); LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_27); return UTIL_ADV_TRACE_OK; /* USER CODE BEGIN vcom_Init_2 */ /* USER CODE END vcom_Init_2 */ } UTIL_ADV_TRACE_Status_t vcom_DeInit(void) { /* USER CODE BEGIN vcom_DeInit_1 */ /* USER CODE END vcom_DeInit_1 */ /* ##-1- Reset peripherals ################################################## */ __HAL_RCC_USART2_FORCE_RESET(); __HAL_RCC_USART2_RELEASE_RESET(); /* ##-2- MspDeInit ################################################## */ HAL_UART_MspDeInit(&huart2); /* ##-3- Disable the NVIC for DMA ########################################### */ /* USER CODE BEGIN 1 */ HAL_NVIC_DisableIRQ(DMA1_Channel7_IRQn); return UTIL_ADV_TRACE_OK; /* USER CODE END 1 */ /* USER CODE BEGIN vcom_DeInit_2 */ /* USER CODE END vcom_DeInit_2 */ } void vcom_Trace(uint8_t *p_data, uint16_t size) { /* USER CODE BEGIN vcom_Trace_1 */ /* USER CODE END vcom_Trace_1 */ HAL_UART_Transmit(&huart2, p_data, size, 1000); /* USER CODE BEGIN vcom_Trace_2 */ /* USER CODE END vcom_Trace_2 */ } UTIL_ADV_TRACE_Status_t vcom_Trace_DMA(uint8_t *p_data, uint16_t size) { /* USER CODE BEGIN vcom_Trace_DMA_1 */ /* USER CODE END vcom_Trace_DMA_1 */ HAL_UART_Transmit_DMA(&huart2, p_data, size); return UTIL_ADV_TRACE_OK; /* USER CODE BEGIN vcom_Trace_DMA_2 */ /* USER CODE END vcom_Trace_DMA_2 */ } UTIL_ADV_TRACE_Status_t vcom_ReceiveInit(void (*RxCb)(uint8_t *rxChar, uint16_t size, uint8_t error)) { /* USER CODE BEGIN vcom_ReceiveInit_1 */ /* USER CODE END vcom_ReceiveInit_1 */ UART_WakeUpTypeDef WakeUpSelection; /*record call back*/ RxCpltCallback = RxCb; /*Set wakeUp event on start bit*/ WakeUpSelection.WakeUpEvent = UART_WAKEUP_ON_STARTBIT; HAL_UARTEx_StopModeWakeUpSourceConfig(&huart2, WakeUpSelection); /* Make sure that no UART transfer is on-going */ while (__HAL_UART_GET_FLAG(&huart2, USART_ISR_BUSY) == SET); /* Make sure that UART is ready to receive) */ while (__HAL_UART_GET_FLAG(&huart2, USART_ISR_REACK) == RESET); /* Enable USART interrupt */ __HAL_UART_ENABLE_IT(&huart2, UART_IT_WUF); /*Enable wakeup from stop mode*/ HAL_UARTEx_EnableStopMode(&huart2); /*Start LPUART receive on IT*/ HAL_UART_Receive_IT(&huart2, &charRx, 1); return UTIL_ADV_TRACE_OK; /* USER CODE BEGIN vcom_ReceiveInit_2 */ /* USER CODE END vcom_ReceiveInit_2 */ } void vcom_Resume(void) { /* USER CODE BEGIN vcom_Resume_1 */ /* USER CODE END vcom_Resume_1 */ /*to re-enable lost UART settings*/ if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } /*to re-enable lost DMA settings*/ if (HAL_DMA_Init(&hdma_usart2_tx) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN vcom_Resume_2 */ /* USER CODE END vcom_Resume_2 */ } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { /* USER CODE BEGIN HAL_UART_TxCpltCallback_1 */ /* USER CODE END HAL_UART_TxCpltCallback_1 */ /* buffer transmission complete*/ if (huart->Instance == USART2) { TxCpltCallback(NULL); } /* USER CODE BEGIN HAL_UART_TxCpltCallback_2 */ /* USER CODE END HAL_UART_TxCpltCallback_2 */ } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* USER CODE BEGIN HAL_UART_RxCpltCallback_1 */ /* USER CODE END HAL_UART_RxCpltCallback_1 */ if (huart->Instance == USART2) { if ((NULL != RxCpltCallback) && (HAL_UART_ERROR_NONE == huart->ErrorCode)) { RxCpltCallback(&charRx, 1, 0); } HAL_UART_Receive_IT(huart, &charRx, 1); } /* USER CODE BEGIN HAL_UART_RxCpltCallback_2 */ /* USER CODE END HAL_UART_RxCpltCallback_2 */ } /* USER CODE BEGIN EF */ /* USER CODE END EF */ /* Private Functions Definition -----------------------------------------------*/ /* USER CODE BEGIN PrFD */ /* USER CODE END PrFD */