#include "Bsp.h"

/**
 * @brief  初始化UART口外设的时钟
 * @note  void
 * @param  void
 * @retval void
 */
void UartClockEnable(const COM_MAP_T *ComX)
{
        if (ComX->Periph == USART1)
        {
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
        }
        if (ComX->Periph == USART2) {
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
        }
        if (ComX->Periph == USART3) {
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
        }
        if (ComX->Periph == UART4) {
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
        }
        if (ComX->Periph == UART5) {
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
        }
}

/**
 * @brief 初始化USART口
 * @param ComId 串口号 baud 波特率 DataBits 数据位 StopBits 停止位 Parity校验位
 * @retval void
 * @note   void
 * @example void
 */
void UartInit(const COM_MAP_T *Comx, uint32_t baud, uint8_t DataBits, uint8_t StopBits, uint8_t Parity)
{
    USART_InitTypeDef UsartInitSt;

    //初始化串口
    USART_StructInit(&UsartInitSt);
    UsartInitSt.USART_BaudRate = baud;
    UsartInitSt.USART_WordLength = DataBits;
    UsartInitSt.USART_StopBits = StopBits;
    UsartInitSt.USART_Parity = Parity;
    UsartInitSt.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    UsartInitSt.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(Comx->Periph, &UsartInitSt);

    //配置中断
    USART_ITConfig(Comx->Periph, USART_IT_RXNE, ENABLE);

    //启用串口
    USART_Cmd(Comx->Periph, ENABLE);
}

/**
 * @brief USART口发送数据
 * @param ComId 串口号 Data数据
 * @retval void
 * @note   void
 * @example void
 */
void UartSendChar(uint32_t ComId,uint8_t Data)
{
    USART_SendData((USART_TypeDef*)ComId, Data);
    while (USART_GetFlagStatus((USART_TypeDef*)ComId, USART_FLAG_TC)  != SET);
}
 /**
 * @brief USART口发送字符串
 * @param ComId 串口号 Data数据 Len 长度
 * @retval void
 * @note   void
 * @example void
 */
void UartSendStr(uint32_t ComId,uint8_t* Data, uint64_t Len)
{
    for (uint64_t i = 0;i < Len;i++)
    {
        USART_SendData((USART_TypeDef*)ComId, Data[i]);
        while (USART_GetFlagStatus((USART_TypeDef*)ComId, USART_FLAG_TC) != SET);
    }
}

/**
 * @brief USART口发送数据
 * @param ComId 串口号
 * @retval 读取的数据
 * @note   void
 * @example void
 */
uint8_t UartReceiveChar(uint32_t ComId)
 {
    return USART_ReceiveData((USART_TypeDef*)ComId);
 }

/**
 * @brief 通用USART配置
 *  @note void
 * @param ComId 串口号 baud 波特率
 * @retval void
 */
void UartStdConfig(COM_MAP_T ComX, uint32_t baud)
{
    UartInit(&ComX, baud, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No);
}

/**
 * @brief 高级串口配置
 * @note  void
 * @param ComId 串口号 baud 波特率 Data Bits 数据位 StopBits 停止位 Parity校验位
 * @retval void
 */
void UartAdvConfig(const COM_MAP_T *ComX, uint32_t baud, uint8_t DataBits, uint8_t StopBits, uint8_t Parity)
{
    UartInit(ComX, baud, DataBits, StopBits, Parity);
}



