Я делаю приём в кольцевой буфер через DMA (там и режим такой
имеется circular). Прерывания не нужны совсем, если успеваем
выгребать из приёмного буфера: #define RXBUFSZ 32
static USART_TypeDef* const usart = USART1;
static unsigned int rxtail;
static uint8_t volatile rxfifo[RXBUFSZ];
static DMA_Channel_TypeDef* const rxstream = DMA1_Channel5;
void
uart_init(void)
{
rxstream->CMAR = (int)&rxfifo;
rxstream->CPAR = (int)&usart->DR;
rxstream->CNDTR = RXBUFSZ;
rxstream->CCR = DMA_CCR1_MINC
| DMA_CCR1_CIRC
| DMA_CCR1_EN;
usart->BRR = SYSTIME_TPS / 1200;
usart->CR3 = USART_CR3_DMAR;
usart->CR1 = USART_CR1_UE
| USART_CR1_RE;
}
int
uart_getbyte(void)
{
return rxfifo[rxtail++ & (RXBUFSZ - 1)];
}
int
uart_rxcount(void)
{
return (0 - rxstream->CNDTR - rxtail) & (RXBUFSZ - 1);
}