aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/ports/STM32/LLD
diff options
context:
space:
mode:
Diffstat (limited to 'os/hal/ports/STM32/LLD')
-rw-r--r--os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.c12
-rw-r--r--os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h10
2 files changed, 22 insertions, 0 deletions
diff --git a/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.c b/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.c
index ceb14fe67..0012ef259 100644
--- a/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.c
+++ b/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.c
@@ -220,6 +220,7 @@ static void usart_stop(UARTDriver *uartp) {
*/
static void usart_start(UARTDriver *uartp) {
uint32_t cr1;
+ const uint32_t tmo = uartp->config->timeout;
USART_TypeDef *u = uartp->usart;
/* Defensive programming, starting from a clean state.*/
@@ -242,6 +243,13 @@ static void usart_start(UARTDriver *uartp) {
cr1 = USART_CR1_UE | USART_CR1_PEIE | USART_CR1_TE | USART_CR1_RE;
u->CR1 = uartp->config->cr1 | cr1;
+ /* Set receive timeout and check it appliance */
+ if (tmo > 0) {
+ osalDbgAssert(tmo <= USART_RTOR_RTO, "Timeout overflow");
+ u->RTOR = tmo;
+ osalDbgAssert(tmo == u->RTOR, "Timeout feature unsupported in this UART");
+ }
+
/* Starting the receiver idle loop.*/
uart_enter_rx_idle_loop(uartp);
}
@@ -325,6 +333,10 @@ static void serve_usart_irq(UARTDriver *uartp) {
/* End of transmission, a callback is generated.*/
_uart_tx2_isr_code(uartp);
}
+
+ if ((isr & USART_ISR_IDLE) || (isr & USART_ISR_RTOF)) {
+ _uart_timeout_isr_code(uartp);
+ }
}
/*===========================================================================*/
diff --git a/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h b/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h
index abb9bce0a..84afee0e1 100644
--- a/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h
+++ b/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h
@@ -586,6 +586,16 @@ typedef struct {
uartecb_t rxerr_cb;
/* End of the mandatory fields.*/
/**
+ * @brief Receiver timeout callback.
+ */
+ uartcb_t timeout_cb;
+ /**
+ * @brief Receiver timeout value in terms of number of bit duration.
+ * @details Set it to 0 when you want to handle IDLE interrupt instead of
+ * hardware timeout.
+ */
+ uint32_t timeout;
+ /**
* @brief Bit rate.
*/
uint32_t speed;