git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@16441 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
Andrey Gusakov 2024-06-17 12:17:02 +03:00
parent 46c476ffeb
commit a173d119f1
2 changed files with 18 additions and 6 deletions

View File

@ -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__)

View File

@ -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 */