/** * @brief USART initialization. * @details This function must be invoked with interrupts disabled. * * @param[in] uartp pointer to the @p UARTDriver object */ static void usart_start(UARTDriver *uartp) { uint32_t cr1; USART_TypeDef *u = uartp->usart; /* Defensive programming, starting from a clean state.*/ usart_stop(uartp); /* Baud rate setting.*/ u->BRR = (uint32_t)(uartp->clock / uartp->config->speed); /* Resetting eventual pending status flags.*/ u->ICR = 0xFFFFFFFFU; /* Note that some bits are enforced because required for correct driver operations.*/ u->CR2 = uartp->config->cr2 | USART_CR2_LBDIE; u->CR3 = uartp->config->cr3 | USART_CR3_DMAT | USART_CR3_DMAR | USART_CR3_EIE; /* Mustn't ever set TCIE here - if done, it causes an immediate interrupt.*/ cr1 = USART_CR1_UE | USART_CR1_PEIE | USART_CR1_TE | USART_CR1_RE; u->CR1 = uartp->config->cr1 | cr1; /* Starting the receiver idle loop.*/ set_rx_idle_loop(uartp); }
/** * @brief Deactivates the UART peripheral. * * @param[in] uartp pointer to the @p UARTDriver object * * @notapi */ void uart_lld_stop(UARTDriver *uartp) { if (uartp->state == UART_READY) { usart_stop(uartp); dmaStreamRelease(uartp->dmarx); dmaStreamRelease(uartp->dmatx); #if STM32_UART_USE_USART1 if (&UARTD1 == uartp) { nvicDisableVector(STM32_USART1_NUMBER); rccDisableUSART1(FALSE); return; } #endif #if STM32_UART_USE_USART2 if (&UARTD2 == uartp) { nvicDisableVector(STM32_USART2_NUMBER); rccDisableUSART2(FALSE); return; } #endif #if STM32_UART_USE_USART3 if (&UARTD3 == uartp) { nvicDisableVector(STM32_USART3_NUMBER); rccDisableUSART3(FALSE); return; } #endif } }
/** * @brief USART initialization. * @details This function must be invoked with interrupts disabled. * * @param[in] uartp pointer to the @p UARTDriver object */ static void usart_start(UARTDriver *uartp) { uint16_t cr1; USART_TypeDef *u = uartp->usart; /* Defensive programming, starting from a clean state.*/ usart_stop(uartp); /* Baud rate setting.*/ if (uartp->usart == USART1) u->BRR = STM32_PCLK2 / uartp->config->speed; else u->BRR = STM32_PCLK1 / uartp->config->speed; /* Resetting eventual pending status flags.*/ (void)u->SR; /* SR reset step 1.*/ (void)u->DR; /* SR reset step 2.*/ u->SR = 0; /* Note that some bits are enforced because required for correct driver operations.*/ if (uartp->config->txend2_cb == NULL) cr1 = USART_CR1_UE | USART_CR1_PEIE | USART_CR1_TE | USART_CR1_RE; else cr1 = USART_CR1_UE | USART_CR1_PEIE | USART_CR1_TE | USART_CR1_RE | USART_CR1_TCIE; u->CR1 = uartp->config->cr1 | cr1; u->CR2 = uartp->config->cr2 | USART_CR2_LBDIE; u->CR3 = uartp->config->cr3 | USART_CR3_DMAT | USART_CR3_DMAR | USART_CR3_EIE; /* Starting the receiver idle loop.*/ set_rx_idle_loop(uartp); }
/** * @brief USART initialization. * @details This function must be invoked with interrupts disabled. * * @param[in] uartp pointer to the @p UARTDriver object */ static void usart_start(UARTDriver *uartp) { uint16_t cr1; USART_TypeDef *u = uartp->usart; /* Defensive programming, starting from a clean state.*/ usart_stop(uartp); /* Baud rate setting.*/ #if STM32_HAS_USART6 if ((uartp->usart == USART1) || (uartp->usart == USART6)) #else if (uartp->usart == USART1) #endif u->BRR = STM32_PCLK2 / uartp->config->speed; else u->BRR = STM32_PCLK1 / uartp->config->speed; /* Resetting eventual pending status flags.*/ (void)u->SR; /* SR reset step 1.*/ (void)u->DR; /* SR reset step 2.*/ u->SR = 0; /* Note that some bits are enforced because required for correct driver operations.*/ u->CR2 = uartp->config->cr2 | USART_CR2_LBDIE; u->CR3 = uartp->config->cr3 | USART_CR3_DMAT | USART_CR3_DMAR | USART_CR3_EIE; /* Mustn't ever set TCIE here - if done, it causes an immediate interrupt.*/ cr1 = USART_CR1_UE | USART_CR1_PEIE | USART_CR1_TE | USART_CR1_RE; u->CR1 = uartp->config->cr1 | cr1; /* Starting the receiver idle loop.*/ uart_enter_rx_idle_loop(uartp); }
/** * @brief Deactivates the UART peripheral. * * @param[in] uartp pointer to the @p UARTDriver object * * @notapi */ void uart_lld_stop(UARTDriver *uartp) { if (uartp->state == UART_READY) { usart_stop(uartp); dmaStreamRelease(uartp->dmarx); dmaStreamRelease(uartp->dmatx); #if STM32_UART_USE_USART1 if (&UARTD1 == uartp) { nvicDisableVector(STM32_USART1_NUMBER); rccDisableUSART1(FALSE); return; } #endif #if STM32_UART_USE_USART2 if (&UARTD2 == uartp) { nvicDisableVector(STM32_USART2_NUMBER); rccDisableUSART2(FALSE); return; } #endif #if STM32_UART_USE_USART3 if (&UARTD3 == uartp) { nvicDisableVector(STM32_USART3_NUMBER); rccDisableUSART3(FALSE); return; } #endif #if STM32_UART_USE_UART4 if (&UARTD4 == uartp) { nvicDisableVector(STM32_UART4_NUMBER); rccDisableUART4(FALSE); return; } #endif #if STM32_UART_USE_UART5 if (&UARTD5 == uartp) { nvicDisableVector(STM32_UART5_NUMBER); rccDisableUART5(FALSE); return; } #endif #if STM32_UART_USE_USART6 if (&UARTD6 == uartp) { nvicDisableVector(STM32_USART6_NUMBER); rccDisableUSART6(FALSE); return; } #endif #if STM32_UART_USE_UART7 if (&UARTD7 == uartp) { nvicDisableVector(STM32_UART7_NUMBER); rccDisableUART7(FALSE); return; } #endif #if STM32_UART_USE_UART8 if (&UARTD8 == uartp) { nvicDisableVector(STM32_UART8_NUMBER); rccDisableUART8(FALSE); return; } #endif } }