ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
1096512 Топик полностью
SciFi (28.04.2021 16:45, просмотров: 300) ответил LightElf на Ну вот как-то так:
Кстати, прерывания зачастую не нужны, подключаю DMA. На приём закольцованный режим, если в главном цикле успевать выгребать, то кольцевой буфер не переполнится. А на отправку бывает достаточно каждую посылку делать одной пачкой DMA. 
#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);
}
ส็็็็็็็็็็็็็็็็็็็็็็็็็༼ ຈل͜ຈ༽ส้้้้้้้้้้้้้้้้้้้้้้้