Fixed bug #1278.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@16441 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
parent
46c476ffeb
commit
a173d119f1
|
@ -181,7 +181,7 @@ 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 cr1;
|
||||
uint16_t sr = u->SR;
|
||||
|
||||
/* Special case, LIN break detection.*/
|
||||
|
@ -208,6 +208,9 @@ static void serve_interrupt(SerialDriver *sdp) {
|
|||
}
|
||||
osalSysUnlockFromISR();
|
||||
|
||||
/* Caching CR1.*/
|
||||
cr1 = u->CR1;
|
||||
|
||||
/* Transmission buffer empty.*/
|
||||
if ((cr1 & USART_CR1_TXEIE) && (sr & USART_SR_TXE)) {
|
||||
msg_t b;
|
||||
|
@ -215,7 +218,7 @@ static void serve_interrupt(SerialDriver *sdp) {
|
|||
b = oqGetI(&sdp->oqueue);
|
||||
if (b < MSG_OK) {
|
||||
chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY);
|
||||
u->CR1 = cr1 & ~USART_CR1_TXEIE;
|
||||
cr1 &= ~USART_CR1_TXEIE;
|
||||
}
|
||||
else
|
||||
u->DR = b;
|
||||
|
@ -227,10 +230,13 @@ static void serve_interrupt(SerialDriver *sdp) {
|
|||
osalSysLockFromISR();
|
||||
if (oqIsEmptyI(&sdp->oqueue)) {
|
||||
chnAddFlagsI(sdp, CHN_TRANSMISSION_END);
|
||||
u->CR1 = cr1 & ~USART_CR1_TCIE;
|
||||
cr1 &= ~USART_CR1_TCIE;
|
||||
}
|
||||
osalSysUnlockFromISR();
|
||||
}
|
||||
|
||||
/* Writing CR1 once.*/
|
||||
u->CR1 = cr1;
|
||||
}
|
||||
|
||||
#if STM32_SERIAL_USE_USART1 || defined(__DOXYGEN__)
|
||||
|
|
|
@ -841,7 +841,7 @@ void sd_lld_stop(SerialDriver *sdp) {
|
|||
*/
|
||||
void sd_lld_serve_interrupt(SerialDriver *sdp) {
|
||||
USART_TypeDef *u = sdp->usart;
|
||||
uint32_t cr1 = u->CR1;
|
||||
uint32_t cr1;
|
||||
uint32_t isr;
|
||||
|
||||
/* Reading and clearing status.*/
|
||||
|
@ -872,6 +872,9 @@ void sd_lld_serve_interrupt(SerialDriver *sdp) {
|
|||
isr = u->ISR;
|
||||
}
|
||||
|
||||
/* Caching CR1.*/
|
||||
cr1 = u->CR1;
|
||||
|
||||
/* 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
|
||||
|
@ -886,7 +889,7 @@ void sd_lld_serve_interrupt(SerialDriver *sdp) {
|
|||
b = oqGetI(&sdp->oqueue);
|
||||
if (b < MSG_OK) {
|
||||
chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY);
|
||||
u->CR1 = cr1 & ~USART_CR1_TXEIE;
|
||||
cr1 &= ~USART_CR1_TXEIE;
|
||||
osalSysUnlockFromISR();
|
||||
break;
|
||||
}
|
||||
|
@ -902,10 +905,13 @@ void sd_lld_serve_interrupt(SerialDriver *sdp) {
|
|||
osalSysLockFromISR();
|
||||
if (oqIsEmptyI(&sdp->oqueue)) {
|
||||
chnAddFlagsI(sdp, CHN_TRANSMISSION_END);
|
||||
u->CR1 = cr1 & ~USART_CR1_TCIE;
|
||||
cr1 &= ~USART_CR1_TCIE;
|
||||
}
|
||||
osalSysUnlockFromISR();
|
||||
}
|
||||
|
||||
/* Writing CR1 once.*/
|
||||
u->CR1 = cr1;
|
||||
}
|
||||
|
||||
#endif /* HAL_USE_SERIAL */
|
||||
|
|
Loading…
Reference in New Issue