/**
 ****************************************************************************************************
 * @file        usart.h
 * @author      XX团队
 * @version     V1.0
 * @date        2021-10-14
 * @brief       串口初始化代码(一般是串口1),支持printf
 * @license     Copyright (c) 2020-2032, 
 ****************************************************************************************************
 * @attention
 *
 * 电池管理系统平台:STM32F407
 
 
 
 
 *
 * 修改说明
 
 * 第一次发布
 *
 ****************************************************************************************************
 */

#ifndef _USART_H
#define _USART_H

#include "stdio.h"
#include "drv_sys.h"
#include "stm32f4xx_hal.h"

#define USART_EN_RX     1                       /* 使能(1)/禁止(0)串口1接收 */


typedef struct {
    USART_TypeDef* Instance;  // UART实例
    GPIO_TypeDef* TxPort;     // Tx引脚的GPIO端口
    uint16_t TxPin;           // Tx引脚的GPIO引脚
    GPIO_TypeDef* RxPort;     // Rx引脚的GPIO端口
    uint16_t RxPin;           // Rx引脚的GPIO引脚
    uint32_t WordLength;      // 字长
    uint32_t StopBits;        // 停止位
    uint32_t Parity;          // 校验
    uint32_t Mode;            // 工作模式
    uint32_t HwFlowCtl;       // 硬件流控制
    uint32_t OverSampling;    // 过采样
} UARTConfig;



// 声明初始化所有配置的UART函数
void InitUARTs(uint32_t baudRate);



/*******************************************************************************************************/
/* 引脚 和 串口 定义 A2TX ,A3RX
 * 默认是针对USART1的.
 * 注意: 通过修改这12个宏定义,可以支持USART1~UART7任意一个串口.
 */

#define USART_TX_GPIO_PORT              GPIOA
#define USART_TX_GPIO_PIN               GPIO_PIN_2
#define USART_TX_GPIO_AF                GPIO_AF7_USART1
#define USART_TX_GPIO_CLK_ENABLE()      do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)   /* 发送引脚时钟使能 */

#define USART_RX_GPIO_PORT              GPIOA
#define USART_RX_GPIO_PIN               GPIO_PIN_3
#define USART_RX_GPIO_AF                GPIO_AF7_USART1
#define USART_RX_GPIO_CLK_ENABLE()      do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)   /* 接收引脚时钟使能 */

#define USART_UX                        USART2
#define USART_UX_IRQn                   USART2_IRQn
#define USART_UX_IRQHandler             USART2_IRQHandler
#define USART_UX_CLK_ENABLE()           do{ __HAL_RCC_USART2_CLK_ENABLE(); }while(0)  /* USART2 时钟使能 */

/*******************************************************************************************************/

#define USART_REC_LEN   200                     /* 定义最大接收字节数 200 */

#define RXBUFFERSIZE    1                       /* 缓存大小 */

extern UART_HandleTypeDef g_uart1_handle;                  /* UART句柄 */
extern UART_HandleTypeDef g_uart3_handle;                  /* UART句柄 */
extern UART_HandleTypeDef g_uart4_handle;                  /* UART句柄 */
extern uint8_t  g_usart_rx_buf[USART_REC_LEN];  /* 接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 */
extern uint16_t g_usart_rx_sta;                 /* 接收状态标记 */
extern uint8_t rx_buffer[RXBUFFERSIZE];       /* HAL库USART接收Buffer */


void usart_init(uint32_t baudrate);             /* 串口初始化函数 */

#endif