/** 
**************************************************************************
* @file general_uart.h
* @brief Заголовочный файл для модуля инициализации UART.
**************************************************************************
* @defgroup GENERAL_UART      UART Tools
* @ingroup  STM32_GENERAL
* @brief    Функции и макросы для удобной работы с UART.
* @details
Модуль предоставляет функции для базовой инициализации UART


@par Пример использования:
@code
// Структура настроек UART
UART_SettingsTypeDef uart2Settings;

void UART2_Init(void)
{
    // Настройка UART2 с 115200 бод, 8 бит, 1 стоп-бит, без паритета
    uart2Settings.huart.Instance = USART2;
    uart2Settings.huart.Init.BaudRate = 115200;
    uart2Settings.huart.Init.WordLength = UART_WORDLENGTH_8B;
    uart2Settings.huart.Init.StopBits = UART_STOPBITS_1;
    uart2Settings.huart.Init.Parity = UART_PARITY_NONE;
    uart2Settings.huart.Init.Mode = UART_MODE_TX_RX;
    uart2Settings.huart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    uart2Settings.huart.Init.OverSampling = UART_OVERSAMPLING_16;

    // Настройка GPIO
    uart2Settings.GPIOx = GPIOA;
    uart2Settings.GPIO_PIN_TX = GPIO_PIN_2;
    uart2Settings.GPIO_PIN_RX = GPIO_PIN_3;

    // DMA не используется в этом примере
    uart2Settings.DMAChannel = NULL;
    uart2Settings.DMA_CHANNEL_X = 0;

    // Инициализация UART
    if(UART_Base_Init(&uart2Settings) != HAL_OK)
    {
        // Обработка ошибки
        Error_Handler();
    }
}
@endcode

*  @note Требуется подключение модуля UART в библиотеке HAL 
@code 
#define HAL_UART_MODULE_ENABLED
@endcode
* @{
*************************************************************************/
#ifndef __UART_GENERAL_H_
#define __UART_GENERAL_H_

/////////////////////////////////////////////////////////////////////
/////////////////////////---USER SETTINGS---/////////////////////////
/** 
  * @addtogroup UART_INIT UART Init defines
  * @ingroup    GENERAL_UART
  * @ingroup    GENERAL_CONFIGS Конфигурации STM32 General
  * @brief      Настройка UART
  * @{
  */
#define HAL_UART_MODULE_ENABLED   ///< Включение HAL UART

#define USE_USART1    ///< Включить USART1 в @ref UART_MspInit
#define USE_USART2    ///< Включить USART2 в @ref UART_MspInit
#define USE_USART3    ///< Включить USART3 в @ref UART_MspInit
#define USE_UART4     ///< Включить UART4 в @ref UART_MspInit
#define USE_UART5     ///< Включить UART5 в @ref UART_MspInit
#define USE_USART6    ///< Включить USART6 в @ref UART_MspInit
/** UART_INIT
  * @}
  */
/////////////////////////---USER SETTINGS---/////////////////////////
#include "mylibs_defs.h"



/////////////////////////////////////////////////////////////////////
////////////////////////////---DEFINES---////////////////////////////


                              
////////////////////////////---DEFINES---////////////////////////////


/////////////////////////////////////////////////////////////////////
///////////////////////---STRUCTURES & ENUMS---//////////////////////
/**
  * @brief Структура настроек UART
  * @details Содержит все необходимые параметры для инициализации UART,
  * включая GPIO и DMA.
  */
typedef struct
{
  UART_HandleTypeDef huart;               ///< HAL handle UART
  
  GPIO_TypeDef *GPIOx;                    ///< Порт для UART
  uint16_t GPIO_PIN_RX;                   ///< Пин приема
  uint16_t GPIO_PIN_TX;                   ///< Пин передачи
  
  DMA_Stream_TypeDef *DMAChannel;         ///< Канал DMA (NULL если не нужен)
  uint32_t DMA_CHANNEL_X;                 ///< Номер канала DMA (0 если не нужен)
  
} UART_SettingsTypeDef;

///////////////////////---STRUCTURES & ENUMS---//////////////////////


/////////////////////////////////////////////////////////////////////
///////////////////////////---FUNCTIONS---///////////////////////////

/* Инициализация UART с использованием структуры настроек */
HAL_StatusTypeDef UART_Base_Init(UART_SettingsTypeDef *suart);

/* Проверка корректности структуры настроек UART */
HAL_StatusTypeDef UART_Check_Init_Struct(UART_SettingsTypeDef *suart);

/* Инициализация тактирования и прерываний для выбранного UART */
void UART_MspInit(UART_HandleTypeDef *huart);

/* Деинициализация тактирования и прерываний для выбранного UART */
void UART_MspDeInit(UART_HandleTypeDef *huart);

  
/** 
 * @cond UART_INTERNAL
 */

/* Настройка GPIO для UART */
void UART_GPIO_Init(GPIO_TypeDef *GPIOx, uint16_t GPIO_PIN_RX, uint16_t GPIO_PIN_TX);

/* Настройка DMA для UART */
void UART_DMA_Init(UART_HandleTypeDef *huart, DMA_HandleTypeDef *hdma_rx, DMA_Stream_TypeDef *DMAChannel, uint32_t DMA_CHANNEL_X);

#ifndef __USER_LINKDMA
/**  
  * @brief  Аналог HAL макроса для привязки DMA к UART.
  * @note   @ref __HAL_LINKDMA.
  */
#define __USER_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__)   \
do{                                                                     \
(__HANDLE__)->__PPP_DMA_FIELD__ = (__DMA_HANDLE__);                     \
(__DMA_HANDLE__)->Parent = (__HANDLE__);} while(0U)
#endif
 
/** @endcond */
///////////////////////////---FUNCTIONS---///////////////////////////

#endif // __UART_GENERAL_H_

/** GENERAL_UART
  * @}
  */