/************************************************************************************************/
/**
* @file               uart_bsp.c
* @author             MCU Ecosystem Development Team
* @brief              UART BSP函数，实现UART配置等功能。
*
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/

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

/*--------------------------------------------variables-----------------------------------------*/
extern __IO uint8_t g_flag_tx_complete;     /* 发送完成全局标志 */
extern __IO uint8_t g_flag_rx_complete;     /* 接收完成全局标志 */

uint8_t *g_tx_buffer = 0;            /* 发送缓冲区指针   */
uint8_t g_tx_size = 0;               /* 发送数据总数     */
uint8_t g_tx_count = 0;              /* 已发送数据个数   */
uint8_t *g_rx_buffer = 0;            /* 接收缓冲区指针   */
uint8_t g_rx_size = 0;               /* 接收数据总数     */
uint8_t g_rx_count = 0;              /* 已接收数据个数   */

uint8_t g_send_buffer[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
uint8_t g_receive_buffer[8] = {0};

/*-------------------------------------------functions------------------------------------------*/


/**
* @brief  UART1 中断服务函数
* @retval 无
*/
void UART1_IRQHandler(void)
{
    /* 检查到接收寄存器非空标志后， 读取接收数据 */    
    if(std_uart_get_cr1_interrupt_enable(UART1,UART_CR1_INTERRUPT_RXNE)    
       && std_uart_get_flag(UART1,UART_FLAG_RXNE))
    {
        g_rx_buffer[g_rx_count] = (uint8_t)std_uart_rx_read_data(UART1);
        g_rx_count++;
        if(g_rx_size == g_rx_count)
        {    
            /* 完成接收后，关闭RXNE中断 */    
            std_uart_cr1_interrupt_disable(UART1,UART_CR1_INTERRUPT_RXNE);
            /* 将接收完成全局标志置1 */    
            g_flag_rx_complete = 1;
        }
    }
    /* 检查发送寄存器为空标志置1时，写入发送数据 */    
    if(std_uart_get_cr1_interrupt_enable(UART1,UART_CR1_INTERRUPT_TXE)     
       && std_uart_get_flag(UART1,UART_FLAG_TXE))
    {
        std_uart_tx_write_data(UART1, (uint32_t)g_tx_buffer[g_tx_count]);
        g_tx_count++;
        if (g_tx_size == g_tx_count)
        {
            /* 完成发送后，关闭TXE中断，开启发送完成中断 */    
            std_uart_cr1_interrupt_disable(UART1,UART_CR1_INTERRUPT_TXE);
            std_uart_cr1_interrupt_enable(UART1,UART_CR1_INTERRUPT_TC);
        }
    }
    /* 检测到发送完成标志置1，将全局标志置1 */    
    if(std_uart_get_cr1_interrupt_enable(UART1,UART_CR1_INTERRUPT_TC)     
       && std_uart_get_flag(UART1,UART_FLAG_TC))
    {
        std_uart_clear_flag(UART1,UART_CLEAR_TC);
        std_uart_cr1_interrupt_disable(UART1,UART_CR1_INTERRUPT_TC);
        /* 将发送完成全局标志置1 */    
        g_flag_tx_complete = 1;
    }
}


/**
* @brief  UART1 配置并使能中断发送
* @retval 无
*/
void bsp_uart_tx_interrupt(void)
{
    g_tx_buffer = g_send_buffer;
    /* 预计发送8个数据 */
    g_tx_size = 8; 
    /* 初始化已发送数据个数 */    
    g_tx_count = 0;  
    /* 初始化已发送数据个数 */    
    g_flag_tx_complete = 0; 

    /* 开启发送中断 */
    std_uart_cr1_interrupt_enable(UART1, UART_CR1_INTERRUPT_TXE);
}

/**
* @brief  UART1 配置并使能中断接收
* @retval 无
*/
void bsp_uart_rx_interrupt(void)
{
    g_rx_buffer = g_receive_buffer;
    /* 预计接收8个数据 */
    g_rx_size = 8; 
    /* 初始化已接收数据个数 */    
    g_rx_count = 0;  
    /* 初始化已接收数据个数 */    
    g_flag_rx_complete = 0; 

    /* 开启接收中断 */
    std_uart_cr1_interrupt_enable(UART1, UART_CR1_INTERRUPT_RXNE);
}


