/** ****************************************************************************** * @file hc32_uart_driver.h * @author (C)2020, Qindao ieslab Co., Ltd * @version V1.0 * @date 2020-7-1 * @brief the function of the entity of system processor ****************************************************************************** */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __UWater_UART_DRIVER_H #define __UWater_UART_DRIVER_H #ifdef __cplusplus extern "C" { #endif #include "sys_config.h" #include "type.h" #include "ddl.h" #define HDSC_HC32L196 /* MACRO Define---------------------------------------------------------------*/ //所有串口,将要开启的串口置1 #define COM0_OPEN 0 #define COM1_OPEN 0 #define COM2_OPEN 0 #define COM3_OPEN 0 #define LPCOM0_OPEN 1 //红外串口 #define LPCOM1_OPEN 1 //NB串口 //串口数量和串口定义 (总共六个串口) typedef enum { COM0 = 0, COM1, COM2, COM3, LPCOM0, //低功耗串口 LPCOM1, COM_MAX_NUM }UART_ENUM; #if MODULE_BLE_USED #define BLE_UART_COM LPCOM1 #else #define NB_UART_COM LPCOM1 //NB串口 #endif #define IR_UART_COM LPCOM0 //红外串口 /*!< LPCOM USART Enable in SLEEP Mode */ #define LPCOM1_ENABLESLEEPMODE 0 #define IR_38K_OPEN 1 #if (HARDWARE_VERSION==0x14)//方壳表 #define IR_UART_CTL_PORT (GpioPortE) #define IR_UART_CTL_PIN (GpioPin2) #elif (HARDWARE_VERSION==0x18)//圆壳表 #define IR_UART_CTL_PORT (GpioPortF) #define IR_UART_CTL_PIN (GpioPin6) #endif #if IR_38K_OPEN //TIM2_CHB #define IR_38K_PORT (GpioPortA) #define IR_38K_PIN (GpioPin3) #define IR_38K_AF (GpioAf4) #endif //串口IO配置(IO一定要配置准确)、优先级、时钟及定时器配置 #if COM0_OPEN //UART0 #define UART0_RX_PORT (GpioPortA) #define UART0_RX_PIN (GpioPin10) #define UART0_RX_AF (GpioAf1) #define UART0_TX_PORT (GpioPortA) #define UART0_TX_PIN (GpioPin9) #define UART0_TX_AF (GpioAf1) #endif #if COM1_OPEN //UART1 #define UART1_RX_PORT (GpioPortA) #define UART1_RX_PIN (GpioPin3) #define UART1_RX_AF (GpioAf1) #define UART1_TX_PORT (GpioPortA) #define UART1_TX_PIN (GpioPin2) #define UART1_TX_AF (GpioAf1) #endif #if COM2_OPEN //UART2 #define UART2_RX_PORT (GpioPortC) #define UART2_RX_PIN (GpioPin2) #define UART2_RX_AF (GpioAf4) #define UART2_TX_PORT (GpioPortC) #define UART2_TX_PIN (GpioPin3) #define UART2_TX_AF (GpioAf5) #endif #if COM3_OPEN //UART3 #define UART3_RX_PORT (GpioPortA) #define UART3_RX_PIN (GpioPin2) #define UART3_RX_AF (GpioAf1) #define UART3_TX_PORT (GpioPortA) #define UART3_TX_PIN (GpioPin3) #define UART3_TX_AF (GpioAf1) #endif #if LPCOM0_OPEN //LPUART0 #define LPUART0_RX_PORT (GpioPortC) #define LPUART0_RX_PIN (GpioPin11) #define LPUART0_RX_AF (GpioAf2) #define LPUART0_TX_PORT (GpioPortC) #define LPUART0_TX_PIN (GpioPin12) #define LPUART0_TX_AF (GpioAf1) #endif #if LPCOM1_OPEN //LPUART1 #define LPUART1_RX_PORT (GpioPortA) #define LPUART1_RX_PIN (GpioPin1) #define LPUART1_RX_AF (GpioAf2) #define LPUART1_TX_PORT (GpioPortA) #define LPUART1_TX_PIN (GpioPin0) #define LPUART1_TX_AF (GpioAf2) #endif //缓冲器大小(可修改) #define UP_BUF_SIZE 512 //上行缓冲区大小 #define UART0_BUF_SIZE UP_BUF_SIZE #define UART1_BUF_SIZE UP_BUF_SIZE #define UART2_BUF_SIZE UP_BUF_SIZE #define UART3_BUF_SIZE UP_BUF_SIZE #define LPUART0_BUF_SIZE UP_BUF_SIZE #define LPUART1_BUF_SIZE UP_BUF_SIZE //波特率 #define BAUD1200 0 #define BAUD2400 1 #define BAUD4800 2 #define BAUD9600 3 #define BAUD19200 4 #define BAUD38400 5 #define BAUD57600 6 #define BAUD115200 7 #define DATA_BIT_8 8 //数据位 #define UART_WORDLEN_8B ((u32)0x00000000) //8位 #define STOPBIT_1 0 //1个停止位 #define STOPBIT_1_5 1 //1.5个停止位 #define STOPBIT_2 2 //停止位 #define UART_STOPBIT_1 UartMsk1bit //1个停止位 #define UART_STOPBIT_1_5 UartMsk1_5bit //1.5个停止位 #define UART_STOPBIT_2 UartMsk2bit //2个停止位 //校验 #define UART_NONE_PARITY UartMskDataOrAddr ///<多机模式时,通过读写SBUF[8]决定帧为数据帧或地址帧 ((u32)0x00000000) //无校验 #define UART_EVEN_PARITY UartMskEven ///<非多机模式偶校验 ((u32)0x00000004) //偶校验 #define UART_ODD_PARITY UartMskOdd ///<非多机模式奇校验 ((u32)0x00000008) //奇校验 //接收状态 #define UART_RCV_OVERTIME_S0 0 #define UART_RCV_OVERTIME_S1 1 //发送状态 #define UART_SEND_OVERTIME_S0 0 #define UART_SEND_OVERTIME_S1 1 //低功耗模式开启 #define UART_LPUART_Enable 0 #define UART_LPUART_Disable 1 //波特率计算 #define UART_BAUD_DIV_LPUART(__PCLK__, __BAUD__) (((u64)(__PCLK__)*256) / ((__BAUD__))) #define UART_BAUD_DIV_SAMPLING8(__PCLK__, __BAUD__) (((__PCLK__)*2) / ((__BAUD__))) #define UART_BAUD_DIV_SAMPLING16(__PCLK__, __BAUD__) (((__PCLK__)) / ((__BAUD__))) //串口接收超时 #define FRAMEOVERTIME 20 //超时时间为100ms 20*5 = 100ms //串口发送超时 #define UART_BUSY_OVERTIME 1800 //超时时间为180S 100ms*1800 /* variables Define---------------------------------------------------------------*/ typedef struct { u32 BaudRate; u32 WordLength; u32 StopBits; u32 Parity; u32 Mode; u32 OverSampling; u8 LPModeFunction; u8 UARTMode; } UART_PARA_STRUCT; typedef struct { M0P_UART_TypeDef *Instance; M0P_LPUART_TypeDef *LP_Instance; UART_PARA_STRUCT para; u8 uart_status; u8 *send_point; u16 send_len; u8 *send_status_point; //发送状态指针 u8 rcv_state; u8 send_state; u8 start_send_flag; u8 finish_send_flag; u8 send_over_time; //发送超时时间 u8 rcv_flag; u16 rcv_len; u8 rcv_msg; } UART_STRUCT; /* Function Declare------------------------------------------------------------*/ u8 UartInit(u8 com, u8 baud, u8 databit, u8 stop, u8 check, u8 lpmode); u8 UartIfIdle(u8 com); void UartSend(u8 com, u16 len, u8 *data, u8 *out_msg); void UartRcv(u8 com, u16 *out_len, u8 **out_data); u8 UartRcvFinish(u8 com); void UartClearMsg(u8 com); u8 UartIfSleep(u8 com); void UartPreSleep(u8 com); void UartWakeSleep(u8 com, u8 baud, u8 databit, u8 stop, u8 check, u8 lpmode); void UartMachineDriver(void); M0P_UART_TypeDef *HAL_GetUart_Hander(u8 com); M0P_LPUART_TypeDef *HAL_GetLPUart_Hander(u8 com); u8 UartRcvMachineIfIdle(u8 com); u8 UartSendMachineIfIdle(u8 com); #ifdef __cplusplus } #endif #endif /* __UWater_UART_DRIVER_H */