@@ -274,40 +274,40 @@ void Serial_Put(uint8_t port, const char * msg)
274
274
void USART_IRQHandler (uint8_t port )
275
275
{
276
276
#if IDLE_LINE_IT == true // IDLE Line interrupt
277
- if ((USART_STAT0 (Serial [port ].uart ) & USART_STAT0_IDLEF ) != RESET ) // check for IDLE Line interrupt
277
+ if ((USART_STAT0 (Serial [port ].uart ) & USART_STAT0_IDLEF ) != RESET ) // check for IDLE Line interrupt flag
278
278
{
279
- USART_STAT0 (Serial [port ].uart ); // clear IDLE Line bit
280
- USART_DATA (Serial [port ].uart );
281
-
282
279
dmaL1DataRX [port ].wIndex = dmaL1DataRX [port ].cacheSize - DMA_CHCNT (Serial [port ].dma_stream , Serial [port ].dma_channelRX );
280
+
281
+ USART_DATA (Serial [port ].uart ); // clear RXNE pending flag
282
+ USART_STAT0 (Serial [port ].uart ); // as last, clear IDLE Line interrupt flag
283
283
}
284
284
#endif
285
285
286
286
#ifdef TX_DMA_WRITE // TX DMA based serial writing
287
- if ((USART_STAT0 (Serial [port ].uart ) & USART_STAT0_TC ) != RESET ) // check for Transfer Complete (TC) interrupt
287
+ if ((USART_STAT0 (Serial [port ].uart ) & USART_STAT0_TC ) != RESET ) // check for Transfer Complete (TC) interrupt flag
288
288
{
289
- USART_STAT0 (Serial [port ].uart ) &= ~USART_STAT0_TC ; // clear Transfer Complete (TC) bit
290
-
291
289
// NOTE 1: use the serial TC, not the DMA TC because this only indicates DMA is done, peripheral might be still busy
292
290
// NOTE 2: the TC interrupt is sometimes called while DMA is still active, so check NDTR status!
293
291
//
294
292
if (DMA_CHCNT (Serial [port ].dma_stream , Serial [port ].dma_channelTX ) == 0 ) // sending is complete
295
293
{
296
294
// NOTE: it marks message timestamp twice if transfer was split into 2 parts
297
- dmaL1DataTX [port ].timestamp = OS_GetTimeMs (); // keep track of last sent message timestamp
295
+ dmaL1DataTX [port ].timestamp = OS_GetTimeMs (); // keep track of last sent message timestamp
298
296
299
297
dmaL1DataTX [port ].rIndex = (dmaL1DataTX [port ].rIndex + dmaL1DataTX [port ].flag ) % dmaL1DataTX [port ].cacheSize ;
300
298
dmaL1DataTX [port ].flag = 0 ;
301
299
302
- if (dmaL1DataTX [port ].rIndex != dmaL1DataTX [port ].wIndex ) // is more data available?
303
- Serial_Send_TX (port ); // continue sending data
300
+ if (dmaL1DataTX [port ].rIndex != dmaL1DataTX [port ].wIndex ) // is more data available?
301
+ Serial_Send_TX (port ); // continue sending data
304
302
else
305
- USART_CTL0 (Serial [port ].uart ) &= ~USART_CTL0_TCIE ; // disable Transfer Complete (TC) interrupt, nothing more to do
303
+ USART_CTL0 (Serial [port ].uart ) &= ~USART_CTL0_TCIE ; // disable Transfer Complete (TC) interrupt, nothing more to do
306
304
}
307
305
// else: more data is coming, wait for next Transfer Complete (TC) interrupt
306
+
307
+ USART_STAT0 (Serial [port ].uart ) &= ~USART_STAT0_TC ; // as last, clear Transfer Complete (TC) interrupt flag
308
308
}
309
309
#else // TX interrupt based serial writing
310
- if ((USART_STAT0 (Serial [port ].uart ) & USART_STAT0_TBE ) != RESET ) // check for TBE interrupt
310
+ if ((USART_STAT0 (Serial [port ].uart ) & USART_STAT0_TBE ) != RESET ) // check for TBE interrupt flag
311
311
{
312
312
if (dmaL1DataTX [port ].rIndex != dmaL1DataTX [port ].wIndex ) // is more data available?
313
313
{
0 commit comments