ВходНаше всё Теги codebook PARTS Поиск Опросы Закон Среда
29 июня
1154469 Топик полностью
SciFi (13.12.2021 09:31 - 09:48, просмотров: 277) ответил Argon на Начал изучать совместную работу UART и DMA в STM32... Если верно понял, при конфигурации DMA задается ожидаемый объем принятых данных. А до конца приема мы не можем знать сколько уже принято?
Я делаю приём в кольцевой буфер через 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);
}
ส็็็็็็็็็็็็็็็็็็็็็็็็็༼ ຈل͜ຈ༽ส้้้้้้้้้้้้้้้้้้้้้้้