From c27b36536a3e9c98bceedb61efad185ebe836dad Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Sun, 23 Sep 2018 14:34:26 +0000 Subject: Modified USARTv2 to support HW FIFOs where present. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12288 110e8d01-0319-4d1e-a829-52ad28d1bb01 --- os/hal/ports/STM32/LLD/USARTv2/hal_serial_lld.c | 42 +++++++++++++++++-------- os/hal/ports/STM32/LLD/USARTv2/hal_serial_lld.h | 2 +- readme.txt | 1 + 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/os/hal/ports/STM32/LLD/USARTv2/hal_serial_lld.c b/os/hal/ports/STM32/LLD/USARTv2/hal_serial_lld.c index 8a4d20865..6c2b855af 100644 --- a/os/hal/ports/STM32/LLD/USARTv2/hal_serial_lld.c +++ b/os/hal/ports/STM32/LLD/USARTv2/hal_serial_lld.c @@ -338,25 +338,41 @@ static void serve_interrupt(SerialDriver *sdp) { osalSysUnlockFromISR(); } - /* Data available.*/ - if (isr & USART_ISR_RXNE) { + /* Data available, note it is a while in order to handle two situations: + 1) Another byte arrived after removing the previous one, this would cause + an extra interrupt to serve. + 2) FIFO mode is enabled on devices that support it, we need to empty + the FIFO.*/ + while (isr & USART_ISR_RXNE) { osalSysLockFromISR(); sdIncomingDataI(sdp, (uint8_t)u->RDR & sdp->rxmask); osalSysUnlockFromISR(); + + isr = u->ISR; } - /* Transmission buffer empty.*/ - if ((cr1 & USART_CR1_TXEIE) && (isr & USART_ISR_TXE)) { - msg_t b; - osalSysLockFromISR(); - b = oqGetI(&sdp->oqueue); - if (b < MSG_OK) { - chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); - u->CR1 = cr1 & ~USART_CR1_TXEIE; - } - else + /* Transmission buffer empty, note it is a while in order to handle two + situations: + 1) The data registers has been emptied immediately after writing it, this + would cause an extra interrupt to serve. + 2) FIFO mode is enabled on devices that support it, we need to fill + the FIFO.*/ + if (cr1 & USART_CR1_TXEIE) { + while (isr & USART_ISR_TXE) { + msg_t b; + + osalSysLockFromISR(); + b = oqGetI(&sdp->oqueue); + if (b < MSG_OK) { + chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); + u->CR1 = cr1 & ~USART_CR1_TXEIE; + break; + } u->TDR = b; - osalSysUnlockFromISR(); + osalSysUnlockFromISR(); + + isr = u->ISR; + } } /* Physical transmission end.*/ diff --git a/os/hal/ports/STM32/LLD/USARTv2/hal_serial_lld.h b/os/hal/ports/STM32/LLD/USARTv2/hal_serial_lld.h index 79864d808..11813b44a 100644 --- a/os/hal/ports/STM32/LLD/USARTv2/hal_serial_lld.h +++ b/os/hal/ports/STM32/LLD/USARTv2/hal_serial_lld.h @@ -428,7 +428,7 @@ #endif /* !defined(STM32_USART3_8_HANDLER) */ -#if STM32_SERIAL_USE_LPUART1 && \ +#if STM32_SERIAL_USE_LPUART1 && \ !OSAL_IRQ_IS_VALID_PRIORITY(STM32_SERIAL_LPUART1_PRIORITY) #error "Invalid IRQ priority assigned to LPUART1" #endif diff --git a/readme.txt b/readme.txt index 399d83f6a..e8fa7fe25 100644 --- a/readme.txt +++ b/readme.txt @@ -94,6 +94,7 @@ - NEW: Added mcuconf.h generators for STM32L476xx, STM32L496xx and STM32L4R5xx devices. - NEW: Added demo for STM32L496ZG-Nucleo144 and STM32L4R5ZI-Nucleo144 boards. +- NEW: Modified USARTv2 to support HW FIFOs where present. - NEW: STM32 DMAv1, ADCv3, DACv1, I2Cv2, SPIv2 and USARTv2 are now DMAMUX-aware. - NEW: Introduced support for STM32L4+ devices. -- cgit v1.2.3