- UART takes baudrate on init

- UART calculate optimized baud prescaler

git-svn-id: http://moon:8086/svn/projects/HendiControl@47 fda53097-d464-4ada-af97-ba876c37ca34
This commit is contained in:
2019-03-03 08:39:07 +00:00
parent 62a224defa
commit b915c39801
4 changed files with 104 additions and 84 deletions
+21 -3
View File
@@ -33,13 +33,31 @@ ISR(USART_RX_vect)
}
}
void uart_init(Fifo *pFifo, uint16_t BAUD_PRESCALE)
void uart_init(Fifo *pFifo, uint32_t baudrate)
{
g_pFifo = pFifo;
uint16_t prescale8 = UART_PRESCALE(baudrate, 8UL);
uint16_t prescale16 = UART_PRESCALE(baudrate, 16UL);
uint32_t baud8 = ((prescale8+1) * 8);
uint32_t baud16 = ((prescale16+1) * 16);
uint32_t err8 = abs(baudrate - baud8);
uint32_t err16 = abs(baudrate - baud16);
uint16_t prescale = prescale16;
if (err8 < err16)
{
prescale = prescale8;
// Double UART speed
UCSR0A |= 1 << U2X0;
}
// Set baud rate
UBRR0L = (uint8_t)BAUD_PRESCALE;
UBRR0H = (uint8_t)(BAUD_PRESCALE >> 8);
UBRR0L = (uint8_t)prescale;
UBRR0H = (uint8_t)(prescale >> 8);
// Enable receiver and transmitter
UCSR0B = (1<<TXEN0)|(1<<RXEN0);