Display_Avr_3/UART/uart.c
2024-02-11 21:19:28 +03:00

52 lines
2.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <string.h>
#include "circular_buf.h"
#include "uart.h"
struct circular_buffer uartRxBuffer;
void UART_init(void) {
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << UDRIE0); // прерывание по приему и опустошению буфера передачи
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
UBRR0H = 0;
UBRR0L = 103;
}
void UART_send(uint8_t* data, size_t length) {
for (size_t i = 0; i < length; i++) {
while (!(UCSR0A & (1 << UDRE0))) {
// Ждем опустошения буфера передачи
}
// Записываем в регистр UDR0
UDR0 = data[i];
}
}
// Получение данных из буфера
int UART_receive(uint8_t* data, size_t length) {
char overflow = 0; // Флаг переполнения, который устанавливается, если превышен размер массива
uint32_t byteCount = 0; // Счетчик байтов, принятых из буфера приема
// Пока буфер приема не пуст и не превышен лимит длины массива,
// функция продолжает читать байты из буфера и сохранять их в массив data.
while (!buffer_empty(&uartRxBuffer) && byteCount < length) {
int reader = read_buffer(&uartRxBuffer); // Прием и запись символа в переменную
data[byteCount] = reader; // Запись в массив с индексом byteCount
byteCount++;
}
// Проверка переполнения
if (byteCount > length) {
overflow = 1;
}
return overflow ? -1 : byteCount; // Возвращает количество успешно принятых байт или -1 в случае переполнения
}
// прерывание по завершению приема
ISR(USART_RX_vect) {
uint8_t data = UDR0; // читаем из регистра UDR0
if (!buffer_full(&uartRxBuffer)) {
write_buffer(&uartRxBuffer, data);// записываем символ в буфер приема
}
}