#include "uart1.h" uint8_t TxBufferUart[256] = { 0 }; uint8_t RxBufferUart[256] = { 0 }; __IO uint8_t TxCounterUart = 0x00; __IO uint8_t RxCounterUart = 0x00; uint8_t UartSendCount = 0; bool IsUart1Rcv = false; /******************************************************************************* * Function Name : USART_Configuration * Description : Configure USART1 * Input : None * Output : None * Return : None * Attention : None *******************************************************************************/ void GpioConfig_Usart1 ( void ) { #if WIFI_Uart1_def GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //使能USART1/GPIO 时钟可配置 //时钟配置 RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_GPIOA, ENABLE ); RCC_APB2PeriphClockCmd ( RCC_APB2Periph_USART1, ENABLE ); /* * USART1_TX -> PA9 , USART1_RX -> PA10 */ GPIO_PinAFConfig ( Wifi_GPIO, GPIO_PinSource9, GPIO_AF_1 ); GPIO_PinAFConfig ( Wifi_GPIO, GPIO_PinSource10, GPIO_AF_1 ); GPIO_InitStructure.GPIO_Pin = Wifi_Tx | Wifi_Rx; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init ( Wifi_GPIO, &GPIO_InitStructure ); USART_InitStructure.USART_BaudRate = Wifi_UART_BAUD; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init ( Wifi_UART, &USART_InitStructure ); USART_OverrunDetectionConfig ( USART1, USART_OVRDetection_Disable ); //使能前,关闭溢出 USART_ClearFlag ( Wifi_UART, USART_FLAG_TC ); USART_ITConfig ( Wifi_UART, USART_IT_RXNE, ENABLE ); USART_ITConfig ( Wifi_UART, USART_IT_TXE, DISABLE ); USART_Cmd ( Wifi_UART, ENABLE ); //使能串口 NVIC_InitStructure.NVIC_IRQChannel = Wifi_NVIC_Interrupt; NVIC_InitStructure.NVIC_IRQChannelPriority = Wifi_NVIC_Pre; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init ( &NVIC_InitStructure ); //使能串口中断 #endif } void UartSend ( char *buffer, int nBytes ) { // Wait for previous xmt to complete while ( TxCounterUart < UartSendCount ); // Setup next XMT memcpy ( TxBufferUart, buffer, nBytes ); TxCounterUart = 0; UartSendCount = nBytes; USART_ITConfig ( USART1, USART_IT_TXE, ENABLE ); } void USART1_IRQHandler ( void ) { if ( USART_GetITStatus ( Wifi_UART, USART_IT_RXNE ) != RESET ) { RxBufferUart[RxCounterUart] = USART_ReceiveData ( Wifi_UART ); if ( RxCounterUart >= 2 ) //当前是\n,上个如果是\r { if ( ( RxBufferUart[RxCounterUart - 1] == 0x0D ) && ( RxBufferUart[RxCounterUart] == 0x0A ) ) //start字符个数 { IsUart1Rcv = true; } } RxCounterUart++; USART_ClearITPendingBit ( Wifi_UART, USART_IT_RXNE ); } if ( USART_GetITStatus ( Wifi_UART, USART_IT_TXE ) != RESET ) { USART_SendData ( Wifi_UART, TxBufferUart[TxCounterUart++] ); if ( TxCounterUart >= UartSendCount ) { USART_ITConfig ( Wifi_UART, USART_IT_TXE, DISABLE ); } USART_ClearITPendingBit ( Wifi_UART, USART_IT_TXE ); } }