uart sending method fixed and interruption added

This commit is contained in:
Kirill Kurshakow 2024-02-12 21:46:21 +03:00
parent 5c4e2be040
commit 458b145297

View File

@ -6,6 +6,7 @@
#include "uart.h" #include "uart.h"
struct circular_buffer uartRxBuffer; struct circular_buffer uartRxBuffer;
struct circular_buffer uartTxBuffer;
void UART_init(void) { void UART_init(void) {
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << UDRIE0); // прерывание по приему и опустошению буфера передачи UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << UDRIE0); // прерывание по приему и опустошению буфера передачи
@ -16,11 +17,11 @@ void UART_init(void) {
void UART_send(uint8_t* data, size_t length) { void UART_send(uint8_t* data, size_t length) {
for (size_t i = 0; i < length; i++) { for (size_t i = 0; i < length; i++) {
while (!(UCSR0A & (1 << UDRE0))) { if (!buffer_full(&usartTxBuffer)) {
// Ждем опустошения буфера передачи write_buffer(&usartTxBuffer, data[i]);
} else {
break; // если буфер передачи заполнен, то отправка прерывается
} }
// Записываем в регистр UDR0
UDR0 = data[i];
} }
} }
@ -49,3 +50,9 @@ ISR(USART_RX_vect) {
write_buffer(&uartRxBuffer, data);// записываем символ в буфер приема write_buffer(&uartRxBuffer, data);// записываем символ в буфер приема
} }
} }
ISR(USART_TX_vect) {
if (!buffer_empty(&uartTxBuffer)) {
UDR0 = read_buffer(&uartTxBuffer);
}
}