You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.6 KiB
C
73 lines
1.6 KiB
C
#include <avr/interrupt.h>
|
|
#include "uart.h"
|
|
#include "fifo.h"
|
|
|
|
Fifo_t uart0_rx_buffer = {{}, 0, 0};
|
|
Fifo_t uart0_tx_buffer = {{}, 0, 0};
|
|
|
|
const uint16_t bsel = 208;
|
|
const int8_t bscale = 0;
|
|
|
|
//FILE uart_output = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
|
|
|
|
void init_uart(void){
|
|
USARTD0_CTRLC= USART_CHSIZE0_bm | USART_CHSIZE1_bm;
|
|
//USARTD0_BAUDCTRLB = 0;
|
|
//USARTD0_BAUDCTRLA = 0;
|
|
USARTD0.BAUDCTRLA = bsel;
|
|
USARTD0.BAUDCTRLB = 0 | (bsel >> 8) | (bscale << USART_BSCALE0_bp);
|
|
USARTD0_CTRLB = USART_TXEN_bm | USART_RXEN_bm;
|
|
|
|
//USARTD0_CTRLA=USART_RXCINTLVL0_bm;
|
|
|
|
PORTD_OUTSET = PIN3_bm;
|
|
PORTD_DIRSET = PIN3_bm;
|
|
PORTD_OUTCLR = PIN2_bm;
|
|
PORTD_DIRCLR = PIN2_bm;
|
|
|
|
//stdout = &uart_output;
|
|
}
|
|
|
|
void uart_putchar(char c, FILE *stream)
|
|
{
|
|
fifo_push(&uart0_tx_buffer, c);
|
|
USARTD0_CTRLA |= USART_DREINTLVL_LO_gc;
|
|
}
|
|
|
|
//void puts(char * s){
|
|
// while (*s) {
|
|
// putchar(*s++);
|
|
// }
|
|
//}
|
|
|
|
char get_uart0_char(void)
|
|
{
|
|
while(1){
|
|
char buffer;
|
|
|
|
while( !(USARTD0_STATUS & USART_RXCIF_bm) );
|
|
buffer=USARTD0_DATA;
|
|
if ((USARTD0_STATUS & (USART_FERR_bm | USART_PERR_bm | USART_BUFOVF_bm))==0)
|
|
return buffer;
|
|
}
|
|
}
|
|
|
|
ISR(USARTD0_RXC_vect)
|
|
{
|
|
uint8_t tmp = get_uart0_char();
|
|
putchar(tmp);
|
|
if(( tmp == 0x0D || tmp == 0x0A))
|
|
printf("wurst\n\r");
|
|
else
|
|
fifo_push(&uart0_rx_buffer, tmp);
|
|
}
|
|
|
|
ISR(USARTD0_DRE_vect){
|
|
uint8_t tmp;
|
|
if(fifo_pop(&uart0_tx_buffer, &tmp) == FIFO_SUCCESS){
|
|
USARTD0_DATA = tmp;
|
|
} else {
|
|
USARTD0_CTRLA &= ~USART_DREINTLVL_LO_gc;
|
|
}
|
|
}
|