Код: Выделить всё
#define BUFF_SIZE 1024 //Размер буфферов приёма и передачи
//структура для кольцевого буфера USART
typedef struct
{
uint8_t BUFFER[BUFF_SIZE]; //сам буфер
uint32_t head; //голова
uint32_t tail; //хвост
uint32_t counter; //счётчик символов, поступивших в буффер
uint32_t overflow_counter; //счётчик переполнений буффера
} Uint8_USART_BufferTypeDef;
volatile Uint8_USART_BufferTypeDef USART1_TX, USART1_RX; //буферы приема и передачи УАРТ1
volatile uint32_t tx_flag = 1; //1 - готов к передаче 0 - передаю
//********************************************************************************
//Общий вектор для приёма и передачи USART1 //
//********************************************************************************
void USART1_IRQHandler(void)
{
//Если прерывание возникло по приёму байта
if((USART1->SR & USART_SR_RXNE)!=0)
{
if(USART1_RX.counter < BUFF_SIZE)
{
USART1_RX.BUFFER[USART1_RX.tail] = USART1->DR;
USART1_RX.counter++;
USART1_RX.tail++;
if(USART1_RX.tail == BUFF_SIZE) USART1_RX.tail = 0;
}
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
//Если по завершению передачи
if((USART1->SR & USART_SR_TC)!=0)
{
USART1->SR &= ~USART_SR_TC; //очистить флаг
if(USART1_TX.counter > 0)
{
USART1->DR = USART1_TX.BUFFER[USART1_TX.head];
USART1_TX.counter--;
USART1_TX.head++;
if(USART1_TX.head == BUFF_SIZE) USART1_TX.head = 0;
}
else tx_flag = 1;
}
}
uint32_t USART1_getchar(uint8_t *byte)
{
if(USART1_RX.counter == 0) return 0; //ждем приёма байта
else
{
*byte = USART1_RX.BUFFER[USART1_RX.head];
USART1_RX.BUFFER[USART1_RX.head++] = 0;
USART1_RX.counter--;
if(USART1_RX.head == BUFF_SIZE) USART1_RX.head = 0;
return 1;
}
}
void USART1_putchar(uint8_t c)
{
//если сейчас HE передается байт
if( tx_flag )
{
USART1->DR = c; //записываем данные прямо в регистр
tx_flag = 0; //и обнуляем флаг
}
else
{
if(USART1_TX.counter < BUFF_SIZE)
{
__disable_irq ();
USART1_TX.BUFFER[USART1_TX.tail] = c;
USART1_TX.counter++;
USART1_TX.tail++;
if(USART1_TX.tail == BUFF_SIZE) USART1_TX.tail = 0;
__enable_irq();
}
}
}
а в while(1) у меня такая строчка
Код: Выделить всё
if( USART1_getchar(&byte) ) { USART1_putchar(byte); } //Если есть байт данных - отправляем его-же в ответ




