ну да, или тайминги или "левые заходы" в RXNE DISABLE_RX == 3, вычитается при каждом заходе по прерыванию RXNE
if (((iface->SR & USART_FLAG_TXE) != 0) && ((iface->CR1 & USART_CR1_TXEIE) != 0))
{
if ((lin1_tx_buf_prt != NULL) && (lin1_tx_buf_prt->rx_adr > lin1_tx_buf_prt->tx_adr ))
{
lin1_tx_run = DISABLE_RX;
iface->DR = lin1_tx_buf_prt->data[lin1_tx_buf_prt->tx_adr];
lin1_tx_buf_prt->tx_adr ++;
}
else
{
data = iface->DR;
iface->CR1 &= ~USART_CR1_TXEIE;
}
}