From 087e521ea9d282d4b94f22d9bb85eb16c5d1a685 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Fri, 22 Nov 2013 10:32:09 +0000 Subject: Fixed bug #442. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6506 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/ports/STM32/USARTv1/serial_lld.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'os') diff --git a/os/hal/ports/STM32/USARTv1/serial_lld.c b/os/hal/ports/STM32/USARTv1/serial_lld.c index ae6042a8d..89ac1187b 100644 --- a/os/hal/ports/STM32/USARTv1/serial_lld.c +++ b/os/hal/ports/STM32/USARTv1/serial_lld.c @@ -142,9 +142,7 @@ static void set_error(SerialDriver *sdp, uint16_t sr) { sts |= SD_FRAMING_ERROR; if (sr & USART_SR_NE) sts |= SD_NOISE_ERROR; - osalSysLockFromISR(); chnAddFlagsI(sdp, sts); - osalSysUnlockFromISR(); } /** @@ -155,12 +153,8 @@ static void set_error(SerialDriver *sdp, uint16_t sr) { static void serve_interrupt(SerialDriver *sdp) { USART_TypeDef *u = sdp->usart; uint16_t cr1 = u->CR1; - uint16_t sr = u->SR; /* SR reset step 1.*/ - uint16_t dr = u->DR; /* SR reset step 2.*/ + uint16_t sr = u->SR; - /* Error condition detection.*/ - if (sr & (USART_SR_ORE | USART_SR_NE | USART_SR_FE | USART_SR_PE)) - set_error(sdp, sr); /* Special case, LIN break detection.*/ if (sr & USART_SR_LBD) { osalSysLockFromISR(); @@ -168,12 +162,18 @@ static void serve_interrupt(SerialDriver *sdp) { osalSysUnlockFromISR(); u->SR &= ~USART_SR_LBD; } + /* Data available.*/ - if (sr & USART_SR_RXNE) { - osalSysLockFromISR(); - sdIncomingDataI(sdp, (uint8_t)dr); - osalSysUnlockFromISR(); + osalSysLockFromISR(); + while (sr & USART_SR_RXNE) { + /* Error condition detection.*/ + if (sr & (USART_SR_ORE | USART_SR_NE | USART_SR_FE | USART_SR_PE)) + set_error(sdp, sr); + sdIncomingDataI(sdp, u->DR); + sr = u->SR; } + osalSysUnlockFromISR(); + /* Transmission buffer empty.*/ if ((cr1 & USART_CR1_TXEIE) && (sr & USART_SR_TXE)) { msg_t b; @@ -187,6 +187,7 @@ static void serve_interrupt(SerialDriver *sdp) { u->DR = b; osalSysUnlockFromISR(); } + /* Physical transmission end.*/ if (sr & USART_SR_TC) { osalSysLockFromISR(); -- cgit v1.2.3