#include "conf_uart_serial.h"
#include <asf.h>
volatile uint8_t rx_buffer[USART_SERIAL_RX_BUFFER_SIZE];
volatile uint16_t rx_buffer_tail = 0;
volatile uint16_t rx_buffer_head = 0;
void serial_init(void) {
pio_configure(
PINS_USART0_PIO, PINS_USART0_TYPE, PINS_USART0_MASK, PINS_USART0_ATTR);
pmc_enable_periph_clk(USART_SERIAL_ID);
sysclk_enable_peripheral_clock(USART_SERIAL_ID);
const sam_usart_opt_t usart_console_settings
= {.baudrate = USART_SERIAL_BAUDRATE,
.char_length = USART_SERIAL_CHAR_LENGTH,
.parity_type = USART_SERIAL_PARITY,
.stop_bits = USART_SERIAL_STOP_BIT,
.channel_mode = US_MR_CHMODE_NORMAL};
usart_init_rs232(USART_SERIAL, &usart_console_settings, F_CPU);
usart_enable_tx(USART_SERIAL);
usart_enable_rx(USART_SERIAL);
usart_enable_interrupt(USART_SERIAL, US_IER_RXRDY);
NVIC_EnableIRQ(USART_SERIAL_IRQ);
}
uint16_t serial_available(void) {
return (USART_SERIAL_RX_BUFFER_SIZE + rx_buffer_head - rx_buffer_tail)
% USART_SERIAL_RX_BUFFER_SIZE;
}
char serial_read(void) {
if(rx_buffer_head == rx_buffer_tail) return 0;
else {
uint8_t temp = rx_buffer[rx_buffer_tail];
rx_buffer_tail = (rx_buffer_tail + 1) % USART_SERIAL_RX_BUFFER_SIZE;
return temp;
}
}
int main(void) {
sysclk_init();
board_init();
wdt_disable(WDT);
serial_init();
for(;;) {
if(serial_available()) { usart_write(USART_SERIAL, serial_read()); }
}
}
ISR(USART_SERIAL_ISR_HANDLER) {
if(usart_is_rx_ready(USART_SERIAL)) {
usart_read(USART_SERIAL, &rx_buffer[rx_buffer_head]);
rx_buffer_head = (rx_buffer_head + 1) % USART_SERIAL_RX_BUFFER_SIZE;
if(rx_buffer_head == rx_buffer_tail) {
rx_buffer_tail = (rx_buffer_tail + 1) % USART_SERIAL_RX_BUFFER_SIZE;
}
}
}