//*********************************************************************************** // Ver 1.0 // 2020.03.05 1、新建文件。 //*********************************************************************************** #ifndef __UART__H #define __UART__H typedef enum en_uart_channel { UART0, ///<串口0 UART1, ///<串口1 //UART2, ///<串口2 UART_SIZE, } en_uart_channel_t; //*********************************************************************************** //指定打印串口 #define PRINTF_UART UART0 #define UART0_P70_P30 //#define UART1_P136_P60 #define UartTC _0020_SCI_VALID_STORED #define UartTxe _0040_SCI_UNDER_EXECUTE #define UartTxIrq 0x01 #define UartRxIrq 0x02 #define UART0_TX_IRQn ST0_IRQn #define UART1_TX_IRQn ST1_IRQn #define UART2_TX_IRQn ST2_IRQn #define UART0_RX_IRQn SR0_IRQn #define UART1_RX_IRQn SR1_IRQn #define UART2_RX_IRQn SR2_IRQn #define UART_ClrStatus(UARTx, SSR_Mask) #define UART0_ClrErrorFlag() do{ \ err_type = (uint8_t)(SCI0->SSR01 & 0x0007U); \ SCI0->SIR01 = (uint16_t)err_type; \ }while(0) #define UART1_ClrErrorFlag() do{ \ err_type = (uint8_t)(SCI0->SSR03 & 0x0007U); \ SCI0->SIR03 = (uint16_t)err_type; \ }while(0) #define UART2_ClrErrorFlag() do{ \ err_type = (uint8_t)(SCI1->SSR01 & 0x0007U); \ SCI1->SIR01 = (uint16_t)err_type; \ }while(0) //*********************************************************************************** //串口0初始化 #ifdef UART0_P70_P30 //GPIO初始化 #define UART0_PinInit() do{ \ GPIO_Init(P7, 0, 1, IO_OUT_PP); \ GPIO_Init(P3, 0, 1, IO_IN_PU); \ GPIO_SetAfMode(P7, 0, GPIO_AF_TXD0); \ GPIO_SetAfMode(P3, 0, GPIO_AF_RXD0); \ }while(0) //唤醒中断 #define UART0_Wakeup(NewState) do{ \ if(NewState == DISABLE) \ { \ GPIO_Init(P7, 0, 1, IO_OUT_PP); \ GPIO_Init(P3, 0, 1, IO_IN_PU); \ } \ else \ { \ GPIO_Init(P7, 0, 1, IO_IN_PD); \ GPIO_Init(P3, 0, 1, IO_IN_PD); \ } \ GPIO_IrqConfig(P3, 0, INTP3, INTP_RISING, NewState); \ }while(0) #define UART0_ReadRxIntFlag() GPIO_GetIrqStatus(INTP3) #define UART0_ClrRxIntFlag() GPIO_ClearIrq(INTP3) #endif #ifdef UART1_P136_P60 #define UART1_PinInit() do{ \ GPIO_Init(P13, 6, 1, IO_OUT_ODP); \ GPIO_Init(P6, 0, 1, IO_IN_PU); \ GPIO_SetAfMode(P13, 6, GPIO_AF_TXD1); \ GPIO_SetAfMode(P6, 0, GPIO_AF_RXD1); \ }while(0) //唤醒中断 #define UART1_Wakeup(NewState) GPIO_IrqConfig(P6, 0, INTP3, INTP_FALLING, NewState) #define UART1_ReadRxIntFlag() GPIO_GetIrqStatus(INTP3) #define UART1_ClrRxIntFlag() GPIO_ClearIrq(INTP3) #endif //串口模块初始化 enum { UART_LEN_7BITS = _0002_SCI_LENGTH_7, UART_LEN_8BITS = _0003_SCI_LENGTH_8, UART_LEN_9BITS = _0001_SCI_LENGTH_9, UART_STOP_0BITS = _0000_SCI_STOP_NONE, UART_STOP_1BITS = _0010_SCI_STOP_1, UART_STOP_2BITS = _0020_SCI_STOP_2, UART_PARITY_NONE = _0000_SCI_PARITY_NONE, UART_PARITY_ZERO = _0100_SCI_PARITY_ZERO, UART_PARITY_EVEN = _0200_SCI_PARITY_EVEN, UART_PARITY_ODD = _0300_SCI_PARITY_ODD, }; #define UART_Init(UARTx, tBps, tLen, tStop, tParity) do{ \ UARTx##_PinInit(); \ UART_InfoInit(UARTx); \ UARTx##_Init(OSC_SYS_FREQ, tBps, tLen, tStop, tParity); \ INTC_EnableIRQ(UARTx##_TX_IRQn); \ INTC_EnableIRQ(UARTx##_RX_IRQn); \ }while(0) //******************************************************************** //USART接口休眠配置, #define UART_Wakeup(UARTx, NewState) do{ \ UARTx##_Wakeup(NewState); \ }while(0) #define UART_ReadRxIntFlag(UARTx) UARTx##_ReadRxIntFlag() #define UART_ClrRxIntFlag(UARTx) UARTx##_ClrRxIntFlag() #define UART_ReadWakeData(UARTx) (UART_Info.Uart[UARTx].rBuff[0]) //*********************************************************************************** #define UART_TX_BUFF_SIZE 128 #define UART_RX_BUFF_SIZE 1049 typedef struct { INT16U wCnt; //写入的数据个数 INT16U wPtr; //写入起始位置 INT16U rCnt; //可读出数据个数 INT16U rPtr; //读出起始位置 INT16U Idle; //空闲计数 INT8U wBuff[UART_TX_BUFF_SIZE]; //写入缓冲区 INT8U rBuff[UART_RX_BUFF_SIZE]; //读出缓冲区 } UART_Str1; typedef struct { UART_Str1 Uart[UART_SIZE]; } UART_Str; extern UART_Str UART_Info; #define UART_InfoInit(UARTx) MEM_Fill((INT8U *)&UART_Info.Uart[UARTx], 0, sizeof(UART_Str1)) //*********************************************************************************** enum { UART_1200bps = 0, UART_2400bps, UART_4800bps, UART_9600bps, UART_19200bps, UART_38400bps, UART_56000bps, UART_57600bps, UART_115200bps, }; extern const INT32U UART_BOUND_Tab[]; //*********************************************************************************** extern void UART_SendChar(en_uart_channel_t USARTx, INT16U ch); extern void UART_SendString(en_uart_channel_t USARTx, uint8_t *s); extern INT8U UART_WriteBuff(en_uart_channel_t USARTx, INT8U *ptr, INT16U Len); extern INT8U UART_ReadBuff(en_uart_channel_t USARTx, INT8U *ptr, INT16U Len); extern void UART_IdleCnt(void); extern INT8U UART_IdleRest(en_uart_channel_t USARTx, INT16U Value); extern INT8U UART_IdleState(en_uart_channel_t USARTx); extern int fputc(int ch, FILE *f); extern int fgetc(FILE *f); extern uint8_t fscanfc(uint32_t value); #endif