/************************************************************************************************/
/**
* @file               std_uart.c
* @author             MCU Ecosystem Development Team
* @brief              UART STD库驱动。
*                     实现UART初始化、波特率配置等功能API。
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/


/************************************************************************************************/
/**
* @addtogroup STD_Driver
* @{
*/

/**
* @addtogroup UART 
* @{
*
*/
/************************************************************************************************/


/*------------------------------------------includes--------------------------------------------*/
#include "std.h"


#ifdef STD_UART_PERIPHERAL_USED
/*-------------------------------------------functions------------------------------------------*/

/************************************************************************************************/
/**
* @addtogroup UART_External_Functions 
* @{
*
*/
/************************************************************************************************/ 


/**
* @brief  UART初始化
* @param  uartx UART外设
* @param  uart_init_param UART初始化结构体
* @retval std_status_t 返回初始化配置结果
*/
std_status_t std_uart_init(UART_t *uartx,std_uart_init_t *uart_init_param)
{
    /* 设置 UART 字长 、收发模式、校验*/
    MODIFY_REG(uartx->CR1,
              (UART_CR1_WL | UART_CR1_TE | UART_CR1_RE | UART_CR1_PTS | UART_CR1_PEN),
              (uart_init_param->wordlength | uart_init_param->direction | uart_init_param->parity));
    
    /* 设置UART停止位 */
    std_uart_set_stopbits(uartx,uart_init_param->stopbits);
    
    /* 设置波特率 */
    if(std_uart_baudrate_config(uartx,uart_init_param->baudrate) != STD_OK)
    {
        return STD_ERR;
    }
    
    return STD_OK;
    
}


/**
* @brief  UART去初始化
* @param  uartx UART外设
* @retval 无
*/
void std_uart_deinit(UART_t *uartx)
{
    if(uartx == UART1)
    {
        /* 复位UART1 */
        std_rcc_apb2_reset(RCC_PERIPH_RESET_UART1);
        /* 关闭UART1时钟 */
        std_rcc_apb2_clk_disable(RCC_PERIPH_CLK_UART1);
    }
    else if(uartx == UART2)
    {
        /* 复位UART2 */
        std_rcc_apb1_reset(RCC_PERIPH_RESET_UART2);
        /* 关闭UART2时钟 */
        std_rcc_apb1_clk_disable(RCC_PERIPH_CLK_UART2);
    }
}


/**
* @brief  UART结构体初始化
* @param  uart_init_struct UART结构体
* @retval 无
*/
void std_uart_struct_init(std_uart_init_t *uart_init_struct)
{ 
    uart_init_struct->baudrate = 115200;
    uart_init_struct->wordlength = UART_WORDLENGTH_8BITS;
    uart_init_struct->stopbits = UART_STOPBITS_1;
    uart_init_struct->direction = UART_DIRECTION_SEND_RECEIVE;
    uart_init_struct->parity = UART_PARITY_NONE;
}


/**
* @brief  设置UART波特率
* @param  uartx   UART外设
* @param  baudrate 波特率
* @retval std_status_t 返回波特率设置结果
*/
std_status_t std_uart_baudrate_config(UART_t *uartx, uint32_t baudrate)
{
    uint32_t pclk;
    uint32_t brr_value;
    
    /* 获取UART时钟频率 */
    pclk = std_rcc_get_pclkfreq();
    
    brr_value = (((pclk) + ((baudrate) >> 1U)) / (baudrate));

    /* BRR取值范围[0x10,0xFFFF], 必须大于0x10(0d16) */    
    if ((brr_value >= UART_BRR_MIN) && (brr_value <= UART_BRR_MAX))
    {
        uartx->BRR = (uint32_t)brr_value;
        return STD_OK;
    }
    else
    {
        return STD_ERR;
    }
}


/** 
* @} 
*/

#endif /* STD_UART_PERIPHERAL_USED */

/** 
* @} 
*/

/** 
* @} 
*/


