diff options
| -rw-r--r-- | examples/usartecho/echo.c | 9 | ||||
| -rw-r--r-- | examples/usartecho/makefile | 8 | ||||
| -rw-r--r-- | src/usart.c | 163 | ||||
| -rw-r--r-- | src/usart_baundrate_helper.h | 12 | ||||
| -rw-r--r-- | usart.h | 51 | 
5 files changed, 104 insertions, 139 deletions
| diff --git a/examples/usartecho/echo.c b/examples/usartecho/echo.c index 4ba9364..12b88f6 100644 --- a/examples/usartecho/echo.c +++ b/examples/usartecho/echo.c @@ -4,16 +4,19 @@  #include "../../usart.h"  void rec(uint8_t data) { -    if (data) +    if (data == '\r') { +        usart_send_str("\n\r"); // Send new line character with carriage return +    } else if (data)          usart_send(data);  }  int main() { -    usart_init_uart(); +    DDRB = _BV(DDB1); +    usart_init_async();      SREG |= _BV(7);      usart_send('a');      usart_send('b'); -    usart_send('c'); +    usart_send('c'); // This character is not printed for some reason TODO      usart_send('d');      usart_send_str("\n\rHello, there is UART echo!\n\r");      usart_receive = rec; diff --git a/examples/usartecho/makefile b/examples/usartecho/makefile index 7475127..48a713c 100644 --- a/examples/usartecho/makefile +++ b/examples/usartecho/makefile @@ -5,10 +5,14 @@ F_CPU = 16000000L  IOE_PREFIX = ../..  IOE_CFLAGS = -Os -ffunction-sections -fdata-sections -fshort-enums -Wall \  			 -DCONFIG_IOE_USART_OUTBUFFER_SIZE=64 \ -			 -DCONFIG_IOE_USART_OUTBUFFER_MODE=0 +			 -DCONFIG_IOE_USART_OUTBUFFER_MODE=0 \ +			 -DCONFIG_IOE_USART_BAUD=115200 \ +			 -DCONFIG_IOE_USART_PARITY=USART_PARITY_NONE \ +			 -DCONFIG_IOE_USART_STOPBIT=USART_STOPBIT_SINGLE \ +			 -DCONFIG_IOE_USART_DATABITS=8  all: usart.hex -	@echo Flash usart.hex to chip +	@echo Now you can flash usart.hex to your chip.  clean: ioeclean  	$(RM) echo.o diff --git a/src/usart.c b/src/usart.c index 745d75c..dca5878 100644 --- a/src/usart.c +++ b/src/usart.c @@ -2,83 +2,98 @@  #ifdef MCUSUPPORT_USART -volatile int8_t _usart_busy; +#define USART_PARITY_NONE 0 +#define USART_PARITY_ODD 1 +#define USART_PARITY_EVEN 2 + +#define USART_STOPBIT_SINGLE 1 +#define USART_STOPBIT_DOUBLE 2 + +#ifndef CONFIG_IOE_USART_BAUD +#warning "CONFIG_IOE_USART_BAUNDRATE not defined. Setting default 9600." +#define CONFIG_IOE_USART_BAUD 9600 +#endif +#ifndef CONFIG_IOE_USART_PARITY +#warning "CONFIG_IOE_USART_PARITY not defined. Using default USART_PARITY_NONE." +#define CONFIG_IOE_USART_PARITY USART_PARITY_NONE +#endif +#ifndef CONFIG_IOE_USART_STOPBIT +#warning "CONFIG_IOE_USART_STOPBIT not defined. Using default USART_STOPBIT_SINGLE." +#define CONFIG_IOE_USART_STOPBIT USART_STOPBIT_SINGLE +#endif +#ifndef CONFIG_IOE_USART_DATABITS +#warning "CONFIG_IOE_USART_DATABITS not defined. Using default 8." +#define CONFIG_IOE_USART_DATABITS 8 +#endif + +#if !((CONFIG_IOE_USART_PARITY == USART_PARITY_NONE) || \ +      (CONFIG_IOE_USART_PARITY == USART_PARITY_ODD) || \ +      (CONFIG_IOE_USART_PARITY == USART_PARITY_EVEN)) +#error "CONFIG_IOE_USART_PARITY has value, that is not allowed." +#endif + +#if !((CONFIG_IOE_USART_STOPBIT == USART_STOPBIT_SINGLE) || \ +      (CONFIG_IOE_USART_STOPBIT == USART_STOPBIT_DOUBLE)) +#error "CONFIG_IOE_USART_STOPBIT has value, that is not allowed." +#endif + +#if !((CONFIG_IOE_USART_DATABITS == 5) || \ +      (CONFIG_IOE_USART_DATABITS == 6) || \ +      (CONFIG_IOE_USART_DATABITS == 7) || \ +      (CONFIG_IOE_USART_DATABITS == 8)) +// TODO DATABITS 9 is not supported +#error "CONFIG_IOE_USART_DATABITS has value, that is not allowed." +#endif + +#if (defined CONFIG_IOE_USART_INFILE) && (CONFIG_IOE_USART_INBUFFER_SIZE <= 0) +#error "USART Input file can't be enabled without input buffer" +#endif +#if (defined CONFIG_IOE_USART_OUTFILE) && (CONFIG_IOE_USART_OUTBUFFER_SIZE <= 0) +#error "USART Input file can't be enabled without output buffer" +#endif -inline void usart_init_uart(void) { -    usart_init_async(USART_BAUDRATE_115200, USART_PARITY_NONE, -                     USART_STOPBIT_SINGLE, USART_DATABITS_8); -} -void usart_init_async(enum usartBaudrate baudrate, -                      enum usartParity parity, enum usartStopBit stopbit, -                      enum usartDataBits databits) { +volatile int8_t _usart_busy; + +void usart_init_async(void) {      _usart_busy = 0; -    switch (baudrate) { -    case USART_BAUDRATE_2400: -#define BAUD 2400 -#include "usart_baundrate_helper.h" -        break; -    case USART_BAUDRATE_4800: -#define BAUD 4800 -#include "usart_baundrate_helper.h" -        break; -    case USART_BAUDRATE_9600: -#define BAUD 9600 -#include "usart_baundrate_helper.h" -        break; -    case USART_BAUDRATE_19200: -#define BAUD 19200 -#include "usart_baundrate_helper.h" -        break; -    case USART_BAUDRATE_38400: -#define BAUD 38400 -#include "usart_baundrate_helper.h" -        break; -    case USART_BAUDRATE_57600: -#define BAUD 57600 -#include "usart_baundrate_helper.h" -        break; -    case USART_BAUDRATE_115200: -#define BAUD 115200 -#include "usart_baundrate_helper.h" -        break; -    } -    switch (parity) { -    case USART_PARITY_NONE: -        UCSR0C &= ~(_BV(UPM00) | _BV(UPM01)); -        break; -    case USART_PARITY_ODD: -        UCSR0C &= ~_BV(UPM00); -        UCSR0C |= _BV(UPM01); -        break; -    case USART_PARITY_EVEN: -        UCSR0C |= _BV(UPM00) | _BV(UPM01); -        break; -    } -    switch (stopbit) { -    case USART_STOPBIT_SINGLE: -        UCSR0C &= ~_BV(USBS0); -        break; -    case USART_STOPBIT_DOUBLE: -        UCSR0C |= _BV(USBS0); -        break; -    } -    switch (databits) { -    case USART_DATABITS_5: -        UCSR0C &= ~(_BV(UCSZ00) | _BV(UCSZ01)); -        break; -    case USART_DATABITS_6: -        UCSR0C &= ~_BV(UCSZ01); -        UCSR0C |= _BV(UCSZ00); -        break; -    case USART_DATABITS_7: -        UCSR0C &= ~_BV(UCSZ00); -        UCSR0C |= _BV(UCSZ01); -        break; -    case USART_DATABITS_8: -        UCSR0C |= _BV(UCSZ00) | _BV(UCSZ01); -        break; -    } +#define BAUD CONFIG_IOE_USART_BAUD +#include <util/setbaud.h> +    UBRR0H = UBRRH_VALUE; +    UBRR0L = UBRRL_VALUE; +#if USE_2X +    UCSR0A |= _BV(U2X0); +#else +    UCSR0A &= ~_BV(U2X0); +#endif + +#if CONFIG_IOE_USART_PARITY == USART_PARITY_NONE +    UCSR0C &= ~(_BV(UPM00) | _BV(UPM01)); +#elif CONFIG_IOE_USART_PARITY == USART_PARITY_ODD +    UCSR0C &= ~_BV(UPM00); +    UCSR0C |= _BV(UPM01); +#else // USART_PARITY_EVEN +    UCSR0C |= _BV(UPM00) | _BV(UPM01); +#endif + +#if CONFIG_IOE_USART_STOPBIT == USART_STOPBIT_SINGLE +    UCSR0C &= ~_BV(USBS0); +#else +    UCSR0C |= _BV(USBS0); +#endif + +#if CONFIG_IOE_USART_DATABITS == 5 +    UCSR0C &= ~(_BV(UCSZ00) | _BV(UCSZ01)); +#elif CONFIG_IOE_USART_DATABITS == 6 +    UCSR0C &= ~_BV(UCSZ01); +    UCSR0C |= _BV(UCSZ00); +#elif CONFIG_IOE_USART_DATABITS == 7 +    UCSR0C &= ~_BV(UCSZ00); +    UCSR0C |= _BV(UCSZ01); +#elif CONFIG_IOE_USART_DATABITS == 8 +    UCSR0C |= _BV(UCSZ00) | _BV(UCSZ01); +#endif +      // Enable receiver, transmitter and RX complete,      // Data register empty interrupts      UCSR0B = _BV(RXEN0) | _BV(TXEN0) | _BV(RXCIE0) | _BV(UDRIE0); diff --git a/src/usart_baundrate_helper.h b/src/usart_baundrate_helper.h deleted file mode 100644 index 0271bdd..0000000 --- a/src/usart_baundrate_helper.h +++ /dev/null @@ -1,12 +0,0 @@ -#include <util/setbaud.h> -UBRR0H = UBRRH_VALUE; -UBRR0L = UBRRL_VALUE; -#if USE_2X -UCSR0A |= _BV(U2X0); -#else -UCSR0A &= ~_BV(U2X0); -#endif -#undef BAUD -#undef UBRRH_VALUE -#undef UBRRL_VALUE -#undef USE_2X @@ -13,52 +13,12 @@  #error "No USART interface is known on your mcu."  #endif -enum usartBaudrate { -    USART_BAUDRATE_2400, -    USART_BAUDRATE_4800, -    USART_BAUDRATE_9600, -    USART_BAUDRATE_19200, -    USART_BAUDRATE_38400, -    USART_BAUDRATE_57600, -    USART_BAUDRATE_115200 -}; - -enum usartParity { -    USART_PARITY_NONE, -    USART_PARITY_ODD, -    USART_PARITY_EVEN -}; - -enum usartStopBit { -    USART_STOPBIT_SINGLE = 1, -    USART_STOPBIT_DOUBLE = 2 -}; - -enum usartDataBits { -    USART_DATABITS_5 = 5, -    USART_DATABITS_6 = 6, -    USART_DATABITS_7 = 7, -    USART_DATABITS_8 = 8, -    // USART_DATABITS_9 = 9 // Not supported yet -}; - -// Not supported yet. This is for synchronous mode only -//enum usartClockPolarity { -    //USART_CLOCKPOLARITY_FALLING, -    //USART_CLOCKPOLARITY_RISING -//}; +// TODO clock polarity and synchronous mode  #define USART_FRAMEERROR  _BV(FE0)  #define USART_DATAOVERRUN _BV(DOR0)  #define USART_PARITYERROR _BV(UPE0) -#if (defined CONFIG_IOE_USART_INFILE) && (CONFIG_IOE_USART_INBUFFER_SIZE <= 0) -#error "USART Input file can't be enabled without input buffer" -#endif -#if (defined CONFIG_IOE_USART_OUTFILE) && (CONFIG_IOE_USART_OUTBUFFER_SIZE <= 0) -#error "USART Input file can't be enabled without output buffer" -#endif -  #if CONFIG_IOE_USART_INBUFFER_SIZE > 0  #define _IOE_USART_INBUFFER  volatile IOEBUFFER(_ioe_usart_inbuffer, CONFIG_IOE_USART_INBUFFER_SIZE); @@ -70,14 +30,9 @@ volatile IOEBUFFER(_ioe_usart_outbuffer, CONFIG_IOE_USART_OUTBUFFER_SIZE);  /* - * Initialize USART device with 115200 baud rate, no parity, single stop bit, - * and 8 data bits. - * This function serves as fast default initialization. + * Initialize USART device.   */ -void usart_init_uart(void); -void usart_init_async(enum usartBaudrate, -                      enum usartParity, enum usartStopBit, -                      enum usartDataBits); +void usart_init_async(void);  void usart_send(uint8_t data);  #ifdef _IOE_USART_OUTBUFFER  void usart_send_str(char *str); | 
