/** * @brief Initialize UART channel * * This routine is called to reset the chip in a quiescent state. * It is assumed that this function is called only once per UART. * * @param dev UART device struct * * @return 0 */ static int uart_stm32_init(struct device *dev) { const struct uart_stm32_config *config = DEV_CFG(dev); struct uart_stm32_data *data = DEV_DATA(dev); USART_TypeDef *UartInstance = UART_STRUCT(dev); __uart_stm32_get_clock(dev); /* enable clock */ if (clock_control_on(data->clock, (clock_control_subsys_t *)&config->pclken) != 0) { return -EIO; } LL_USART_Disable(UartInstance); /* TX/RX direction */ LL_USART_SetTransferDirection(UartInstance, LL_USART_DIRECTION_TX_RX); /* 8 data bit, 1 start bit, 1 stop bit, no parity */ LL_USART_ConfigCharacter(UartInstance, LL_USART_DATAWIDTH_8B, LL_USART_PARITY_NONE, LL_USART_STOPBITS_1); if (config->hw_flow_control) { uart_stm32_set_hwctrl(dev, LL_USART_HWCONTROL_RTS_CTS); } /* Set the default baudrate */ uart_stm32_set_baudrate(dev, data->baud_rate); LL_USART_Enable(UartInstance); #ifdef USART_ISR_TEACK /* Wait until TEACK flag is set */ while (!(LL_USART_IsActiveFlag_TEACK(UartInstance))) ; #endif /* !USART_ISR_TEACK */ #ifdef USART_ISR_REACK /* Wait until REACK flag is set */ while (!(LL_USART_IsActiveFlag_REACK(UartInstance))) ; #endif /* !USART_ISR_REACK */ #ifdef CONFIG_UART_INTERRUPT_DRIVEN config->uconf.irq_config_func(dev); #endif return 0; }
void MX_USART6_UART_Init(void) { LL_USART_InitTypeDef USART_InitStruct; LL_GPIO_InitTypeDef GPIO_InitStruct; /* Peripheral clock enable */ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART6); //! PA11 ------> USART6_TX //! PA12 ------> USART6_RX GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; GPIO_InitStruct.Alternate = LL_GPIO_AF_8; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); USART_InitStruct.BaudRate = 115200; USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; USART_InitStruct.StopBits = LL_USART_STOPBITS_1; USART_InitStruct.Parity = LL_USART_PARITY_NONE; USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE; USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; LL_USART_Init(USART6, &USART_InitStruct); LL_USART_ConfigAsyncMode(USART6); NVIC_SetPriority(USART6_IRQn, 0); NVIC_EnableIRQ(USART6_IRQn); memset((void*)rx_buffer, 0, RX_BUFFER_SIZE); LL_USART_ClearFlag_ORE(USART6); LL_USART_EnableIT_RXNE(USART6); LL_USART_Enable(USART6); }
static int uart_stm32_configure(struct device *dev, const struct uart_config *cfg) { struct uart_stm32_data *data = DEV_DATA(dev); USART_TypeDef *UartInstance = UART_STRUCT(dev); const u32_t parity = uart_stm32_cfg2ll_parity(cfg->parity); const u32_t stopbits = uart_stm32_cfg2ll_stopbits(cfg->stop_bits); const u32_t databits = uart_stm32_cfg2ll_databits(cfg->data_bits); const u32_t flowctrl = uart_stm32_cfg2ll_hwctrl(cfg->flow_ctrl); /* Hardware doesn't support mark or space parity */ if ((UART_CFG_PARITY_MARK == cfg->parity) || (UART_CFG_PARITY_SPACE == cfg->parity)) { return -ENOTSUP; } #if defined(LL_USART_STOPBITS_0_5) && defined(CONFIG_LPUART_1) if (IS_LPUART_INSTANCE(UartInstance) && UART_CFG_STOP_BITS_0_5 == cfg->stop_bits) { return -ENOTSUP; } #else if (UART_CFG_STOP_BITS_0_5 == cfg->stop_bits) { return -ENOTSUP; } #endif #if defined(LL_USART_STOPBITS_1_5) && defined(CONFIG_LPUART_1) if (IS_LPUART_INSTANCE(UartInstance) && UART_CFG_STOP_BITS_1_5 == cfg->stop_bits) { return -ENOTSUP; } #else if (UART_CFG_STOP_BITS_1_5 == cfg->stop_bits) { return -ENOTSUP; } #endif /* Driver doesn't support 5 or 6 databits and potentially 7 or 9 */ if ((UART_CFG_DATA_BITS_5 == cfg->data_bits) || (UART_CFG_DATA_BITS_6 == cfg->data_bits) #ifndef LL_USART_DATAWIDTH_7B || (UART_CFG_DATA_BITS_7 == cfg->data_bits) #endif /* LL_USART_DATAWIDTH_7B */ #ifndef LL_USART_DATAWIDTH_9B || (UART_CFG_DATA_BITS_9 == cfg->data_bits) #endif /* LL_USART_DATAWIDTH_9B */ ) { return -ENOTSUP; } /* Driver supports only RTS CTS flow control */ if (UART_CFG_FLOW_CTRL_NONE != cfg->flow_ctrl) { if (!IS_UART_HWFLOW_INSTANCE(UartInstance) || UART_CFG_FLOW_CTRL_RTS_CTS != cfg->flow_ctrl) { return -ENOTSUP; } } LL_USART_Disable(UartInstance); if (parity != uart_stm32_get_parity(dev)) { uart_stm32_set_parity(dev, parity); } if (stopbits != uart_stm32_get_stopbits(dev)) { uart_stm32_set_stopbits(dev, stopbits); } if (databits != uart_stm32_get_databits(dev)) { uart_stm32_set_databits(dev, databits); } if (flowctrl != uart_stm32_get_hwctrl(dev)) { uart_stm32_set_hwctrl(dev, flowctrl); } if (cfg->baudrate != data->baud_rate) { uart_stm32_set_baudrate(dev, cfg->baudrate); data->baud_rate = cfg->baudrate; } LL_USART_Enable(UartInstance); return 0; };