15 constexpr uint16_t UART_BAUD_SELECT(uint32_t baudRate, uint32_t xtalCpu) {
16 return (((
double)(xtalCpu)) / (((
double)(baudRate)) * 8.0) - 1.0 + 0.5);
22 volatile uint8_t UCSRxA;
23 volatile uint8_t UCSRxB;
24 volatile uint8_t UCSRxC;
25 volatile uint8_t UCSRxD;
26 volatile uint16_t UBRRx;
27 volatile uint8_t UDRx;
38 return rx_buf.
front();
42 return rx_buf.empty();
48 void Write(uint8_t c);
51 void WriteS(
const char *str);
58 void puts(
const char *str);
61 void puts_P(
const char *str_P);
64 return !tx_buf.full();
70 __attribute__((always_inline))
inline void rx_enable() { husart->UCSRxB |= (1 << RXEN1); };
76 husart->UBRRx = UART_BAUD_SELECT(conf->baudrate,
F_CPU);
77 husart->UCSRxA |= (1 << U2X1);
80 husart->UCSRxB = (1 << TXEN1) | (1 << RXCIE1);
85 if (husart->UCSRxA & (1 << FE1)) {
88 rx_buf.
push((uint8_t)husart->UDRx);
100 husart->UCSRxA |= (1 << TXC1);
103 husart->UCSRxB &= ~(1 << UDRIE1);
106 USART(USART_TypeDef *husart)
111 USART_TypeDef *husart;
124 #define USART1 ((hal::usart::USART::USART_TypeDef *)&UCSR1A)
bool pop(T &elem)
Definition: circular_buffer.h:135
bool push(T elem)
Definition: circular_buffer.h:119
T front() const
Definition: circular_buffer.h:129
__attribute__((always_inline)) inline void rx_enable()
Enable the RX receiver.
Definition: usart.h:70
void Flush()
blocks until the TX buffer was successfully transmitted
Definition: usart.cpp:48
void puts(const char *str)
Definition: usart.cpp:82
uint8_t Read()
Definition: usart.cpp:11
bool CanWrite() const
Definition: usart.h:63
void WriteS(const char *str)
Definition: usart.cpp:69
__attribute__((always_inline)) inline void Init(USART_InitTypeDef *const conf)
Initializes USART interface.
Definition: usart.h:73
void puts_P(const char *str_P)
Definition: usart.cpp:87
void Write(uint8_t c)
Definition: usart.cpp:17
void WriteS_P(const char *str_P)
Definition: usart.cpp:75
uint8_t Peek() const
Definition: usart.h:37
__attribute__((always_inline)) inline void ISR_RX()
implementation of the receive ISR's body
Definition: usart.h:84
bool ReadEmpty() const
Definition: usart.h:41
__attribute__((always_inline)) inline void ISR_UDRE()
implementation of the transmit ISR's body
Definition: usart.h:92
#define F_CPU
Main clock frequency.
Definition: cpu.h:11
void Init()
ADC access routines.
Definition: adc.cpp:8
USART usart1(USART1)
beware - normally we'd make a singleton, but avr-gcc generates suboptimal code for them,...
Definition: usart.h:119