void Uart_t::Init(uint32_t ABaudrate, GPIO_TypeDef *PGpioTx, const uint16_t APinTx, GPIO_TypeDef *PGpioRx, const uint16_t APinRx) { #else void Uart_t::Init(uint32_t ABaudrate, GPIO_TypeDef *PGpioTx, const uint16_t APinTx) { #endif PinSetupAlterFunc(PGpioTx, APinTx, omPushPull, pudNone, UART_AF); IBaudrate = ABaudrate; // ==== USART configuration ==== if (UART == USART1) { rccEnableUSART1(FALSE); } else if(UART == USART2) { rccEnableUSART2(FALSE); } #if defined STM32F072xB // Setup HSI as UART's clk src if(UART == USART1) RCC->CFGR3 |= RCC_CFGR3_USART1SW_HSI; else if(UART == USART2) RCC->CFGR3 |= RCC_CFGR3_USART2SW_HSI; OnAHBFreqChange(); #else OnAHBFreqChange(); // Setup baudrate #endif UART->CR2 = 0; #if UART_USE_DMA // ==== DMA ==== // Remap DMA request if needed #if defined STM32F0XX if(UART_DMA_TX == STM32_DMA1_STREAM4) SYSCFG->CFGR1 |= SYSCFG_CFGR1_USART1TX_DMA_RMP; #endif dmaStreamAllocate (UART_DMA_TX, IRQ_PRIO_MEDIUM, CmdUartTxIrq, NULL); dmaStreamSetPeripheral(UART_DMA_TX, &UART_TX_REG); dmaStreamSetMode (UART_DMA_TX, UART_DMA_TX_MODE); IDmaIsIdle = true; #endif #if UART_RX_ENABLED UART->CR1 = USART_CR1_TE | USART_CR1_RE; // TX & RX enable UART->CR3 = USART_CR3_DMAT | USART_CR3_DMAR; // Enable DMA at TX & RX PinSetupAlterFunc(PGpioRx, APinRx, omOpenDrain, pudPullUp, UART_AF); // Remap DMA request if needed #if defined STM32F0XX if(UART_DMA_RX == STM32_DMA1_STREAM5) SYSCFG->CFGR1 |= SYSCFG_CFGR1_USART1RX_DMA_RMP; #endif dmaStreamAllocate (UART_DMA_RX, IRQ_PRIO_LOW, nullptr, NULL); dmaStreamSetPeripheral(UART_DMA_RX, &UART_RX_REG); dmaStreamSetMemory0 (UART_DMA_RX, IRxBuf); dmaStreamSetTransactionSize(UART_DMA_RX, UART_RXBUF_SZ); dmaStreamSetMode (UART_DMA_RX, UART_DMA_RX_MODE); dmaStreamEnable (UART_DMA_RX); // Thread IPThd = chThdCreateStatic(waUartRxThread, sizeof(waUartRxThread), LOWPRIO, UartRxThread, NULL); #else UART->CR1 = USART_CR1_TE; // Transmitter enabled #if UART_USE_DMA UART->CR3 = USART_CR3_DMAT; // Enable DMA at transmitter #endif #endif UART->CR1 |= USART_CR1_UE; // Enable USART }
void Uart_t::Init(uint32_t ABaudrate, GPIO_TypeDef *PGpioTx, const uint16_t APinTx, GPIO_TypeDef *PGpioRx, const uint16_t APinRx) { #else void Uart_t::Init(uint32_t ABaudrate, GPIO_TypeDef *PGpioTx, const uint16_t APinTx) { #endif PinSetupAlterFunc(PGpioTx, APinTx, omPushPull, pudNone, UART_AF); IBaudrate = ABaudrate; // ==== USART configuration ==== if(UART == USART1) {rccEnableUSART1(FALSE); } else if(UART == USART2) {rccEnableUSART2(FALSE); } OnAHBFreqChange(); // Setup baudrate UART->CR2 = 0; #if UART_USE_DMA // ==== DMA ==== dmaStreamAllocate (UART_DMA_TX, IRQ_PRIO_MEDIUM, CmdUartTxIrq, NULL); dmaStreamSetPeripheral(UART_DMA_TX, &UART_TX_REG); dmaStreamSetMode (UART_DMA_TX, UART_DMA_TX_MODE); IDmaIsIdle = true; #endif #if UART_RX_ENABLED UART->CR1 = USART_CR1_TE | USART_CR1_RE; // TX & RX enable UART->CR3 = USART_CR3_DMAT | USART_CR3_DMAR; // Enable DMA at TX & RX PinSetupAlterFunc(PGpioRx, APinRx, omOpenDrain, pudPullUp, UART_AF); dmaStreamAllocate (UART_DMA_RX, IRQ_PRIO_LOW, nullptr, NULL); dmaStreamSetPeripheral(UART_DMA_RX, &UART_RX_REG); dmaStreamSetMemory0 (UART_DMA_RX, IRxBuf); dmaStreamSetTransactionSize(UART_DMA_RX, UART_RXBUF_SZ); dmaStreamSetMode (UART_DMA_RX, UART_DMA_RX_MODE); dmaStreamEnable (UART_DMA_RX); // Thread IPThd = chThdCreateStatic(waUartRxThread, sizeof(waUartRxThread), LOWPRIO, UartRxThread, NULL); #else UART->CR1 = USART_CR1_TE; // Transmitter enabled #if UART_USE_DMA UART->CR3 = USART_CR3_DMAT; // Enable DMA at transmitter #endif #endif UART->CR1 |= USART_CR1_UE; // Enable USART }