|
1 | | -#ifndef UART_H |
2 | | -#define UART_H |
3 | | -/************************************************************************ |
4 | | -Title: Interrupt UART library with receive/transmit circular buffers |
5 | | -Author: Peter Fleury <[email protected]> http://jump.to/fleury |
6 | | -File: $Id: uart.h,v 1.8.2.1 2007/07/01 11:14:38 peter Exp $ |
7 | | -Software: AVR-GCC 4.1, AVR Libc 1.4 |
8 | | -Hardware: any AVR with built-in UART, tested on AT90S8515 & ATmega8 at 4 Mhz |
9 | | -License: GNU General Public License |
10 | | -Usage: see Doxygen manual |
11 | | -
|
12 | | -LICENSE: |
13 | | - Copyright (C) 2006 Peter Fleury |
14 | | -
|
15 | | - This program is free software; you can redistribute it and/or modify |
16 | | - it under the terms of the GNU General Public License as published by |
17 | | - the Free Software Foundation; either version 2 of the License, or |
18 | | - any later version. |
19 | | -
|
20 | | - This program is distributed in the hope that it will be useful, |
21 | | - but WITHOUT ANY WARRANTY; without even the implied warranty of |
22 | | - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
23 | | - GNU General Public License for more details. |
24 | | - |
25 | | -************************************************************************/ |
26 | | - |
27 | | -/** |
28 | | - * @defgroup pfleury_uart UART Library |
29 | | - * @code #include <uart.h> @endcode |
30 | | - * |
31 | | - * @brief Interrupt UART library using the built-in UART with transmit and receive circular buffers. |
32 | | - * |
33 | | - * This library can be used to transmit and receive data through the built in UART. |
34 | | - * |
35 | | - * An interrupt is generated when the UART has finished transmitting or |
36 | | - * receiving a byte. The interrupt handling routines use circular buffers |
37 | | - * for buffering received and transmitted data. |
38 | | - * |
39 | | - * The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE constants define |
40 | | - * the size of the circular buffers in bytes. Note that these constants must be a power of 2. |
41 | | - * You may need to adapt this constants to your target and your application by adding |
42 | | - * CDEFS += -DUART_RX_BUFFER_SIZE=nn -DUART_RX_BUFFER_SIZE=nn to your Makefile. |
43 | | - * |
44 | | - * @note Based on Atmel Application Note AVR306 |
45 | | - * @author Peter Fleury [email protected] http://jump.to/fleury |
46 | | - */ |
47 | | - |
48 | | -/**@{*/ |
49 | | - |
50 | | - |
51 | | -#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304 |
52 | | -#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !" |
53 | | -#endif |
54 | | - |
55 | | - |
56 | | -/* |
57 | | -** constants and macros |
58 | | -*/ |
59 | | - |
60 | | -/** @brief UART Baudrate Expression |
61 | | - * @param xtalcpu system clock in Mhz, e.g. 4000000L for 4Mhz |
62 | | - * @param baudrate baudrate in bps, e.g. 1200, 2400, 9600 |
63 | | - */ |
64 | | -#define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu)/((baudRate)*16l)-1) |
65 | | - |
66 | | -/** @brief UART Baudrate Expression for ATmega double speed mode |
67 | | - * @param xtalcpu system clock in Mhz, e.g. 4000000L for 4Mhz |
68 | | - * @param baudrate baudrate in bps, e.g. 1200, 2400, 9600 |
69 | | - */ |
70 | | -#define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) (((xtalCpu)/((baudRate)*8l)-1)|0x8000) |
71 | | - |
72 | | - |
73 | | -/** Size of the circular receive buffer, must be power of 2 */ |
74 | | -#ifndef UART_RX_BUFFER_SIZE |
75 | | -#define UART_RX_BUFFER_SIZE 32 |
76 | | -#endif |
77 | | -/** Size of the circular transmit buffer, must be power of 2 */ |
78 | | -#ifndef UART_TX_BUFFER_SIZE |
79 | | -#define UART_TX_BUFFER_SIZE 32 |
80 | | -#endif |
81 | | - |
82 | | -/* test if the size of the circular buffers fits into SRAM */ |
83 | | -#if ( (UART_RX_BUFFER_SIZE+UART_TX_BUFFER_SIZE) >= (RAMEND-0x60 ) ) |
84 | | -#error "size of UART_RX_BUFFER_SIZE + UART_TX_BUFFER_SIZE larger than size of SRAM" |
85 | | -#endif |
86 | | - |
87 | | -/* |
88 | | -** high byte error return code of uart_getc() |
89 | | -*/ |
90 | | -#define UART_FRAME_ERROR 0x0800 /* Framing Error by UART */ |
91 | | -#define UART_OVERRUN_ERROR 0x0400 /* Overrun condition by UART */ |
92 | | -#define UART_BUFFER_OVERFLOW 0x0200 /* receive ringbuffer overflow */ |
93 | | -#define UART_NO_DATA 0x0100 /* no receive data available */ |
94 | | - |
95 | | - |
96 | | -/* |
97 | | -** function prototypes |
98 | | -*/ |
99 | | - |
100 | | -/** |
101 | | - @brief Initialize UART and set baudrate |
102 | | - @param baudrate Specify baudrate using macro UART_BAUD_SELECT() |
103 | | - @return none |
104 | | -*/ |
105 | | -extern void uart_init(unsigned int baudrate); |
106 | | - |
107 | | - |
108 | | -/** |
109 | | - * @brief Get received byte from ringbuffer |
110 | | - * |
111 | | - * Returns in the lower byte the received character and in the |
112 | | - * higher byte the last receive error. |
113 | | - * UART_NO_DATA is returned when no data is available. |
114 | | - * |
115 | | - * @param void |
116 | | - * @return lower byte: received byte from ringbuffer |
117 | | - * @return higher byte: last receive status |
118 | | - * - \b 0 successfully received data from UART |
119 | | - * - \b UART_NO_DATA |
120 | | - * <br>no receive data available |
121 | | - * - \b UART_BUFFER_OVERFLOW |
122 | | - * <br>Receive ringbuffer overflow. |
123 | | - * We are not reading the receive buffer fast enough, |
124 | | - * one or more received character have been dropped |
125 | | - * - \b UART_OVERRUN_ERROR |
126 | | - * <br>Overrun condition by UART. |
127 | | - * A character already present in the UART UDR register was |
128 | | - * not read by the interrupt handler before the next character arrived, |
129 | | - * one or more received characters have been dropped. |
130 | | - * - \b UART_FRAME_ERROR |
131 | | - * <br>Framing Error by UART |
132 | | - */ |
133 | | -extern unsigned int uart_getc(void); |
134 | | - |
135 | | - |
136 | | -/** |
137 | | - * @brief Put byte to ringbuffer for transmitting via UART |
138 | | - * @param data byte to be transmitted |
139 | | - * @return none |
140 | | - */ |
141 | | -extern void uart_putc(unsigned char data); |
142 | | - |
143 | | - |
144 | | -/** |
145 | | - * @brief Put string to ringbuffer for transmitting via UART |
146 | | - * |
147 | | - * The string is buffered by the uart library in a circular buffer |
148 | | - * and one character at a time is transmitted to the UART using interrupts. |
149 | | - * Blocks if it can not write the whole string into the circular buffer. |
150 | | - * |
151 | | - * @param s string to be transmitted |
152 | | - * @return none |
153 | | - */ |
154 | | -extern void uart_puts(const char *s ); |
155 | | - |
156 | | - |
157 | | -/** |
158 | | - * @brief Put string from program memory to ringbuffer for transmitting via UART. |
159 | | - * |
160 | | - * The string is buffered by the uart library in a circular buffer |
161 | | - * and one character at a time is transmitted to the UART using interrupts. |
162 | | - * Blocks if it can not write the whole string into the circular buffer. |
163 | | - * |
164 | | - * @param s program memory string to be transmitted |
165 | | - * @return none |
166 | | - * @see uart_puts_P |
167 | | - */ |
168 | | -extern void uart_puts_p(const char *s ); |
169 | | - |
170 | | -/** |
171 | | - * @brief Macro to automatically put a string constant into program memory |
172 | | - */ |
173 | | -#define uart_puts_P(__s) uart_puts_p(PSTR(__s)) |
174 | | - |
175 | | - |
176 | | - |
177 | | -/** @brief Initialize USART1 (only available on selected ATmegas) @see uart_init */ |
178 | | -extern void uart1_init(unsigned int baudrate); |
179 | | -/** @brief Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc */ |
180 | | -extern unsigned int uart1_getc(void); |
181 | | -/** @brief Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc */ |
182 | | -extern void uart1_putc(unsigned char data); |
183 | | -/** @brief Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts */ |
184 | | -extern void uart1_puts(const char *s ); |
185 | | -/** @brief Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p */ |
186 | | -extern void uart1_puts_p(const char *s ); |
187 | | -/** @brief Macro to automatically put a string constant into program memory */ |
188 | | -#define uart1_puts_P(__s) uart1_puts_p(PSTR(__s)) |
189 | | - |
190 | | -/**@}*/ |
191 | | - |
192 | | -#include "uart.c" |
193 | | -#endif // UART_H |
194 | | -
|
| 1 | +#ifndef UART_H |
| 2 | +#define UART_H |
| 3 | +/************************************************************************ |
| 4 | +Title: Interrupt UART library with receive/transmit circular buffers |
| 5 | +Author: Peter Fleury <[email protected]> http://jump.to/fleury |
| 6 | +File: $Id: uart.h,v 1.8.2.1 2007/07/01 11:14:38 peter Exp $ |
| 7 | +Software: AVR-GCC 4.1, AVR Libc 1.4 |
| 8 | +Hardware: any AVR with built-in UART, tested on AT90S8515 & ATmega8 at 4 Mhz |
| 9 | +License: GNU General Public License |
| 10 | +Usage: see Doxygen manual |
| 11 | +
|
| 12 | +LICENSE: |
| 13 | + Copyright (C) 2006 Peter Fleury |
| 14 | +
|
| 15 | + This program is free software; you can redistribute it and/or modify |
| 16 | + it under the terms of the GNU General Public License as published by |
| 17 | + the Free Software Foundation; either version 2 of the License, or |
| 18 | + any later version. |
| 19 | +
|
| 20 | + This program is distributed in the hope that it will be useful, |
| 21 | + but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 22 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 23 | + GNU General Public License for more details. |
| 24 | + |
| 25 | +************************************************************************/ |
| 26 | + |
| 27 | +/** |
| 28 | + * @defgroup pfleury_uart UART Library |
| 29 | + * @code #include <uart.h> @endcode |
| 30 | + * |
| 31 | + * @brief Interrupt UART library using the built-in UART with transmit and receive circular buffers. |
| 32 | + * |
| 33 | + * This library can be used to transmit and receive data through the built in UART. |
| 34 | + * |
| 35 | + * An interrupt is generated when the UART has finished transmitting or |
| 36 | + * receiving a byte. The interrupt handling routines use circular buffers |
| 37 | + * for buffering received and transmitted data. |
| 38 | + * |
| 39 | + * The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE constants define |
| 40 | + * the size of the circular buffers in bytes. Note that these constants must be a power of 2. |
| 41 | + * You may need to adapt this constants to your target and your application by adding |
| 42 | + * CDEFS += -DUART_RX_BUFFER_SIZE=nn -DUART_RX_BUFFER_SIZE=nn to your Makefile. |
| 43 | + * |
| 44 | + * @note Based on Atmel Application Note AVR306 |
| 45 | + * @author Peter Fleury [email protected] http://jump.to/fleury |
| 46 | + */ |
| 47 | + |
| 48 | +/**@{*/ |
| 49 | + |
| 50 | + |
| 51 | +#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304 |
| 52 | +#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !" |
| 53 | +#endif |
| 54 | + |
| 55 | + |
| 56 | +/* |
| 57 | +** constants and macros |
| 58 | +*/ |
| 59 | + |
| 60 | +/** @brief UART Baudrate Expression |
| 61 | + * @param xtalcpu system clock in Mhz, e.g. 4000000L for 4Mhz |
| 62 | + * @param baudrate baudrate in bps, e.g. 1200, 2400, 9600 |
| 63 | + */ |
| 64 | +#define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu)/((baudRate)*16l)-1) |
| 65 | + |
| 66 | +/** @brief UART Baudrate Expression for ATmega double speed mode |
| 67 | + * @param xtalcpu system clock in Mhz, e.g. 4000000L for 4Mhz |
| 68 | + * @param baudrate baudrate in bps, e.g. 1200, 2400, 9600 |
| 69 | + */ |
| 70 | +#define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) (((xtalCpu)/((baudRate)*8l)-1)|0x8000) |
| 71 | + |
| 72 | + |
| 73 | +/** Size of the circular receive buffer, must be power of 2 */ |
| 74 | +#ifndef UART_RX_BUFFER_SIZE |
| 75 | +#define UART_RX_BUFFER_SIZE 32 |
| 76 | +#endif |
| 77 | +/** Size of the circular transmit buffer, must be power of 2 */ |
| 78 | +#ifndef UART_TX_BUFFER_SIZE |
| 79 | +#define UART_TX_BUFFER_SIZE 32 |
| 80 | +#endif |
| 81 | + |
| 82 | +/* test if the size of the circular buffers fits into SRAM */ |
| 83 | +#if ( (UART_RX_BUFFER_SIZE+UART_TX_BUFFER_SIZE) >= (RAMEND-0x60 ) ) |
| 84 | +#error "size of UART_RX_BUFFER_SIZE + UART_TX_BUFFER_SIZE larger than size of SRAM" |
| 85 | +#endif |
| 86 | + |
| 87 | +/* |
| 88 | +** high byte error return code of uart_getc() |
| 89 | +*/ |
| 90 | +#define UART_FRAME_ERROR 0x0800 /* Framing Error by UART */ |
| 91 | +#define UART_OVERRUN_ERROR 0x0400 /* Overrun condition by UART */ |
| 92 | +#define UART_BUFFER_OVERFLOW 0x0200 /* receive ringbuffer overflow */ |
| 93 | +#define UART_NO_DATA 0x0100 /* no receive data available */ |
| 94 | + |
| 95 | + |
| 96 | +/* |
| 97 | +** function prototypes |
| 98 | +*/ |
| 99 | + |
| 100 | +/** |
| 101 | + @brief Initialize UART and set baudrate |
| 102 | + @param baudrate Specify baudrate using macro UART_BAUD_SELECT() |
| 103 | + @return none |
| 104 | +*/ |
| 105 | +extern void uart_init(unsigned int baudrate); |
| 106 | + |
| 107 | + |
| 108 | +/** |
| 109 | + * @brief Get received byte from ringbuffer |
| 110 | + * |
| 111 | + * Returns in the lower byte the received character and in the |
| 112 | + * higher byte the last receive error. |
| 113 | + * UART_NO_DATA is returned when no data is available. |
| 114 | + * |
| 115 | + * @param void |
| 116 | + * @return lower byte: received byte from ringbuffer |
| 117 | + * @return higher byte: last receive status |
| 118 | + * - \b 0 successfully received data from UART |
| 119 | + * - \b UART_NO_DATA |
| 120 | + * <br>no receive data available |
| 121 | + * - \b UART_BUFFER_OVERFLOW |
| 122 | + * <br>Receive ringbuffer overflow. |
| 123 | + * We are not reading the receive buffer fast enough, |
| 124 | + * one or more received character have been dropped |
| 125 | + * - \b UART_OVERRUN_ERROR |
| 126 | + * <br>Overrun condition by UART. |
| 127 | + * A character already present in the UART UDR register was |
| 128 | + * not read by the interrupt handler before the next character arrived, |
| 129 | + * one or more received characters have been dropped. |
| 130 | + * - \b UART_FRAME_ERROR |
| 131 | + * <br>Framing Error by UART |
| 132 | + */ |
| 133 | +extern unsigned int uart_getc(void); |
| 134 | + |
| 135 | + |
| 136 | +/** |
| 137 | + * @brief Put byte to ringbuffer for transmitting via UART |
| 138 | + * @param data byte to be transmitted |
| 139 | + * @return none |
| 140 | + */ |
| 141 | +extern void uart_putc(unsigned char data); |
| 142 | + |
| 143 | + |
| 144 | +/** |
| 145 | + * @brief Put string to ringbuffer for transmitting via UART |
| 146 | + * |
| 147 | + * The string is buffered by the uart library in a circular buffer |
| 148 | + * and one character at a time is transmitted to the UART using interrupts. |
| 149 | + * Blocks if it can not write the whole string into the circular buffer. |
| 150 | + * |
| 151 | + * @param s string to be transmitted |
| 152 | + * @return none |
| 153 | + */ |
| 154 | +extern void uart_puts(const char *s ); |
| 155 | + |
| 156 | + |
| 157 | +/** |
| 158 | + * @brief Put string from program memory to ringbuffer for transmitting via UART. |
| 159 | + * |
| 160 | + * The string is buffered by the uart library in a circular buffer |
| 161 | + * and one character at a time is transmitted to the UART using interrupts. |
| 162 | + * Blocks if it can not write the whole string into the circular buffer. |
| 163 | + * |
| 164 | + * @param s program memory string to be transmitted |
| 165 | + * @return none |
| 166 | + * @see uart_puts_P |
| 167 | + */ |
| 168 | +extern void uart_puts_p(const char *s ); |
| 169 | + |
| 170 | +/** |
| 171 | + * @brief Macro to automatically put a string constant into program memory |
| 172 | + */ |
| 173 | +#define uart_puts_P(__s) uart_puts_p(PSTR(__s)) |
| 174 | + |
| 175 | + |
| 176 | + |
| 177 | +/** @brief Initialize USART1 (only available on selected ATmegas) @see uart_init */ |
| 178 | +extern void uart1_init(unsigned int baudrate); |
| 179 | +/** @brief Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc */ |
| 180 | +extern unsigned int uart1_getc(void); |
| 181 | +/** @brief Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc */ |
| 182 | +extern void uart1_putc(unsigned char data); |
| 183 | +/** @brief Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts */ |
| 184 | +extern void uart1_puts(const char *s ); |
| 185 | +/** @brief Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p */ |
| 186 | +extern void uart1_puts_p(const char *s ); |
| 187 | +/** @brief Macro to automatically put a string constant into program memory */ |
| 188 | +#define uart1_puts_P(__s) uart1_puts_p(PSTR(__s)) |
| 189 | + |
| 190 | +/**@}*/ |
| 191 | + |
| 192 | +#include "uart.c" |
| 193 | +#endif // UART_H |
| 194 | + |
0 commit comments