//*********************************************************************************** // Ver 1.0 // 2020.03.05 1、新建文件。 //*********************************************************************************** #ifndef __UART__H #define __UART__H //串口引脚选择 #define UART1_PA9_PA10 //#define UART1_PB6_PB7 //#define UART1_PA2_PA3 //#define UART2_PA2_PA3 //#define UART2_PA14_PA15 //#define UART3_PB10_PB11 //指定打印串口 #define PRINTF_UART USART2 enum{ UART1 = 0, UART2, UART3, }; //*********************************************************************************** //串口1 GPIO初始化 #ifdef UART1_PA9_PA10 #define USART1_GpioInit() do{ \ GPIO_PinAFConfig(GPIOA, GPIO_Pin_9, GPIO_AF_1); \ GPIO_PinAFConfig(GPIOA, GPIO_Pin_10, GPIO_AF_1); \ GPIO_Init(GPIOA, GPIO_Pin_9, 1, GPIO_Mode_AF, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_UP); \ GPIO_Init(GPIOA, GPIO_Pin_10, 1, GPIO_Mode_AF, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_UP); \ }while(0) #define UART1_Wakeup(NewSta) #endif #ifdef UART1_PB6_PB7 #define USART1_GpioInit() do{ \ GPIO_PinAFConfig(GPIOB, GPIO_Pin_6, GPIO_AF_0); \ GPIO_PinAFConfig(GPIOB, GPIO_Pin_7, GPIO_AF_0); \ GPIO_Init(GPIOB, GPIO_Pin_6, 1, GPIO_Mode_AF, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_UP); \ GPIO_Init(GPIOB, GPIO_Pin_7, 1, GPIO_Mode_AF, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_UP); \ }while(0) #endif #ifdef UART1_PA2_PA3 #define USART1_GpioInit() do{ \ GPIO_PinAFConfig(GPIOA, GPIO_Pin_2, GPIO_AF_1); \ GPIO_PinAFConfig(GPIOA, GPIO_Pin_3, GPIO_AF_1); \ GPIO_Init(GPIOA, GPIO_Pin_2, 1, GPIO_Mode_AF, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_UP); \ GPIO_Init(GPIOA, GPIO_Pin_3, 1, GPIO_Mode_AF, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_UP); \ }while(0) #define USART1_Sleep() do{ \ GPIO_Init(GPIOA, GPIO_Pin_2, 0, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_DOWN); \ GPIO_Init(GPIOA, GPIO_Pin_3, 0, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_DOWN); \ }while(0) #endif //*********************************************************************************** //串口2 GPIO初始化 #ifdef UART2_PA2_PA3 #define USART2_GpioInit() do{ \ GPIO_PinAFConfig(GPIOA, GPIO_Pin_2, GPIO_AF_1); \ GPIO_PinAFConfig(GPIOA, GPIO_Pin_3, GPIO_AF_1); \ GPIO_Init(GPIOA, GPIO_Pin_2, 1, GPIO_Mode_AF, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_UP); \ GPIO_Init(GPIOA, GPIO_Pin_3, 1, GPIO_Mode_AF, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_UP); \ }while(0) #define USART2_Sleep() do{ \ GPIO_Init(GPIOA, GPIO_Pin_2, 0, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_DOWN); \ GPIO_Init(GPIOA, GPIO_Pin_3, 0, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_DOWN); \ }while(0) #endif #ifdef UART2_PA14_PA15 #define USART2_GpioInit() do{ \ GPIO_PinAFConfig(GPIOA, GPIO_Pin_14, GPIO_AF_1); \ GPIO_PinAFConfig(GPIOA, GPIO_Pin_15, GPIO_AF_1); \ GPIO_Init(GPIOA, GPIO_Pin_14, 1, GPIO_Mode_AF, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_UP); \ GPIO_Init(GPIOA, GPIO_Pin_15, 1, GPIO_Mode_AF, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_UP); \ }while(0) #endif //*********************************************************************************** //串口3 GPIO初始化 #ifdef UART3_PB10_PB11 #define USART3_GpioInit() do{ \ GPIO_PinAFConfig(GPIOB, GPIO_Pin_10, GPIO_AF_4); \ GPIO_PinAFConfig(GPIOB, GPIO_Pin_11, GPIO_AF_4); \ GPIO_Init(GPIOB, GPIO_Pin_10, 1, GPIO_Mode_AF, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_UP); \ GPIO_Init(GPIOB, GPIO_Pin_11, 1, GPIO_Mode_AF, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_UP); \ }while(0) #define USART3_Sleep() do{ \ GPIO_Init(GPIOB, GPIO_Pin_10, 0, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_DOWN); \ GPIO_Init(GPIOB, GPIO_Pin_11, 0, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_DOWN); \ }while(0) //串口接收口做中断唤醒时,要注意在休眠前写入触发方式, #define USART3_ExtiConfig(NewState) do{ \ if(NewState != DISABLE) GPIO_ExtiNvic(GPIO_Pin_11, EXTI_Trigger_Falling); \ GPIO_ExtiConfig(GPIOB, GPIO_Pin_11, NewState); \ }while(0) #define USART3_NvicReadFlag() GPIO_GetITStatus(GPIO_Pin_11) #define USART3_NvicClrFlag() GPIO_ClearITFlag(GPIO_Pin_11) #endif #define UART_Init(USARTn, tBps, tLen, tStop, tParity, tPri1) do{ \ USART_InitTypeDef USART_InitStructure; \ NVIC_InitTypeDef NVIC_InitStructure; \ UART_InfoInit(USARTn); \ USARTn##_GpioInit(); \ USART_InitStructure.USART_BaudRate = tBps; \ USART_InitStructure.USART_WordLength= tLen; \ USART_InitStructure.USART_StopBits = tStop; \ USART_InitStructure.USART_Parity = tParity; \ USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; \ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; \ USART_Init(USARTn, &USART_InitStructure); \ USART_ITConfig(USARTn, (USART_IT_RXNE), ENABLE); \ NVIC_InitStructure.NVIC_IRQChannel = USARTn##_IRQn; \ NVIC_InitStructure.NVIC_IRQChannelPriority=tPri1; \ NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; \ NVIC_Init(&NVIC_InitStructure); \ USART_Cmd(USARTn, ENABLE); \ }while(0) //*********************************************************************************** #define UART_TX_BUFF_SIZE 128 #define UART_RX_BUFF_SIZE 1049 #define UART_SIZE 1 typedef struct{ INT16U wrCnt; //读写缓冲临时计数值 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[UART_Num(UARTx)], 0, sizeof(UART_Str1)) //*********************************************************************************** enum{ UART_1200bps = 1200, UART_2400bps = 2400, UART_4800bps = 4800, UART_9600bps = 9600, UART_19200bps = 19200, UART_38400bps = 38400, UART_56000bps = 56000, UART_57600bps = 57600, UART_115200bps = 115200, }; //*********************************************************************************** extern void UART_SendChar(USART_TypeDef* USARTx, INT16U ch); extern void UART_SendString(USART_TypeDef* USARTx, uint8_t *s); extern INT8U UART_WriteBuff(USART_TypeDef* USARTx, INT8U *ptr, INT16U Len); extern INT8U UART_ReadBuff(USART_TypeDef* USARTx, INT8U *ptr, INT16U Len); extern int fputc(int ch, FILE *f); extern int fgetc(FILE *f); extern uint8_t fscanfc(uint32_t value); extern void UART_IdleCnt(void); extern INT8U UART_IdleRest(USART_TypeDef* USARTx, INT16U Value); extern INT8U UART_IdleState(USART_TypeDef* USARTx); extern INT8U UART_Num(USART_TypeDef* USARTx); #endif