void uartInit(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* Enable GPIO and USART clock */ RCC_APB2PeriphClockCmd(UART_GPIO_PERIF, ENABLE); RCC_APB1PeriphClockCmd(UART_PERIF, ENABLE); /* Configure USART Rx as input floating */ GPIO_InitStructure.GPIO_Pin = UART_GPIO_RX; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); /* Configure USART Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = UART_GPIO_TX; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); #if defined(UART_OUTPUT_TRACE_DATA) || defined(ADC_OUTPUT_RAW_DATA) || defined(IMU_OUTPUT_RAW_DATA_ON_UART) USART_InitStructure.USART_BaudRate = 2000000; USART_InitStructure.USART_Mode = USART_Mode_Tx; #else USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; #endif 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_Init(UART_TYPE, &USART_InitStructure); #if defined(UART_OUTPUT_TRACE_DATA) || defined(ADC_OUTPUT_RAW_DATA) uartDmaInit(); #else // Configure Tx buffer empty interrupt NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(UART_TYPE, USART_IT_RXNE, ENABLE); vSemaphoreCreateBinary(waitUntilSendDone); xTaskCreate(uartRxTask, (const signed char * const)"UART-Rx", configMINIMAL_STACK_SIZE, NULL, /*priority*/2, NULL); packetDelivery = xQueueCreate(2, sizeof(CRTPPacket)); uartDataDelivery = xQueueCreate(40, sizeof(uint8_t)); #endif //Enable it USART_Cmd(UART_TYPE, ENABLE); isInit = true; }
void uartInit(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef extiInit; /* Enable GPIO and USART clock */ RCC_AHB1PeriphClockCmd(UART_GPIO_PERIF, ENABLE); ENABLE_UART_RCC(UART_PERIF, ENABLE); /* Configure USART Rx as input floating */ GPIO_InitStructure.GPIO_Pin = UART_GPIO_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(UART_GPIO_PORT, &GPIO_InitStructure); /* Configure USART Tx as alternate function */ GPIO_InitStructure.GPIO_Pin = UART_GPIO_TX_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(UART_GPIO_PORT, &GPIO_InitStructure); //Map uart to alternate functions GPIO_PinAFConfig(UART_GPIO_PORT, UART_GPIO_AF_TX_PIN, UART_GPIO_AF_TX); GPIO_PinAFConfig(UART_GPIO_PORT, UART_GPIO_AF_RX_PIN, UART_GPIO_AF_RX); #if defined(UART_OUTPUT_TRACE_DATA) || defined(ADC_OUTPUT_RAW_DATA) || defined(IMU_OUTPUT_RAW_DATA_ON_UART) USART_InitStructure.USART_BaudRate = 2000000; USART_InitStructure.USART_Mode = USART_Mode_Tx; #else USART_InitStructure.USART_BaudRate = 1000000; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; #endif 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_CTS; USART_Init(UART_TYPE, &USART_InitStructure); uartDmaInit(); // Configure Rx buffer not empty interrupt NVIC_InitStructure.NVIC_IRQChannel = UART_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_HIGH_PRI; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); vSemaphoreCreateBinary(waitUntilSendDone); uartDataDelivery = xQueueCreate(40, sizeof(uint8_t)); DEBUG_QUEUE_MONITOR_REGISTER(uartDataDelivery); USART_ITConfig(UART_TYPE, USART_IT_RXNE, ENABLE); //Setting up TXEN pin (NRF flow control) RCC_AHB1PeriphClockCmd(UART_TXEN_PERIF, ENABLE); bzero(&GPIO_InitStructure, sizeof(GPIO_InitStructure)); GPIO_InitStructure.GPIO_Pin = UART_TXEN_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(UART_TXEN_PORT, &GPIO_InitStructure); extiInit.EXTI_Line = UART_TXEN_EXTI; extiInit.EXTI_Mode = EXTI_Mode_Interrupt; extiInit.EXTI_Trigger = EXTI_Trigger_Rising_Falling; extiInit.EXTI_LineCmd = ENABLE; EXTI_Init(&extiInit); NVIC_EnableIRQ(EXTI4_IRQn); //Enable UART USART_Cmd(UART_TYPE, ENABLE); isInit = true; }