Peter Fleury uart lib added. Init call added to the project main files.
This commit is contained in:
parent
8b8727970d
commit
fa7ad1ad90
9 changed files with 3385 additions and 3 deletions
|
@ -104,7 +104,10 @@ void SetupHardware(void)
|
||||||
PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;
|
PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Hardware Initialization */
|
/* UART Hardware Initialization */
|
||||||
|
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
|
||||||
|
|
||||||
|
/* USB Hardware Initialization */
|
||||||
USB_Init();
|
USB_Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include <avr/wdt.h>
|
#include <avr/wdt.h>
|
||||||
#include <avr/power.h>
|
#include <avr/power.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "Descriptors.h"
|
#include "Descriptors.h"
|
||||||
|
@ -48,8 +49,14 @@
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
#include <LUFA/Platform/Platform.h>
|
#include <LUFA/Platform/Platform.h>
|
||||||
|
|
||||||
|
#include "uart/uart.h"
|
||||||
|
|
||||||
uint8_t error_mask = 0x00;
|
uint8_t error_mask = 0x00;
|
||||||
|
|
||||||
|
/* UART definitions: */
|
||||||
|
|
||||||
|
#define UART_BAUD_RATE 115200
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
|
|
||||||
#define SET_ERR_MASK(m) error_mask = m
|
#define SET_ERR_MASK(m) error_mask = m
|
||||||
|
|
|
@ -18,9 +18,9 @@ F_CPU = 16000000UL
|
||||||
F_USB = $(F_CPU)
|
F_USB = $(F_CPU)
|
||||||
OPTIMIZATION = s
|
OPTIMIZATION = s
|
||||||
TARGET = USB2SerialMux
|
TARGET = USB2SerialMux
|
||||||
SRC = $(TARGET).c Descriptors.c $(LUFA_SRC_USB)
|
SRC = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) uart/uart.c
|
||||||
LUFA_PATH = ../LUFA
|
LUFA_PATH = ../LUFA
|
||||||
CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/
|
CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -Iuart/
|
||||||
LD_FLAGS =
|
LD_FLAGS =
|
||||||
|
|
||||||
# Default target
|
# Default target
|
||||||
|
|
338
src/uart/Makefile.uart
Normal file
338
src/uart/Makefile.uart
Normal file
|
@ -0,0 +1,338 @@
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Makefile to compile and link the UART library and test program
|
||||||
|
# Author: Peter Fleury
|
||||||
|
# File: $Id: Makefile.uart,v 1.7 2015/09/05 19:04:44 peter Exp $
|
||||||
|
#
|
||||||
|
# Adjust MCU and F_CPU below to your AVR target
|
||||||
|
#
|
||||||
|
# Adjust the size of the receive and transmit ringbuffer in bytes using the
|
||||||
|
# defines -DUART_RX_BUFFER_SIZE=<size in bytes> and -DUART_TX_BUFFER_SIZE=<size in bytes>
|
||||||
|
# in the CDEFS section below
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# usage:
|
||||||
|
#
|
||||||
|
# make = build software
|
||||||
|
# make clean = Clean out built project files
|
||||||
|
# make program = Download the hex file to the device, using avrdude.
|
||||||
|
# Please customize the avrdude settings below first!
|
||||||
|
#
|
||||||
|
# make filename.s = Just compile filename.c into the assembler code only.
|
||||||
|
# make filename.i = Create a preprocessed source file
|
||||||
|
#
|
||||||
|
# To rebuild project do "make clean" then "make"
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# MCU name
|
||||||
|
MCU = atmega8
|
||||||
|
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
# processor frequency. You can then use this symbol in your source code to
|
||||||
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
|
# automatically to create a 32-bit value in your source code.
|
||||||
|
F_CPU = 7372800
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Target file name (without extension).
|
||||||
|
TARGET = test_uart
|
||||||
|
|
||||||
|
|
||||||
|
# List C source files here. (C dependencies are automatically generated.)
|
||||||
|
SRC = $(TARGET).c uart.c
|
||||||
|
|
||||||
|
|
||||||
|
# List Assembler source files here.
|
||||||
|
# Make them always end in a capital .S. Files ending in a lowercase .s
|
||||||
|
# will not be considered source files but generated files (assembler
|
||||||
|
# output from the compiler), and will be deleted upon "make clean"!
|
||||||
|
# Even though the DOS/Win* filesystem matches both .s and .S the same,
|
||||||
|
# it will preserve the spelling of the filenames, and gcc itself does
|
||||||
|
# care about how the name is spelled on its command-line.
|
||||||
|
#ASRC =
|
||||||
|
|
||||||
|
|
||||||
|
# List any extra directories to look for include files here.
|
||||||
|
# Each directory must be seperated by a space.
|
||||||
|
# Use forward slashes for directory separators.
|
||||||
|
# For a directory that has spaces, enclose it in quotes.
|
||||||
|
EXTRAINCDIRS =
|
||||||
|
|
||||||
|
|
||||||
|
#specify alternate location of sources files
|
||||||
|
# (unlike VPATH= which is a search path for all prerequisites, not just source files)
|
||||||
|
#vpath %.c /<directory>/
|
||||||
|
#vpath %.S /<directory>/
|
||||||
|
|
||||||
|
|
||||||
|
# Optimization level, can be [0, 1, 2, 3, s].
|
||||||
|
# 0 = turn off optimization. s = optimize for size.
|
||||||
|
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
||||||
|
OPT = s
|
||||||
|
|
||||||
|
|
||||||
|
# Place -D or -U options here
|
||||||
|
# uncomment and adapt these line if you want different UART library buffer size
|
||||||
|
#CDEFS += -DUART_RX_BUFFER_SIZE=128
|
||||||
|
#CDEFS += -DUART_TX_BUFFER_SIZE=128
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Place -I options here
|
||||||
|
CINCS =
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Compiler Options ----------------
|
||||||
|
# -gdwarf-2: generate debugging information
|
||||||
|
# -O*: optimization level
|
||||||
|
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||||
|
# -Wall...: warning level
|
||||||
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
|
# -adhlns...: create assembler listing
|
||||||
|
CFLAGS = -DF_CPU=$(F_CPU)UL
|
||||||
|
CFLAGS += $(CDEFS) $(CINCS)
|
||||||
|
CFLAGS += -I. $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||||
|
CFLAGS += -std=gnu99
|
||||||
|
CFLAGS += -gdwarf-2
|
||||||
|
CFLAGS += -O$(OPT)
|
||||||
|
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
|
||||||
|
CFLAGS += -Wall -Wstrict-prototypes
|
||||||
|
CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
|
||||||
|
CFLAGS += -save-temps
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Assembler Options ----------------
|
||||||
|
# -Wa,...: tell GCC to pass this to the assembler.
|
||||||
|
# -adhlns=$(<:.S=.lst) create listing
|
||||||
|
# -gdwarf-2: generate debugging information
|
||||||
|
ASFLAGS = -DF_CPU=$(F_CPU)UL -x assembler-with-cpp -Wa,-gdwarf2
|
||||||
|
|
||||||
|
#---------------- Library Options ----------------
|
||||||
|
# Minimalistic printf version
|
||||||
|
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
||||||
|
|
||||||
|
# Floating point printf version (requires MATH_LIB = -lm below)
|
||||||
|
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
||||||
|
|
||||||
|
# If this is left blank, then it will use the Standard printf version.
|
||||||
|
PRINTF_LIB =
|
||||||
|
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
||||||
|
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
|
# Minimalistic scanf version
|
||||||
|
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
||||||
|
|
||||||
|
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
||||||
|
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
||||||
|
|
||||||
|
# If this is left blank, then it will use the Standard scanf version.
|
||||||
|
SCANF_LIB =
|
||||||
|
#SCANF_LIB = $(SCANF_LIB_MIN)
|
||||||
|
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
||||||
|
|
||||||
|
|
||||||
|
MATH_LIB = -lm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- External Memory Options ----------------
|
||||||
|
|
||||||
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
|
# used for variables (.data/.bss) and heap (malloc()).
|
||||||
|
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
|
# only used for heap (malloc()).
|
||||||
|
#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
|
EXTMEMOPTS =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Linker Options ----------------
|
||||||
|
# -Wl,...: tell GCC to pass this to linker.
|
||||||
|
# -Map: create map file
|
||||||
|
# --cref: add cross reference to map file
|
||||||
|
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
||||||
|
LDFLAGS += $(EXTMEMOPTS)
|
||||||
|
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#---------------- Programming Options (avrdude) ----------------
|
||||||
|
|
||||||
|
# Programming hardware: Type: avrdude -c ? to get a full listing.
|
||||||
|
AVRDUDE_PROGRAMMER = usbasp
|
||||||
|
|
||||||
|
# usb, com1 = serial port, lpt1 = parallel port
|
||||||
|
AVRDUDE_PORT = USB
|
||||||
|
|
||||||
|
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
||||||
|
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
||||||
|
|
||||||
|
# Uncomment the following if you do /not/ wish a verification to be performed after programming the device.
|
||||||
|
#AVRDUDE_NO_VERIFY = -V
|
||||||
|
|
||||||
|
# Disable save mode for fuses
|
||||||
|
AVRDUDE_NO_SAFEMODE = -u
|
||||||
|
|
||||||
|
# Uncomment the following if you want avrdude's erase cycle counter.
|
||||||
|
# Note that this counter needs to be initialized first using -Yn,
|
||||||
|
#AVRDUDE_ERASE_COUNTER = -y
|
||||||
|
|
||||||
|
# Increase verbosity level.
|
||||||
|
#AVRDUDE_VERBOSE = -v -v
|
||||||
|
|
||||||
|
# Adjust programming speed of USBasp
|
||||||
|
# no -B switch 375khz (default)
|
||||||
|
# -B 2000 500 hz
|
||||||
|
# -B 1000 1khz
|
||||||
|
# -B 500 2khz
|
||||||
|
# -B 250 4khz
|
||||||
|
# -B 125 8 khz
|
||||||
|
# -B 62 16khz
|
||||||
|
# -B 31 32khz * the cutoff for bit banged isp
|
||||||
|
# -B 10 93.75 khz
|
||||||
|
# -B 5 187.5 khz
|
||||||
|
# -B 2 375 khz
|
||||||
|
# -B 1 750 khz
|
||||||
|
# -B .5 1.5mhz
|
||||||
|
#AVRDUDE_SPEED = -B .5
|
||||||
|
|
||||||
|
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
||||||
|
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
||||||
|
AVRDUDE_FLAGS += $(AVRDUDE_NO_SAFEMODE)
|
||||||
|
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
||||||
|
AVRDUDE_FLAGS += $(AVRDUDE_SPEED)
|
||||||
|
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#============================================================================
|
||||||
|
# Output format. (can be srec, ihex, binary)
|
||||||
|
FORMAT = ihex
|
||||||
|
|
||||||
|
# Define programs and commands.
|
||||||
|
#SHELL = win-bash
|
||||||
|
CC = avr-gcc
|
||||||
|
OBJCOPY = avr-objcopy
|
||||||
|
OBJDUMP = avr-objdump
|
||||||
|
SIZE = avr-size
|
||||||
|
NM = avr-nm
|
||||||
|
AVRDUDE = avrdude
|
||||||
|
REMOVE = rm -rf
|
||||||
|
COPY = cp
|
||||||
|
WINSHELL = cmd
|
||||||
|
|
||||||
|
|
||||||
|
# Define Messages
|
||||||
|
MSG_FLASH = Creating load file for Flash:
|
||||||
|
MSG_EEPROM = Creating load file for EEPROM:
|
||||||
|
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
||||||
|
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
||||||
|
MSG_LINKING = Linking:
|
||||||
|
MSG_COMPILING = Compiling:
|
||||||
|
MSG_ASSEMBLING = Assembling:
|
||||||
|
MSG_CLEANING = Cleaning project:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Define all object files.
|
||||||
|
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
|
||||||
|
|
||||||
|
# Define all listing files.
|
||||||
|
LST = $(SRC:.c=.lst) $(ASRC:.S=.lst)
|
||||||
|
|
||||||
|
|
||||||
|
# Compiler flags to generate dependency files.
|
||||||
|
GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d
|
||||||
|
|
||||||
|
|
||||||
|
# Combine all necessary flags and optional flags.
|
||||||
|
# Add target processor to flags.
|
||||||
|
ALL_CFLAGS = -mmcu=$(MCU) $(CFLAGS) $(GENDEPFLAGS)
|
||||||
|
ALL_ASFLAGS = -mmcu=$(MCU) -I. $(ASFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
# Default target.
|
||||||
|
all: gccversion $(TARGET).elf $(TARGET).hex $(TARGET).eep $(TARGET).lss $(TARGET).sym size
|
||||||
|
|
||||||
|
|
||||||
|
# Display compiler version information.
|
||||||
|
gccversion :
|
||||||
|
@echo $(OBJ1)
|
||||||
|
@$(CC) --version
|
||||||
|
|
||||||
|
|
||||||
|
# Create final output files (.hex, .eep) from ELF output file.
|
||||||
|
%.hex: %.elf
|
||||||
|
@echo $(MSG_FLASH) $@
|
||||||
|
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
|
||||||
|
|
||||||
|
%.eep: %.elf
|
||||||
|
@echo $(MSG_EEPROM) $@
|
||||||
|
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O $(FORMAT) $< $@
|
||||||
|
|
||||||
|
# Create extended listing file from ELF output file.
|
||||||
|
%.lss: %.elf
|
||||||
|
@echo $(MSG_EXTENDED_LISTING) $@
|
||||||
|
$(OBJDUMP) -h -S $< > $@
|
||||||
|
|
||||||
|
# Create a symbol table from ELF output file.
|
||||||
|
%.sym: %.elf
|
||||||
|
@echo $(MSG_SYMBOL_TABLE) $@
|
||||||
|
$(NM) -n $< > $@
|
||||||
|
|
||||||
|
# Link: create ELF output file from object files.
|
||||||
|
.SECONDARY : $(TARGET).elf
|
||||||
|
.PRECIOUS : $(OBJ)
|
||||||
|
%.elf: $(OBJ)
|
||||||
|
@echo $(MSG_LINKING) $@
|
||||||
|
$(CC) -mmcu=$(MCU) $(LDFLAGS) $^ --output $(@F)
|
||||||
|
|
||||||
|
# Compile: create object files from C source files.
|
||||||
|
%.o : %.c
|
||||||
|
@echo $(MSG_COMPILING) $<
|
||||||
|
$(CC) -c $(ALL_CFLAGS) $< -o $(@F)
|
||||||
|
|
||||||
|
# Compile: create assembler files from C source files.
|
||||||
|
%.s : %.c
|
||||||
|
$(CC) -S $(ALL_CFLAGS) $< -o $(@F)
|
||||||
|
|
||||||
|
# Assemble: create object files from assembler source files.
|
||||||
|
%.o : %.S
|
||||||
|
@echo $(MSG_ASSEMBLING) $<
|
||||||
|
$(CC) -c $(ALL_ASFLAGS) $< -o $(@F)
|
||||||
|
|
||||||
|
# Create preprocessed source for use in sending a bug report.
|
||||||
|
%.i : %.c
|
||||||
|
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $(@F)
|
||||||
|
|
||||||
|
|
||||||
|
# Display size of file.
|
||||||
|
size: ${TARGET}.elf
|
||||||
|
@avr-size -C --mcu=${MCU} ${TARGET}.elf
|
||||||
|
|
||||||
|
|
||||||
|
# Program the device.
|
||||||
|
program: $(TARGET).hex $(TARGET).eep
|
||||||
|
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
||||||
|
|
||||||
|
|
||||||
|
# Delete all generated files.
|
||||||
|
clean:
|
||||||
|
@echo $(MSG_CLEANING)
|
||||||
|
$(REMOVE) $(TARGET).hex $(TARGET).eep $(TARGET).cof $(TARGET).elf $(TARGET).map $(TARGET).sym $(TARGET).lss $(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(SRC:.c=.i) .dep/
|
||||||
|
|
||||||
|
|
||||||
|
# Include the dependency files.
|
||||||
|
#-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
||||||
|
-include $(shell mkdir .dep 2>NUL) $(wildcard .dep/*)
|
||||||
|
|
||||||
|
|
||||||
|
# Listing of phony targets.
|
||||||
|
.PHONY : all size gccversion clean program
|
||||||
|
|
1449
src/uart/doxygen.css
Normal file
1449
src/uart/doxygen.css
Normal file
File diff suppressed because it is too large
Load diff
472
src/uart/manual_uart.html
Normal file
472
src/uart/manual_uart.html
Normal file
|
@ -0,0 +1,472 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
|
<meta name="generator" content="Doxygen 1.8.9.1"/>
|
||||||
|
<title>AVR-GCC Libraries: UART Library <uart.h></title>
|
||||||
|
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script type="text/javascript" src="jquery.js"></script>
|
||||||
|
<script type="text/javascript" src="dynsections.js"></script>
|
||||||
|
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||||
|
<div id="titlearea">
|
||||||
|
<table cellspacing="0" cellpadding="0">
|
||||||
|
<tbody>
|
||||||
|
<tr style="height: 56px;">
|
||||||
|
<td style="padding-left: 0.5em;">
|
||||||
|
<div id="projectname">AVR-GCC Libraries
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!-- end header part -->
|
||||||
|
<!-- Generated by Doxygen 1.8.9.1 -->
|
||||||
|
<div id="navrow1" class="tabs">
|
||||||
|
<ul class="tablist">
|
||||||
|
<li><a href="index.html"><span>Main Page</span></a></li>
|
||||||
|
<li><a href="modules.html"><span>Modules</span></a></li>
|
||||||
|
<li><a href="files.html"><span>Files</span></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div><!-- top -->
|
||||||
|
<div class="header">
|
||||||
|
<div class="summary">
|
||||||
|
<a href="#define-members">Macros</a> |
|
||||||
|
<a href="#func-members">Functions</a> </div>
|
||||||
|
<div class="headertitle">
|
||||||
|
<div class="title">UART Library <uart.h></div> </div>
|
||||||
|
</div><!--header-->
|
||||||
|
<div class="contents">
|
||||||
|
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
|
||||||
|
<p>Interrupt UART library using the built-in UART with transmit and receive circular buffers. </p>
|
||||||
|
<div class="fragment"><div class="line"><span class="preprocessor">#include <<a class="code" href="uart_8h.html">uart.h</a>></span> </div>
|
||||||
|
</div><!-- fragment --><p>This library can be used to transmit and receive data through the built in UART.</p>
|
||||||
|
<p>An interrupt is generated when the UART has finished transmitting or receiving a byte. The interrupt handling routines use circular buffers for buffering received and transmitted data.</p>
|
||||||
|
<p>The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE constants define the size of the circular buffers in bytes. Note that these constants must be a power of 2. You may need to adapt these constants to your target and your application by adding CDEFS += -DUART_RX_BUFFER_SIZE=nn -DUART_TX_BUFFER_SIZE=nn to your Makefile.</p>
|
||||||
|
<dl class="section note"><dt>Note</dt><dd>Based on Atmel Application Note AVR306 </dd></dl>
|
||||||
|
<dl class="section author"><dt>Author</dt><dd>Peter Fleury <a href="#" onclick="location.href='mai'+'lto:'+'pfl'+'eu'+'ry@'+'gm'+'x.c'+'h'; return false;">pfleu<span style="display: none;">.nosp@m.</span>ry@g<span style="display: none;">.nosp@m.</span>mx.ch</a> <a href="http://tinyurl.com/peterfleury">http://tinyurl.com/peterfleury</a> </dd></dl>
|
||||||
|
<dl class="section copyright"><dt>Copyright</dt><dd>(C) 2015 Peter Fleury, GNU General Public License Version 3 </dd></dl>
|
||||||
|
<table class="memberdecls">
|
||||||
|
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
|
||||||
|
Macros</h2></td></tr>
|
||||||
|
<tr class="memitem:ga367ff7b5de225ed936a63239ad4adb0b"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#ga367ff7b5de225ed936a63239ad4adb0b">UART_BAUD_SELECT</a>(baudRate, xtalCpu)   (((xtalCpu) + 8UL * (baudRate)) / (16UL * (baudRate)) -1UL)</td></tr>
|
||||||
|
<tr class="memdesc:ga367ff7b5de225ed936a63239ad4adb0b"><td class="mdescLeft"> </td><td class="mdescRight">UART Baudrate Expression. <a href="#ga367ff7b5de225ed936a63239ad4adb0b">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:ga367ff7b5de225ed936a63239ad4adb0b"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:ga1a02d45130520cb651ab313e69039382"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#ga1a02d45130520cb651ab313e69039382">UART_BAUD_SELECT_DOUBLE_SPEED</a>(baudRate, xtalCpu)   ( ((((xtalCpu) + 4UL * (baudRate)) / (8UL * (baudRate)) -1UL)) | 0x8000)</td></tr>
|
||||||
|
<tr class="memdesc:ga1a02d45130520cb651ab313e69039382"><td class="mdescLeft"> </td><td class="mdescRight">UART Baudrate Expression for ATmega double speed mode. <a href="#ga1a02d45130520cb651ab313e69039382">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:ga1a02d45130520cb651ab313e69039382"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:ga5bdd6772c246436bb14377095de79b31"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#ga5bdd6772c246436bb14377095de79b31">UART_RX_BUFFER_SIZE</a>   32</td></tr>
|
||||||
|
<tr class="memdesc:ga5bdd6772c246436bb14377095de79b31"><td class="mdescLeft"> </td><td class="mdescRight">Size of the circular receive buffer, must be power of 2. <a href="#ga5bdd6772c246436bb14377095de79b31">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:ga5bdd6772c246436bb14377095de79b31"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:ga05f5d709605c6317c97e4974bec3402a"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#ga05f5d709605c6317c97e4974bec3402a">UART_TX_BUFFER_SIZE</a>   32</td></tr>
|
||||||
|
<tr class="memdesc:ga05f5d709605c6317c97e4974bec3402a"><td class="mdescLeft"> </td><td class="mdescRight">Size of the circular transmit buffer, must be power of 2. <a href="#ga05f5d709605c6317c97e4974bec3402a">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:ga05f5d709605c6317c97e4974bec3402a"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:gabcdb1041d763560cd8f8e722370dfd37"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gabcdb1041d763560cd8f8e722370dfd37"></a>
|
||||||
|
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#gabcdb1041d763560cd8f8e722370dfd37">UART_FRAME_ERROR</a>   0x1000</td></tr>
|
||||||
|
<tr class="memdesc:gabcdb1041d763560cd8f8e722370dfd37"><td class="mdescLeft"> </td><td class="mdescRight">Framing Error by UART. <br /></td></tr>
|
||||||
|
<tr class="separator:gabcdb1041d763560cd8f8e722370dfd37"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:ga3183177e3613d8785d8cc8516931beb6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga3183177e3613d8785d8cc8516931beb6"></a>
|
||||||
|
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#ga3183177e3613d8785d8cc8516931beb6">UART_OVERRUN_ERROR</a>   0x0800</td></tr>
|
||||||
|
<tr class="memdesc:ga3183177e3613d8785d8cc8516931beb6"><td class="mdescLeft"> </td><td class="mdescRight">Overrun condition by UART. <br /></td></tr>
|
||||||
|
<tr class="separator:ga3183177e3613d8785d8cc8516931beb6"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:ga946e3d317937e003d2057bf19e96dd1d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga946e3d317937e003d2057bf19e96dd1d"></a>
|
||||||
|
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#ga946e3d317937e003d2057bf19e96dd1d">UART_PARITY_ERROR</a>   0x0400</td></tr>
|
||||||
|
<tr class="memdesc:ga946e3d317937e003d2057bf19e96dd1d"><td class="mdescLeft"> </td><td class="mdescRight">Parity Error by UART. <br /></td></tr>
|
||||||
|
<tr class="separator:ga946e3d317937e003d2057bf19e96dd1d"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:ga94758f3dad6864703b7417d3e40f11df"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga94758f3dad6864703b7417d3e40f11df"></a>
|
||||||
|
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#ga94758f3dad6864703b7417d3e40f11df">UART_BUFFER_OVERFLOW</a>   0x0200</td></tr>
|
||||||
|
<tr class="memdesc:ga94758f3dad6864703b7417d3e40f11df"><td class="mdescLeft"> </td><td class="mdescRight">receive ringbuffer overflow <br /></td></tr>
|
||||||
|
<tr class="separator:ga94758f3dad6864703b7417d3e40f11df"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:ga77ba544d423ff42d400220a05303f268"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga77ba544d423ff42d400220a05303f268"></a>
|
||||||
|
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#ga77ba544d423ff42d400220a05303f268">UART_NO_DATA</a>   0x0100</td></tr>
|
||||||
|
<tr class="memdesc:ga77ba544d423ff42d400220a05303f268"><td class="mdescLeft"> </td><td class="mdescRight">no receive data available <br /></td></tr>
|
||||||
|
<tr class="separator:ga77ba544d423ff42d400220a05303f268"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:gae9e143569df2285379bc55f9f5595bf9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gae9e143569df2285379bc55f9f5595bf9"></a>
|
||||||
|
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#gae9e143569df2285379bc55f9f5595bf9">uart_puts_P</a>(__s)   <a class="el" href="group__pfleury__uart.html#ga6d78b6744db6232f52b4616402036c2f">uart_puts_p</a>(PSTR(__s))</td></tr>
|
||||||
|
<tr class="memdesc:gae9e143569df2285379bc55f9f5595bf9"><td class="mdescLeft"> </td><td class="mdescRight">Macro to automatically put a string constant into program memory. <br /></td></tr>
|
||||||
|
<tr class="separator:gae9e143569df2285379bc55f9f5595bf9"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:gaabd7a5b0c15611ee9ecb2873cc9ee87a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaabd7a5b0c15611ee9ecb2873cc9ee87a"></a>
|
||||||
|
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#gaabd7a5b0c15611ee9ecb2873cc9ee87a">uart1_puts_P</a>(__s)   <a class="el" href="group__pfleury__uart.html#ga1e8074d0a2d5922601c5db2f9777ba79">uart1_puts_p</a>(PSTR(__s))</td></tr>
|
||||||
|
<tr class="memdesc:gaabd7a5b0c15611ee9ecb2873cc9ee87a"><td class="mdescLeft"> </td><td class="mdescRight">Macro to automatically put a string constant into program memory. <br /></td></tr>
|
||||||
|
<tr class="separator:gaabd7a5b0c15611ee9ecb2873cc9ee87a"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
</table><table class="memberdecls">
|
||||||
|
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
|
||||||
|
Functions</h2></td></tr>
|
||||||
|
<tr class="memitem:gac19a76bb7d446125734a67f9f4b68991"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#gac19a76bb7d446125734a67f9f4b68991">uart_init</a> (unsigned int baudrate)</td></tr>
|
||||||
|
<tr class="memdesc:gac19a76bb7d446125734a67f9f4b68991"><td class="mdescLeft"> </td><td class="mdescRight">Initialize UART and set baudrate. <a href="#gac19a76bb7d446125734a67f9f4b68991">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:gac19a76bb7d446125734a67f9f4b68991"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:gaefaab30a8338ec46a6be35b99b1b4f09"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#gaefaab30a8338ec46a6be35b99b1b4f09">uart_getc</a> (void)</td></tr>
|
||||||
|
<tr class="memdesc:gaefaab30a8338ec46a6be35b99b1b4f09"><td class="mdescLeft"> </td><td class="mdescRight">Get received byte from ringbuffer. <a href="#gaefaab30a8338ec46a6be35b99b1b4f09">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:gaefaab30a8338ec46a6be35b99b1b4f09"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:gad975221bc08b901e4c7ad69f9c9a97e2"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#gad975221bc08b901e4c7ad69f9c9a97e2">uart_putc</a> (unsigned char data)</td></tr>
|
||||||
|
<tr class="memdesc:gad975221bc08b901e4c7ad69f9c9a97e2"><td class="mdescLeft"> </td><td class="mdescRight">Put byte to ringbuffer for transmitting via UART. <a href="#gad975221bc08b901e4c7ad69f9c9a97e2">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:gad975221bc08b901e4c7ad69f9c9a97e2"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:gae52facc0a56086a365bb0018160d8d71"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#gae52facc0a56086a365bb0018160d8d71">uart_puts</a> (const char *s)</td></tr>
|
||||||
|
<tr class="memdesc:gae52facc0a56086a365bb0018160d8d71"><td class="mdescLeft"> </td><td class="mdescRight">Put string to ringbuffer for transmitting via UART. <a href="#gae52facc0a56086a365bb0018160d8d71">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:gae52facc0a56086a365bb0018160d8d71"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:ga6d78b6744db6232f52b4616402036c2f"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#ga6d78b6744db6232f52b4616402036c2f">uart_puts_p</a> (const char *s)</td></tr>
|
||||||
|
<tr class="memdesc:ga6d78b6744db6232f52b4616402036c2f"><td class="mdescLeft"> </td><td class="mdescRight">Put string from program memory to ringbuffer for transmitting via UART. <a href="#ga6d78b6744db6232f52b4616402036c2f">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:ga6d78b6744db6232f52b4616402036c2f"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:ga4db697cb5469fd70e794fa7df73a6d6a"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#ga4db697cb5469fd70e794fa7df73a6d6a">uart1_init</a> (unsigned int baudrate)</td></tr>
|
||||||
|
<tr class="memdesc:ga4db697cb5469fd70e794fa7df73a6d6a"><td class="mdescLeft"> </td><td class="mdescRight">Initialize USART1 (only available on selected ATmegas) <a href="#ga4db697cb5469fd70e794fa7df73a6d6a">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:ga4db697cb5469fd70e794fa7df73a6d6a"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:gaeb1405c641e5bc9b7224018f5e8d90de"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#gaeb1405c641e5bc9b7224018f5e8d90de">uart1_getc</a> (void)</td></tr>
|
||||||
|
<tr class="memdesc:gaeb1405c641e5bc9b7224018f5e8d90de"><td class="mdescLeft"> </td><td class="mdescRight">Get received byte of USART1 from ringbuffer. (only available on selected ATmega) <a href="#gaeb1405c641e5bc9b7224018f5e8d90de">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:gaeb1405c641e5bc9b7224018f5e8d90de"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:gab465f689d197fadfbacc374fc9411154"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#gab465f689d197fadfbacc374fc9411154">uart1_putc</a> (unsigned char data)</td></tr>
|
||||||
|
<tr class="memdesc:gab465f689d197fadfbacc374fc9411154"><td class="mdescLeft"> </td><td class="mdescRight">Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) <a href="#gab465f689d197fadfbacc374fc9411154">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:gab465f689d197fadfbacc374fc9411154"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:ga5568f8f3913b218fd4d0346af78831b2"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#ga5568f8f3913b218fd4d0346af78831b2">uart1_puts</a> (const char *s)</td></tr>
|
||||||
|
<tr class="memdesc:ga5568f8f3913b218fd4d0346af78831b2"><td class="mdescLeft"> </td><td class="mdescRight">Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) <a href="#ga5568f8f3913b218fd4d0346af78831b2">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:ga5568f8f3913b218fd4d0346af78831b2"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
<tr class="memitem:ga1e8074d0a2d5922601c5db2f9777ba79"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pfleury__uart.html#ga1e8074d0a2d5922601c5db2f9777ba79">uart1_puts_p</a> (const char *s)</td></tr>
|
||||||
|
<tr class="memdesc:ga1e8074d0a2d5922601c5db2f9777ba79"><td class="mdescLeft"> </td><td class="mdescRight">Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) <a href="#ga1e8074d0a2d5922601c5db2f9777ba79">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:ga1e8074d0a2d5922601c5db2f9777ba79"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
</table>
|
||||||
|
<h2 class="groupheader">Macro Definition Documentation</h2>
|
||||||
|
<a class="anchor" id="ga367ff7b5de225ed936a63239ad4adb0b"></a>
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">#define UART_BAUD_SELECT</td>
|
||||||
|
<td>(</td>
|
||||||
|
<td class="paramtype"> </td>
|
||||||
|
<td class="paramname">baudRate, </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="paramkey"></td>
|
||||||
|
<td></td>
|
||||||
|
<td class="paramtype"> </td>
|
||||||
|
<td class="paramname">xtalCpu </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td>)</td>
|
||||||
|
<td></td><td>   (((xtalCpu) + 8UL * (baudRate)) / (16UL * (baudRate)) -1UL)</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>UART Baudrate Expression. </p>
|
||||||
|
<dl class="params"><dt>Parameters</dt><dd>
|
||||||
|
<table class="params">
|
||||||
|
<tr><td class="paramname">xtalCpu</td><td>system clock in Mhz, e.g. 4000000UL for 4Mhz </td></tr>
|
||||||
|
<tr><td class="paramname">baudRate</td><td>baudrate in bps, e.g. 1200, 2400, 9600 </td></tr>
|
||||||
|
</table>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="anchor" id="ga1a02d45130520cb651ab313e69039382"></a>
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">#define UART_BAUD_SELECT_DOUBLE_SPEED</td>
|
||||||
|
<td>(</td>
|
||||||
|
<td class="paramtype"> </td>
|
||||||
|
<td class="paramname">baudRate, </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="paramkey"></td>
|
||||||
|
<td></td>
|
||||||
|
<td class="paramtype"> </td>
|
||||||
|
<td class="paramname">xtalCpu </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td>)</td>
|
||||||
|
<td></td><td>   ( ((((xtalCpu) + 4UL * (baudRate)) / (8UL * (baudRate)) -1UL)) | 0x8000)</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>UART Baudrate Expression for ATmega double speed mode. </p>
|
||||||
|
<dl class="params"><dt>Parameters</dt><dd>
|
||||||
|
<table class="params">
|
||||||
|
<tr><td class="paramname">xtalCpu</td><td>system clock in Mhz, e.g. 4000000UL for 4Mhz </td></tr>
|
||||||
|
<tr><td class="paramname">baudRate</td><td>baudrate in bps, e.g. 1200, 2400, 9600 </td></tr>
|
||||||
|
</table>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="anchor" id="ga5bdd6772c246436bb14377095de79b31"></a>
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">#define UART_RX_BUFFER_SIZE   32</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>Size of the circular receive buffer, must be power of 2. </p>
|
||||||
|
<p>You may need to adapt this constant to your target and your application by adding CDEFS += -DUART_RX_BUFFER_SIZE=nn to your Makefile. </p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="anchor" id="ga05f5d709605c6317c97e4974bec3402a"></a>
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">#define UART_TX_BUFFER_SIZE   32</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>Size of the circular transmit buffer, must be power of 2. </p>
|
||||||
|
<p>You may need to adapt this constant to your target and your application by adding CDEFS += -DUART_TX_BUFFER_SIZE=nn to your Makefile. </p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h2 class="groupheader">Function Documentation</h2>
|
||||||
|
<a class="anchor" id="gac19a76bb7d446125734a67f9f4b68991"></a>
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">void uart_init </td>
|
||||||
|
<td>(</td>
|
||||||
|
<td class="paramtype">unsigned int </td>
|
||||||
|
<td class="paramname"><em>baudrate</em></td><td>)</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>Initialize UART and set baudrate. </p>
|
||||||
|
<dl class="params"><dt>Parameters</dt><dd>
|
||||||
|
<table class="params">
|
||||||
|
<tr><td class="paramname">baudrate</td><td>Specify baudrate using macro <a class="el" href="group__pfleury__uart.html#ga367ff7b5de225ed936a63239ad4adb0b" title="UART Baudrate Expression. ">UART_BAUD_SELECT()</a> </td></tr>
|
||||||
|
</table>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<dl class="section return"><dt>Returns</dt><dd>none </dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="anchor" id="gaefaab30a8338ec46a6be35b99b1b4f09"></a>
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">unsigned int uart_getc </td>
|
||||||
|
<td>(</td>
|
||||||
|
<td class="paramtype">void </td>
|
||||||
|
<td class="paramname"></td><td>)</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>Get received byte from ringbuffer. </p>
|
||||||
|
<p>Returns in the lower byte the received character and in the higher byte the last receive error. UART_NO_DATA is returned when no data is available.</p>
|
||||||
|
<dl class="section return"><dt>Returns</dt><dd>lower byte: received byte from ringbuffer </dd>
|
||||||
|
<dd>
|
||||||
|
higher byte: last receive status<ul>
|
||||||
|
<li><b>0</b> successfully received data from UART</li>
|
||||||
|
<li><b>UART_NO_DATA</b> <br />
|
||||||
|
no receive data available</li>
|
||||||
|
<li><b>UART_BUFFER_OVERFLOW</b> <br />
|
||||||
|
Receive ringbuffer overflow. We are not reading the receive buffer fast enough, one or more received character have been dropped</li>
|
||||||
|
<li><b>UART_OVERRUN_ERROR</b> <br />
|
||||||
|
Overrun condition by UART. A character already present in the UART UDR register was not read by the interrupt handler before the next character arrived, one or more received characters have been dropped.</li>
|
||||||
|
<li><b>UART_FRAME_ERROR</b> <br />
|
||||||
|
Framing Error by UART </li>
|
||||||
|
</ul>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="anchor" id="gad975221bc08b901e4c7ad69f9c9a97e2"></a>
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">void uart_putc </td>
|
||||||
|
<td>(</td>
|
||||||
|
<td class="paramtype">unsigned char </td>
|
||||||
|
<td class="paramname"><em>data</em></td><td>)</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>Put byte to ringbuffer for transmitting via UART. </p>
|
||||||
|
<dl class="params"><dt>Parameters</dt><dd>
|
||||||
|
<table class="params">
|
||||||
|
<tr><td class="paramname">data</td><td>byte to be transmitted </td></tr>
|
||||||
|
</table>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<dl class="section return"><dt>Returns</dt><dd>none </dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="anchor" id="gae52facc0a56086a365bb0018160d8d71"></a>
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">void uart_puts </td>
|
||||||
|
<td>(</td>
|
||||||
|
<td class="paramtype">const char * </td>
|
||||||
|
<td class="paramname"><em>s</em></td><td>)</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>Put string to ringbuffer for transmitting via UART. </p>
|
||||||
|
<p>The string is buffered by the uart library in a circular buffer and one character at a time is transmitted to the UART using interrupts. Blocks if it can not write the whole string into the circular buffer.</p>
|
||||||
|
<dl class="params"><dt>Parameters</dt><dd>
|
||||||
|
<table class="params">
|
||||||
|
<tr><td class="paramname">s</td><td>string to be transmitted </td></tr>
|
||||||
|
</table>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<dl class="section return"><dt>Returns</dt><dd>none </dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="anchor" id="ga6d78b6744db6232f52b4616402036c2f"></a>
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">void uart_puts_p </td>
|
||||||
|
<td>(</td>
|
||||||
|
<td class="paramtype">const char * </td>
|
||||||
|
<td class="paramname"><em>s</em></td><td>)</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>Put string from program memory to ringbuffer for transmitting via UART. </p>
|
||||||
|
<p>The string is buffered by the uart library in a circular buffer and one character at a time is transmitted to the UART using interrupts. Blocks if it can not write the whole string into the circular buffer.</p>
|
||||||
|
<dl class="params"><dt>Parameters</dt><dd>
|
||||||
|
<table class="params">
|
||||||
|
<tr><td class="paramname">s</td><td>program memory string to be transmitted </td></tr>
|
||||||
|
</table>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<dl class="section return"><dt>Returns</dt><dd>none </dd></dl>
|
||||||
|
<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__pfleury__uart.html#gae9e143569df2285379bc55f9f5595bf9" title="Macro to automatically put a string constant into program memory. ">uart_puts_P</a> </dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="anchor" id="ga4db697cb5469fd70e794fa7df73a6d6a"></a>
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">void uart1_init </td>
|
||||||
|
<td>(</td>
|
||||||
|
<td class="paramtype">unsigned int </td>
|
||||||
|
<td class="paramname"><em>baudrate</em></td><td>)</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>Initialize USART1 (only available on selected ATmegas) </p>
|
||||||
|
<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__pfleury__uart.html#gac19a76bb7d446125734a67f9f4b68991" title="Initialize UART and set baudrate. ">uart_init</a> </dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="anchor" id="gaeb1405c641e5bc9b7224018f5e8d90de"></a>
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">unsigned int uart1_getc </td>
|
||||||
|
<td>(</td>
|
||||||
|
<td class="paramtype">void </td>
|
||||||
|
<td class="paramname"></td><td>)</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>Get received byte of USART1 from ringbuffer. (only available on selected ATmega) </p>
|
||||||
|
<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__pfleury__uart.html#gaefaab30a8338ec46a6be35b99b1b4f09" title="Get received byte from ringbuffer. ">uart_getc</a> </dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="anchor" id="gab465f689d197fadfbacc374fc9411154"></a>
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">void uart1_putc </td>
|
||||||
|
<td>(</td>
|
||||||
|
<td class="paramtype">unsigned char </td>
|
||||||
|
<td class="paramname"><em>data</em></td><td>)</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) </p>
|
||||||
|
<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__pfleury__uart.html#gad975221bc08b901e4c7ad69f9c9a97e2" title="Put byte to ringbuffer for transmitting via UART. ">uart_putc</a> </dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="anchor" id="ga5568f8f3913b218fd4d0346af78831b2"></a>
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">void uart1_puts </td>
|
||||||
|
<td>(</td>
|
||||||
|
<td class="paramtype">const char * </td>
|
||||||
|
<td class="paramname"><em>s</em></td><td>)</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) </p>
|
||||||
|
<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__pfleury__uart.html#gae52facc0a56086a365bb0018160d8d71" title="Put string to ringbuffer for transmitting via UART. ">uart_puts</a> </dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="anchor" id="ga1e8074d0a2d5922601c5db2f9777ba79"></a>
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">void uart1_puts_p </td>
|
||||||
|
<td>(</td>
|
||||||
|
<td class="paramtype">const char * </td>
|
||||||
|
<td class="paramname"><em>s</em></td><td>)</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) </p>
|
||||||
|
<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__pfleury__uart.html#ga6d78b6744db6232f52b4616402036c2f" title="Put string from program memory to ringbuffer for transmitting via UART. ">uart_puts_p</a> </dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div><!-- contents -->
|
||||||
|
<!-- start footer part -->
|
||||||
|
<hr class="footer"/><address class="footer"><small>
|
||||||
|
Generated on Sat Jan 31 2015 18:52:30 for AVR-GCC Libraries by  <a href="http://www.doxygen.org/index.html">
|
||||||
|
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
||||||
|
</a> 1.8.9.1
|
||||||
|
</small></address>
|
||||||
|
</body>
|
||||||
|
</html>
|
129
src/uart/test_uart.c
Normal file
129
src/uart/test_uart.c
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
/*************************************************************************
|
||||||
|
Title: Example program for the Interrupt controlled UART library
|
||||||
|
Author: Peter Fleury <pfleury@gmx.ch> http://tinyurl.com/peterfleury
|
||||||
|
File: $Id: test_uart.c,v 1.7 2015/01/31 17:46:31 peter Exp $
|
||||||
|
Software: AVR-GCC 4.x
|
||||||
|
Hardware: AVR with built-in UART/USART
|
||||||
|
|
||||||
|
DESCRIPTION:
|
||||||
|
This example shows how to use the UART library uart.c
|
||||||
|
|
||||||
|
*************************************************************************/
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
#include "uart.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* define CPU frequency in Hz in Makefile */
|
||||||
|
#ifndef F_CPU
|
||||||
|
#error "F_CPU undefined, please define CPU frequency in Hz in Makefile"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define UART buad rate here */
|
||||||
|
#define UART_BAUD_RATE 9600
|
||||||
|
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
unsigned int c;
|
||||||
|
char buffer[7];
|
||||||
|
int num=134;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize UART library, pass baudrate and AVR cpu clock
|
||||||
|
* with the macro
|
||||||
|
* UART_BAUD_SELECT() (normal speed mode )
|
||||||
|
* or
|
||||||
|
* UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
|
||||||
|
*/
|
||||||
|
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* now enable interrupt, since UART library is interrupt controlled
|
||||||
|
*/
|
||||||
|
sei();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Transmit string to UART
|
||||||
|
* The string is buffered by the uart library in a circular buffer
|
||||||
|
* and one character at a time is transmitted to the UART using interrupts.
|
||||||
|
* uart_puts() blocks if it can not write the whole string to the circular
|
||||||
|
* buffer
|
||||||
|
*/
|
||||||
|
uart_puts("String stored in SRAM\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Transmit string from program memory to UART
|
||||||
|
*/
|
||||||
|
uart_puts_P("String stored in FLASH\n");
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use standard avr-libc functions to convert numbers into string
|
||||||
|
* before transmitting via UART
|
||||||
|
*/
|
||||||
|
itoa( num, buffer, 10); // convert interger into string (decimal format)
|
||||||
|
uart_puts(buffer); // and transmit string to UART
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Transmit single character to UART
|
||||||
|
*/
|
||||||
|
uart_putc('\r');
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Get received character from ringbuffer
|
||||||
|
* uart_getc() returns in the lower byte the received character and
|
||||||
|
* in the higher byte (bitmask) the last receive error
|
||||||
|
* UART_NO_DATA is returned when no data is available.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
c = uart_getc();
|
||||||
|
if ( c & UART_NO_DATA )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* no data available from UART
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* new data available from UART
|
||||||
|
* check for Frame or Overrun error
|
||||||
|
*/
|
||||||
|
if ( c & UART_FRAME_ERROR )
|
||||||
|
{
|
||||||
|
/* Framing Error detected, i.e no stop bit detected */
|
||||||
|
uart_puts_P("UART Frame Error: ");
|
||||||
|
}
|
||||||
|
if ( c & UART_OVERRUN_ERROR )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Overrun, a character already present in the UART UDR register was
|
||||||
|
* not read by the interrupt handler before the next character arrived,
|
||||||
|
* one or more received characters have been dropped
|
||||||
|
*/
|
||||||
|
uart_puts_P("UART Overrun Error: ");
|
||||||
|
}
|
||||||
|
if ( c & UART_BUFFER_OVERFLOW )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* We are not reading the receive buffer fast enough,
|
||||||
|
* one or more received character have been dropped
|
||||||
|
*/
|
||||||
|
uart_puts_P("Buffer overflow error: ");
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* send received character back
|
||||||
|
*/
|
||||||
|
uart_putc( (unsigned char)c );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
777
src/uart/uart.c
Normal file
777
src/uart/uart.c
Normal file
|
@ -0,0 +1,777 @@
|
||||||
|
/*************************************************************************
|
||||||
|
Title: Interrupt UART library with receive/transmit circular buffers
|
||||||
|
Author: Peter Fleury <pfleury@gmx.ch> http://tinyurl.com/peterfleury
|
||||||
|
File: $Id: uart.c,v 1.15.2.4 2015/09/05 18:33:32 peter Exp $
|
||||||
|
Software: AVR-GCC 4.x
|
||||||
|
Hardware: any AVR with built-in UART,
|
||||||
|
License: GNU General Public License
|
||||||
|
|
||||||
|
DESCRIPTION:
|
||||||
|
An interrupt is generated when the UART has finished transmitting or
|
||||||
|
receiving a byte. The interrupt handling routines use circular buffers
|
||||||
|
for buffering received and transmitted data.
|
||||||
|
|
||||||
|
The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE variables define
|
||||||
|
the buffer size in bytes. Note that these variables must be a
|
||||||
|
power of 2.
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
Refere to the header file uart.h for a description of the routines.
|
||||||
|
See also example test_uart.c.
|
||||||
|
|
||||||
|
NOTES:
|
||||||
|
Based on Atmel Application Note AVR306
|
||||||
|
|
||||||
|
LICENSE:
|
||||||
|
Copyright (C) 2015 Peter Fleury, GNU General Public License Version 3
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
*************************************************************************/
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
#include "uart.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* constants and macros
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* size of RX/TX buffers */
|
||||||
|
#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1)
|
||||||
|
#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1)
|
||||||
|
|
||||||
|
#if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK )
|
||||||
|
#error RX buffer size is not a power of 2
|
||||||
|
#endif
|
||||||
|
#if ( UART_TX_BUFFER_SIZE & UART_TX_BUFFER_MASK )
|
||||||
|
#error TX buffer size is not a power of 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__AVR_AT90S2313__) || defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || \
|
||||||
|
defined(__AVR_AT90S4434__) || defined(__AVR_AT90S8535__) || \
|
||||||
|
defined(__AVR_ATmega103__)
|
||||||
|
/* old AVR classic or ATmega103 with one UART */
|
||||||
|
#define UART0_RECEIVE_INTERRUPT UART_RX_vect
|
||||||
|
#define UART0_TRANSMIT_INTERRUPT UART_UDRE_vect
|
||||||
|
#define UART0_STATUS USR
|
||||||
|
#define UART0_CONTROL UCR
|
||||||
|
#define UART0_DATA UDR
|
||||||
|
#define UART0_UDRIE UDRIE
|
||||||
|
#define UART0_UBRRL UBRR
|
||||||
|
#define UART0_BIT_U2X U2X
|
||||||
|
#define UART0_BIT_RXCIE RXCIE
|
||||||
|
#define UART0_BIT_RXEN RXEN
|
||||||
|
#define UART0_BIT_TXEN TXEN
|
||||||
|
#elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__)
|
||||||
|
/* old AVR classic with one UART */
|
||||||
|
#define UART0_RECEIVE_INTERRUPT UART_RX_vect
|
||||||
|
#define UART0_TRANSMIT_INTERRUPT UART_UDRE_vect
|
||||||
|
#define UART0_STATUS UCSRA
|
||||||
|
#define UART0_CONTROL UCSRB
|
||||||
|
#define UART0_DATA UDR
|
||||||
|
#define UART0_UDRIE UDRIE
|
||||||
|
#define UART0_UBRRL UBRR
|
||||||
|
#define UART0_BIT_U2X U2X
|
||||||
|
#define UART0_BIT_RXCIE RXCIE
|
||||||
|
#define UART0_BIT_RXEN RXEN
|
||||||
|
#define UART0_BIT_TXEN TXEN
|
||||||
|
#elif defined(__AVR_AT90PWM216__) || defined(__AVR_AT90PWM316__)
|
||||||
|
/* AT90PWN216/316 with one USART */
|
||||||
|
#define UART0_RECEIVE_INTERRUPT USART_RX_vect
|
||||||
|
#define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect
|
||||||
|
#define UART0_STATUS UCSRA
|
||||||
|
#define UART0_CONTROL UCSRB
|
||||||
|
#define UART0_CONTROLC UCSRC
|
||||||
|
#define UART0_DATA UDR
|
||||||
|
#define UART0_UDRIE UDRIE
|
||||||
|
#define UART0_UBRRL UBRRL
|
||||||
|
#define UART0_UBRRH UBRRH
|
||||||
|
#define UART0_BIT_U2X U2X
|
||||||
|
#define UART0_BIT_RXCIE RXCIE
|
||||||
|
#define UART0_BIT_RXEN RXEN
|
||||||
|
#define UART0_BIT_TXEN TXEN
|
||||||
|
#define UART0_BIT_UCSZ0 UCSZ0
|
||||||
|
#define UART0_BIT_UCSZ1 UCSZ1
|
||||||
|
#elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega8A__) || \
|
||||||
|
defined(__AVR_ATmega16__) || defined(__AVR_ATmega16A__) || \
|
||||||
|
defined(__AVR_ATmega32__) || defined(__AVR_ATmega32A__) || \
|
||||||
|
defined(__AVR_ATmega323__)
|
||||||
|
/* ATmega with one USART */
|
||||||
|
#define UART0_RECEIVE_INTERRUPT USART_RXC_vect
|
||||||
|
#define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect
|
||||||
|
#define UART0_STATUS UCSRA
|
||||||
|
#define UART0_CONTROL UCSRB
|
||||||
|
#define UART0_CONTROLC UCSRC
|
||||||
|
#define UART0_DATA UDR
|
||||||
|
#define UART0_UDRIE UDRIE
|
||||||
|
#define UART0_UBRRL UBRRL
|
||||||
|
#define UART0_UBRRH UBRRH
|
||||||
|
#define UART0_BIT_U2X U2X
|
||||||
|
#define UART0_BIT_RXCIE RXCIE
|
||||||
|
#define UART0_BIT_RXEN RXEN
|
||||||
|
#define UART0_BIT_TXEN TXEN
|
||||||
|
#define UART0_BIT_UCSZ0 UCSZ0
|
||||||
|
#define UART0_BIT_UCSZ1 UCSZ1
|
||||||
|
#define UART0_BIT_URSEL URSEL
|
||||||
|
#elif defined (__AVR_ATmega8515__) || defined(__AVR_ATmega8535__)
|
||||||
|
#define UART0_RECEIVE_INTERRUPT USART_RX_vect
|
||||||
|
#define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect
|
||||||
|
#define UART0_STATUS UCSRA
|
||||||
|
#define UART0_CONTROL UCSRB
|
||||||
|
#define UART0_CONTROLC UCSRC
|
||||||
|
#define UART0_DATA UDR
|
||||||
|
#define UART0_UDRIE UDRIE
|
||||||
|
#define UART0_UBRRL UBRRL
|
||||||
|
#define UART0_UBRRH UBRRH
|
||||||
|
#define UART0_BIT_U2X U2X
|
||||||
|
#define UART0_BIT_RXCIE RXCIE
|
||||||
|
#define UART0_BIT_RXEN RXEN
|
||||||
|
#define UART0_BIT_TXEN TXEN
|
||||||
|
#define UART0_BIT_UCSZ0 UCSZ0
|
||||||
|
#define UART0_BIT_UCSZ1 UCSZ1
|
||||||
|
#define UART0_BIT_URSEL URSEL
|
||||||
|
#elif defined(__AVR_ATmega163__)
|
||||||
|
/* ATmega163 with one UART */
|
||||||
|
#define UART0_RECEIVE_INTERRUPT UART_RX_vect
|
||||||
|
#define UART0_TRANSMIT_INTERRUPT UART_UDRE_vect
|
||||||
|
#define UART0_STATUS UCSRA
|
||||||
|
#define UART0_CONTROL UCSRB
|
||||||
|
#define UART0_DATA UDR
|
||||||
|
#define UART0_UDRIE UDRIE
|
||||||
|
#define UART0_UBRRL UBRR
|
||||||
|
#define UART0_UBRRH UBRRHI
|
||||||
|
#define UART0_BIT_U2X U2X
|
||||||
|
#define UART0_BIT_RXCIE RXCIE
|
||||||
|
#define UART0_BIT_RXEN RXEN
|
||||||
|
#define UART0_BIT_TXEN TXEN
|
||||||
|
#elif defined(__AVR_ATmega162__)
|
||||||
|
/* ATmega with two USART */
|
||||||
|
#define ATMEGA_USART1
|
||||||
|
#define UART0_RECEIVE_INTERRUPT USART0_RXC_vect
|
||||||
|
#define UART1_RECEIVE_INTERRUPT USART1_RXC_vect
|
||||||
|
#define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
|
||||||
|
#define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect
|
||||||
|
#define UART0_STATUS UCSR0A
|
||||||
|
#define UART0_CONTROL UCSR0B
|
||||||
|
#define UART0_CONTROLC UCSR0C
|
||||||
|
#define UART0_DATA UDR0
|
||||||
|
#define UART0_UDRIE UDRIE0
|
||||||
|
#define UART0_UBRRL UBRR0L
|
||||||
|
#define UART0_UBRRH UBRR0H
|
||||||
|
#define UART0_BIT_URSEL URSEL0
|
||||||
|
#define UART0_BIT_U2X U2X0
|
||||||
|
#define UART0_BIT_RXCIE RXCIE0
|
||||||
|
#define UART0_BIT_RXEN RXEN0
|
||||||
|
#define UART0_BIT_TXEN TXEN0
|
||||||
|
#define UART0_BIT_UCSZ0 UCSZ00
|
||||||
|
#define UART0_BIT_UCSZ1 UCSZ01
|
||||||
|
#define UART1_STATUS UCSR1A
|
||||||
|
#define UART1_CONTROL UCSR1B
|
||||||
|
#define UART1_CONTROLC UCSR1C
|
||||||
|
#define UART1_DATA UDR1
|
||||||
|
#define UART1_UDRIE UDRIE1
|
||||||
|
#define UART1_UBRRL UBRR1L
|
||||||
|
#define UART1_UBRRH UBRR1H
|
||||||
|
#define UART1_BIT_URSEL URSEL1
|
||||||
|
#define UART1_BIT_U2X U2X1
|
||||||
|
#define UART1_BIT_RXCIE RXCIE1
|
||||||
|
#define UART1_BIT_RXEN RXEN1
|
||||||
|
#define UART1_BIT_TXEN TXEN1
|
||||||
|
#define UART1_BIT_UCSZ0 UCSZ10
|
||||||
|
#define UART1_BIT_UCSZ1 UCSZ11
|
||||||
|
#elif defined(__AVR_ATmega161__)
|
||||||
|
/* ATmega with UART */
|
||||||
|
#error "AVR ATmega161 currently not supported by this libaray !"
|
||||||
|
#elif defined(__AVR_ATmega169__)
|
||||||
|
/* ATmega with one USART */
|
||||||
|
#define UART0_RECEIVE_INTERRUPT USART0_RX_vect
|
||||||
|
#define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
|
||||||
|
#define UART0_STATUS UCSRA
|
||||||
|
#define UART0_CONTROL UCSRB
|
||||||
|
#define UART0_CONTROLC UCSRC
|
||||||
|
#define UART0_DATA UDR
|
||||||
|
#define UART0_UDRIE UDRIE
|
||||||
|
#define UART0_UBRRL UBRRL
|
||||||
|
#define UART0_UBRRH UBRRH
|
||||||
|
#define UART0_BIT_U2X U2X
|
||||||
|
#define UART0_BIT_RXCIE RXCIE
|
||||||
|
#define UART0_BIT_RXEN RXEN
|
||||||
|
#define UART0_BIT_TXEN TXEN
|
||||||
|
#define UART0_BIT_UCSZ0 UCSZ0
|
||||||
|
#define UART0_BIT_UCSZ1 UCSZ1
|
||||||
|
#elif defined(__AVR_ATmega48__) || defined(__AVR_ATmega48A__) || defined(__AVR_ATmega48P__) || defined(__AVR_ATmega48PA__) || defined(__AVR_ATmega48PB__) || \
|
||||||
|
defined(__AVR_ATmega88__) || defined(__AVR_ATmega88A__) || defined(__AVR_ATmega88P__) || defined(__AVR_ATmega88PA__) || defined(__AVR_ATmega88PB__) || \
|
||||||
|
defined(__AVR_ATmega168__) || defined(__AVR_ATmega168A__)|| defined(__AVR_ATmega168P__)|| defined(__AVR_ATmega168PA__) || defined(__AVR_ATmega168PB__) || \
|
||||||
|
defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__) || \
|
||||||
|
defined(__AVR_ATmega3250__) || defined(__AVR_ATmega3290__) ||defined(__AVR_ATmega6450__) || defined(__AVR_ATmega6490__)
|
||||||
|
/* ATmega with one USART */
|
||||||
|
#define UART0_RECEIVE_INTERRUPT USART_RX_vect
|
||||||
|
#define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect
|
||||||
|
#define UART0_STATUS UCSR0A
|
||||||
|
#define UART0_CONTROL UCSR0B
|
||||||
|
#define UART0_CONTROLC UCSR0C
|
||||||
|
#define UART0_DATA UDR0
|
||||||
|
#define UART0_UDRIE UDRIE0
|
||||||
|
#define UART0_UBRRL UBRR0L
|
||||||
|
#define UART0_UBRRH UBRR0H
|
||||||
|
#define UART0_BIT_U2X U2X0
|
||||||
|
#define UART0_BIT_RXCIE RXCIE0
|
||||||
|
#define UART0_BIT_RXEN RXEN0
|
||||||
|
#define UART0_BIT_TXEN TXEN0
|
||||||
|
#define UART0_BIT_UCSZ0 UCSZ00
|
||||||
|
#define UART0_BIT_UCSZ1 UCSZ01
|
||||||
|
#elif defined(__AVR_ATtiny2313__) || defined(__AVR_ATtiny2313A__) || defined(__AVR_ATtiny4313__)
|
||||||
|
/* ATtiny with one USART */
|
||||||
|
#define UART0_RECEIVE_INTERRUPT USART_RX_vect
|
||||||
|
#define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect
|
||||||
|
#define UART0_STATUS UCSRA
|
||||||
|
#define UART0_CONTROL UCSRB
|
||||||
|
#define UART0_CONTROLC UCSRC
|
||||||
|
#define UART0_DATA UDR
|
||||||
|
#define UART0_UDRIE UDRIE
|
||||||
|
#define UART0_UBRRL UBRRL
|
||||||
|
#define UART0_UBRRH UBRRH
|
||||||
|
#define UART0_BIT_U2X U2X
|
||||||
|
#define UART0_BIT_RXCIE RXCIE
|
||||||
|
#define UART0_BIT_RXEN RXEN
|
||||||
|
#define UART0_BIT_TXEN TXEN
|
||||||
|
#define UART0_BIT_UCSZ0 UCSZ0
|
||||||
|
#define UART0_BIT_UCSZ1 UCSZ1
|
||||||
|
#elif defined(__AVR_ATmega329__) || defined(__AVR_ATmega649__) || defined(__AVR_ATmega3290__) || defined(__AVR_ATmega6490__) ||\
|
||||||
|
defined(__AVR_ATmega169A__) || defined(__AVR_ATmega169PA__) || \
|
||||||
|
defined(__AVR_ATmega329A__) || defined(__AVR_ATmega329PA__) || defined(__AVR_ATmega3290A__) || defined(__AVR_ATmega3290PA__) || \
|
||||||
|
defined(__AVR_ATmega649A__) || defined(__AVR_ATmega649P__) || defined(__AVR_ATmega6490A__) || defined(__AVR_ATmega6490P__) || \
|
||||||
|
defined(__AVR_ATmega165__) || defined(__AVR_ATmega325__) || defined(__AVR_ATmega645__) || defined(__AVR_ATmega3250__) || defined(__AVR_ATmega6450__) || \
|
||||||
|
defined(__AVR_ATmega165A__) || defined(__AVR_ATmega165PA__) || \
|
||||||
|
defined(__AVR_ATmega325A__) || defined(__AVR_ATmega325PA__) || defined(__AVR_ATmega3250A__) || defined(__AVR_ATmega3250PA__) ||\
|
||||||
|
defined(__AVR_ATmega645A__) || defined(__AVR_ATmega645PA__) || defined(__AVR_ATmega6450A__) || defined(__AVR_ATmega6450PA__) || \
|
||||||
|
defined(__AVR_ATmega644__)
|
||||||
|
/* ATmega with one USART */
|
||||||
|
#define UART0_RECEIVE_INTERRUPT USART0_RX_vect
|
||||||
|
#define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
|
||||||
|
#define UART0_STATUS UCSR0A
|
||||||
|
#define UART0_CONTROL UCSR0B
|
||||||
|
#define UART0_CONTROLC UCSR0C
|
||||||
|
#define UART0_DATA UDR0
|
||||||
|
#define UART0_UDRIE UDRIE0
|
||||||
|
#define UART0_UBRRL UBRR0L
|
||||||
|
#define UART0_UBRRH UBRR0H
|
||||||
|
#define UART0_BIT_U2X U2X0
|
||||||
|
#define UART0_BIT_RXCIE RXCIE0
|
||||||
|
#define UART0_BIT_RXEN RXEN0
|
||||||
|
#define UART0_BIT_TXEN TXEN0
|
||||||
|
#define UART0_BIT_UCSZ0 UCSZ00
|
||||||
|
#define UART0_BIT_UCSZ1 UCSZ01
|
||||||
|
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) || defined(__AVR_ATmega128A__) ||\
|
||||||
|
defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) || \
|
||||||
|
defined(__AVR_ATmega164P__) || defined(__AVR_ATmega324P__) || defined(__AVR_ATmega644P__) || \
|
||||||
|
defined(__AVR_ATmega164A__) || defined(__AVR_ATmega164PA__) || defined(__AVR_ATmega324A__) || defined(__AVR_ATmega324PA__) || \
|
||||||
|
defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) ||\
|
||||||
|
defined(__AVR_ATtiny1634__)
|
||||||
|
/* ATmega with two USART */
|
||||||
|
#define ATMEGA_USART1
|
||||||
|
#define UART0_RECEIVE_INTERRUPT USART0_RX_vect
|
||||||
|
#define UART1_RECEIVE_INTERRUPT USART1_RX_vect
|
||||||
|
#define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
|
||||||
|
#define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect
|
||||||
|
#define UART0_STATUS UCSR0A
|
||||||
|
#define UART0_CONTROL UCSR0B
|
||||||
|
#define UART0_CONTROLC UCSR0C
|
||||||
|
#define UART0_DATA UDR0
|
||||||
|
#define UART0_UDRIE UDRIE0
|
||||||
|
#define UART0_UBRRL UBRR0L
|
||||||
|
#define UART0_UBRRH UBRR0H
|
||||||
|
#define UART0_BIT_U2X U2X0
|
||||||
|
#define UART0_BIT_RXCIE RXCIE0
|
||||||
|
#define UART0_BIT_RXEN RXEN0
|
||||||
|
#define UART0_BIT_TXEN TXEN0
|
||||||
|
#define UART0_BIT_UCSZ0 UCSZ00
|
||||||
|
#define UART0_BIT_UCSZ1 UCSZ01
|
||||||
|
#define UART1_STATUS UCSR1A
|
||||||
|
#define UART1_CONTROL UCSR1B
|
||||||
|
#define UART1_CONTROLC UCSR1C
|
||||||
|
#define UART1_DATA UDR1
|
||||||
|
#define UART1_UDRIE UDRIE1
|
||||||
|
#define UART1_UBRRL UBRR1L
|
||||||
|
#define UART1_UBRRH UBRR1H
|
||||||
|
#define UART1_BIT_U2X U2X1
|
||||||
|
#define UART1_BIT_RXCIE RXCIE1
|
||||||
|
#define UART1_BIT_RXEN RXEN1
|
||||||
|
#define UART1_BIT_TXEN TXEN1
|
||||||
|
#define UART1_BIT_UCSZ0 UCSZ10
|
||||||
|
#define UART1_BIT_UCSZ1 UCSZ11
|
||||||
|
#elif defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) || \
|
||||||
|
defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || \
|
||||||
|
defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \
|
||||||
|
defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1287__)
|
||||||
|
#define UART0_RECEIVE_INTERRUPT USART1_RX_vect
|
||||||
|
#define UART0_TRANSMIT_INTERRUPT USART1_UDRE_vect
|
||||||
|
#define UART0_STATUS UCSR1A
|
||||||
|
#define UART0_CONTROL UCSR1B
|
||||||
|
#define UART0_CONTROLC UCSR1C
|
||||||
|
#define UART0_DATA UDR1
|
||||||
|
#define UART0_UDRIE UDRIE1
|
||||||
|
#define UART0_UBRRL UBRR1L
|
||||||
|
#define UART0_UBRRH UBRR1H
|
||||||
|
#define UART0_BIT_U2X U2X1
|
||||||
|
#define UART0_BIT_RXCIE RXCIE1
|
||||||
|
#define UART0_BIT_RXEN RXEN1
|
||||||
|
#define UART0_BIT_TXEN TXEN1
|
||||||
|
#define UART0_BIT_UCSZ0 UCSZ10
|
||||||
|
#define UART0_BIT_UCSZ1 UCSZ11
|
||||||
|
#else
|
||||||
|
#error "no UART definition for MCU available"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* module global variables
|
||||||
|
*/
|
||||||
|
static volatile unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
|
||||||
|
static volatile unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
|
||||||
|
static volatile unsigned char UART_TxHead;
|
||||||
|
static volatile unsigned char UART_TxTail;
|
||||||
|
static volatile unsigned char UART_RxHead;
|
||||||
|
static volatile unsigned char UART_RxTail;
|
||||||
|
static volatile unsigned char UART_LastRxError;
|
||||||
|
|
||||||
|
#if defined( ATMEGA_USART1 )
|
||||||
|
static volatile unsigned char UART1_TxBuf[UART_TX_BUFFER_SIZE];
|
||||||
|
static volatile unsigned char UART1_RxBuf[UART_RX_BUFFER_SIZE];
|
||||||
|
static volatile unsigned char UART1_TxHead;
|
||||||
|
static volatile unsigned char UART1_TxTail;
|
||||||
|
static volatile unsigned char UART1_RxHead;
|
||||||
|
static volatile unsigned char UART1_RxTail;
|
||||||
|
static volatile unsigned char UART1_LastRxError;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ISR (UART0_RECEIVE_INTERRUPT)
|
||||||
|
/*************************************************************************
|
||||||
|
Function: UART Receive Complete interrupt
|
||||||
|
Purpose: called when the UART has received a character
|
||||||
|
**************************************************************************/
|
||||||
|
{
|
||||||
|
unsigned char tmphead;
|
||||||
|
unsigned char data;
|
||||||
|
unsigned char usr;
|
||||||
|
unsigned char lastRxError;
|
||||||
|
|
||||||
|
|
||||||
|
/* read UART status register and UART data register */
|
||||||
|
usr = UART0_STATUS;
|
||||||
|
data = UART0_DATA;
|
||||||
|
|
||||||
|
/* get FEn (Frame Error) DORn (Data OverRun) UPEn (USART Parity Error) bits */
|
||||||
|
#if defined(FE) && defined(DOR) && defined(UPE)
|
||||||
|
lastRxError = usr & (_BV(FE)|_BV(DOR)|_BV(UPE) );
|
||||||
|
#elif defined(FE0) && defined(DOR0) && defined(UPE0)
|
||||||
|
lastRxError = usr & (_BV(FE0)|_BV(DOR0)|_BV(UPE0) );
|
||||||
|
#elif defined(FE1) && defined(DOR1) && defined(UPE1)
|
||||||
|
lastRxError = usr & (_BV(FE1)|_BV(DOR1)|_BV(UPE1) );
|
||||||
|
#elif defined(FE) && defined(DOR)
|
||||||
|
lastRxError = usr & (_BV(FE)|_BV(DOR) );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* calculate buffer index */
|
||||||
|
tmphead = ( UART_RxHead + 1) & UART_RX_BUFFER_MASK;
|
||||||
|
|
||||||
|
if ( tmphead == UART_RxTail ) {
|
||||||
|
/* error: receive buffer overflow */
|
||||||
|
lastRxError = UART_BUFFER_OVERFLOW >> 8;
|
||||||
|
}else{
|
||||||
|
/* store new index */
|
||||||
|
UART_RxHead = tmphead;
|
||||||
|
/* store received data in buffer */
|
||||||
|
UART_RxBuf[tmphead] = data;
|
||||||
|
}
|
||||||
|
UART_LastRxError |= lastRxError;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ISR (UART0_TRANSMIT_INTERRUPT)
|
||||||
|
/*************************************************************************
|
||||||
|
Function: UART Data Register Empty interrupt
|
||||||
|
Purpose: called when the UART is ready to transmit the next byte
|
||||||
|
**************************************************************************/
|
||||||
|
{
|
||||||
|
unsigned char tmptail;
|
||||||
|
|
||||||
|
|
||||||
|
if ( UART_TxHead != UART_TxTail) {
|
||||||
|
/* calculate and store new buffer index */
|
||||||
|
tmptail = (UART_TxTail + 1) & UART_TX_BUFFER_MASK;
|
||||||
|
UART_TxTail = tmptail;
|
||||||
|
/* get one byte from buffer and write it to UART */
|
||||||
|
UART0_DATA = UART_TxBuf[tmptail]; /* start transmission */
|
||||||
|
}else{
|
||||||
|
/* tx buffer empty, disable UDRE interrupt */
|
||||||
|
UART0_CONTROL &= ~_BV(UART0_UDRIE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Function: uart_init()
|
||||||
|
Purpose: initialize UART and set baudrate
|
||||||
|
Input: baudrate using macro UART_BAUD_SELECT()
|
||||||
|
Returns: none
|
||||||
|
**************************************************************************/
|
||||||
|
void uart_init(unsigned int baudrate)
|
||||||
|
{
|
||||||
|
UART_TxHead = 0;
|
||||||
|
UART_TxTail = 0;
|
||||||
|
UART_RxHead = 0;
|
||||||
|
UART_RxTail = 0;
|
||||||
|
|
||||||
|
#ifdef UART_TEST
|
||||||
|
#ifndef UART0_BIT_U2X
|
||||||
|
#warning "UART0_BIT_U2X not defined"
|
||||||
|
#endif
|
||||||
|
#ifndef UART0_UBRRH
|
||||||
|
#warning "UART0_UBRRH not defined"
|
||||||
|
#endif
|
||||||
|
#ifndef UART0_CONTROLC
|
||||||
|
#warning "UART0_CONTROLC not defined"
|
||||||
|
#endif
|
||||||
|
#if defined(URSEL) || defined(URSEL0)
|
||||||
|
#ifndef UART0_BIT_URSEL
|
||||||
|
#warning "UART0_BIT_URSEL not defined"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set baud rate */
|
||||||
|
if ( baudrate & 0x8000 )
|
||||||
|
{
|
||||||
|
#if UART0_BIT_U2X
|
||||||
|
UART0_STATUS = (1<<UART0_BIT_U2X); //Enable 2x speed
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#if defined(UART0_UBRRH)
|
||||||
|
UART0_UBRRH = (unsigned char)((baudrate>>8)&0x80) ;
|
||||||
|
#endif
|
||||||
|
UART0_UBRRL = (unsigned char) (baudrate&0x00FF);
|
||||||
|
|
||||||
|
/* Enable USART receiver and transmitter and receive complete interrupt */
|
||||||
|
UART0_CONTROL = _BV(UART0_BIT_RXCIE)|(1<<UART0_BIT_RXEN)|(1<<UART0_BIT_TXEN);
|
||||||
|
|
||||||
|
/* Set frame format: asynchronous, 8data, no parity, 1stop bit */
|
||||||
|
#ifdef UART0_CONTROLC
|
||||||
|
#ifdef UART0_BIT_URSEL
|
||||||
|
UART0_CONTROLC = (1<<UART0_BIT_URSEL)|(1<<UART0_BIT_UCSZ1)|(1<<UART0_BIT_UCSZ0);
|
||||||
|
#else
|
||||||
|
UART0_CONTROLC = (1<<UART0_BIT_UCSZ1)|(1<<UART0_BIT_UCSZ0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}/* uart_init */
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Function: uart_getc()
|
||||||
|
Purpose: return byte from ringbuffer
|
||||||
|
Returns: lower byte: received byte from ringbuffer
|
||||||
|
higher byte: last receive error
|
||||||
|
**************************************************************************/
|
||||||
|
unsigned int uart_getc(void)
|
||||||
|
{
|
||||||
|
unsigned char tmptail;
|
||||||
|
unsigned char data;
|
||||||
|
unsigned char lastRxError;
|
||||||
|
|
||||||
|
|
||||||
|
if ( UART_RxHead == UART_RxTail ) {
|
||||||
|
return UART_NO_DATA; /* no data available */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* calculate buffer index */
|
||||||
|
tmptail = (UART_RxTail + 1) & UART_RX_BUFFER_MASK;
|
||||||
|
|
||||||
|
/* get data from receive buffer */
|
||||||
|
data = UART_RxBuf[tmptail];
|
||||||
|
lastRxError = UART_LastRxError;
|
||||||
|
|
||||||
|
/* store buffer index */
|
||||||
|
UART_RxTail = tmptail;
|
||||||
|
|
||||||
|
UART_LastRxError = 0;
|
||||||
|
return (lastRxError << 8) + data;
|
||||||
|
|
||||||
|
}/* uart_getc */
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Function: uart_putc()
|
||||||
|
Purpose: write byte to ringbuffer for transmitting via UART
|
||||||
|
Input: byte to be transmitted
|
||||||
|
Returns: none
|
||||||
|
**************************************************************************/
|
||||||
|
void uart_putc(unsigned char data)
|
||||||
|
{
|
||||||
|
unsigned char tmphead;
|
||||||
|
|
||||||
|
|
||||||
|
tmphead = (UART_TxHead + 1) & UART_TX_BUFFER_MASK;
|
||||||
|
|
||||||
|
while ( tmphead == UART_TxTail ){
|
||||||
|
;/* wait for free space in buffer */
|
||||||
|
}
|
||||||
|
|
||||||
|
UART_TxBuf[tmphead] = data;
|
||||||
|
UART_TxHead = tmphead;
|
||||||
|
|
||||||
|
/* enable UDRE interrupt */
|
||||||
|
UART0_CONTROL |= _BV(UART0_UDRIE);
|
||||||
|
|
||||||
|
}/* uart_putc */
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Function: uart_puts()
|
||||||
|
Purpose: transmit string to UART
|
||||||
|
Input: string to be transmitted
|
||||||
|
Returns: none
|
||||||
|
**************************************************************************/
|
||||||
|
void uart_puts(const char *s )
|
||||||
|
{
|
||||||
|
while (*s)
|
||||||
|
uart_putc(*s++);
|
||||||
|
|
||||||
|
}/* uart_puts */
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Function: uart_puts_p()
|
||||||
|
Purpose: transmit string from program memory to UART
|
||||||
|
Input: program memory string to be transmitted
|
||||||
|
Returns: none
|
||||||
|
**************************************************************************/
|
||||||
|
void uart_puts_p(const char *progmem_s )
|
||||||
|
{
|
||||||
|
register char c;
|
||||||
|
|
||||||
|
while ( (c = pgm_read_byte(progmem_s++)) )
|
||||||
|
uart_putc(c);
|
||||||
|
|
||||||
|
}/* uart_puts_p */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* these functions are only for ATmegas with two USART
|
||||||
|
*/
|
||||||
|
#if defined( ATMEGA_USART1 )
|
||||||
|
|
||||||
|
ISR(UART1_RECEIVE_INTERRUPT)
|
||||||
|
/*************************************************************************
|
||||||
|
Function: UART1 Receive Complete interrupt
|
||||||
|
Purpose: called when the UART1 has received a character
|
||||||
|
**************************************************************************/
|
||||||
|
{
|
||||||
|
unsigned char tmphead;
|
||||||
|
unsigned char data;
|
||||||
|
unsigned char usr;
|
||||||
|
unsigned char lastRxError;
|
||||||
|
|
||||||
|
|
||||||
|
/* read UART status register and UART data register */
|
||||||
|
usr = UART1_STATUS;
|
||||||
|
data = UART1_DATA;
|
||||||
|
|
||||||
|
/* get FEn (Frame Error) DORn (Data OverRun) UPEn (USART Parity Error) bits */
|
||||||
|
lastRxError = usr & (_BV(FE1)|_BV(DOR1)|_BV(UPE1) );
|
||||||
|
|
||||||
|
/* calculate buffer index */
|
||||||
|
tmphead = ( UART1_RxHead + 1) & UART_RX_BUFFER_MASK;
|
||||||
|
|
||||||
|
if ( tmphead == UART1_RxTail ) {
|
||||||
|
/* error: receive buffer overflow */
|
||||||
|
lastRxError = UART_BUFFER_OVERFLOW >> 8;
|
||||||
|
}else{
|
||||||
|
/* store new index */
|
||||||
|
UART1_RxHead = tmphead;
|
||||||
|
/* store received data in buffer */
|
||||||
|
UART1_RxBuf[tmphead] = data;
|
||||||
|
}
|
||||||
|
UART1_LastRxError |= lastRxError;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ISR(UART1_TRANSMIT_INTERRUPT)
|
||||||
|
/*************************************************************************
|
||||||
|
Function: UART1 Data Register Empty interrupt
|
||||||
|
Purpose: called when the UART1 is ready to transmit the next byte
|
||||||
|
**************************************************************************/
|
||||||
|
{
|
||||||
|
unsigned char tmptail;
|
||||||
|
|
||||||
|
|
||||||
|
if ( UART1_TxHead != UART1_TxTail) {
|
||||||
|
/* calculate and store new buffer index */
|
||||||
|
tmptail = (UART1_TxTail + 1) & UART_TX_BUFFER_MASK;
|
||||||
|
UART1_TxTail = tmptail;
|
||||||
|
/* get one byte from buffer and write it to UART */
|
||||||
|
UART1_DATA = UART1_TxBuf[tmptail]; /* start transmission */
|
||||||
|
}else{
|
||||||
|
/* tx buffer empty, disable UDRE interrupt */
|
||||||
|
UART1_CONTROL &= ~_BV(UART1_UDRIE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Function: uart1_init()
|
||||||
|
Purpose: initialize UART1 and set baudrate
|
||||||
|
Input: baudrate using macro UART_BAUD_SELECT()
|
||||||
|
Returns: none
|
||||||
|
**************************************************************************/
|
||||||
|
void uart1_init(unsigned int baudrate)
|
||||||
|
{
|
||||||
|
UART1_TxHead = 0;
|
||||||
|
UART1_TxTail = 0;
|
||||||
|
UART1_RxHead = 0;
|
||||||
|
UART1_RxTail = 0;
|
||||||
|
|
||||||
|
#ifdef UART_TEST
|
||||||
|
#ifndef UART1_BIT_U2X
|
||||||
|
#warning "UART1_BIT_U2X not defined"
|
||||||
|
#endif
|
||||||
|
#ifndef UART1_UBRRH
|
||||||
|
#warning "UART1_UBRRH not defined"
|
||||||
|
#endif
|
||||||
|
#ifndef UART1_CONTROLC
|
||||||
|
#warning "UART1_CONTROLC not defined"
|
||||||
|
#endif
|
||||||
|
#if defined(URSEL) || defined(URSEL1)
|
||||||
|
#ifndef UART1_BIT_URSEL
|
||||||
|
#warning "UART1_BIT_URSEL not defined"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set baud rate */
|
||||||
|
if ( baudrate & 0x8000 )
|
||||||
|
{
|
||||||
|
#if UART1_BIT_U2X
|
||||||
|
UART1_STATUS = (1<<UART1_BIT_U2X); //Enable 2x speed
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
UART1_UBRRH = (unsigned char)((baudrate>>8)&0x80) ;
|
||||||
|
UART1_UBRRL = (unsigned char) baudrate;
|
||||||
|
|
||||||
|
/* Enable USART receiver and transmitter and receive complete interrupt */
|
||||||
|
UART1_CONTROL = _BV(UART1_BIT_RXCIE)|(1<<UART1_BIT_RXEN)|(1<<UART1_BIT_TXEN);
|
||||||
|
|
||||||
|
/* Set frame format: asynchronous, 8data, no parity, 1stop bit */
|
||||||
|
#ifdef UART1_BIT_URSEL
|
||||||
|
UART1_CONTROLC = (1<<UART1_BIT_URSEL)|(1<<UART1_BIT_UCSZ1)|(1<<UART1_BIT_UCSZ0);
|
||||||
|
#else
|
||||||
|
UART1_CONTROLC = (1<<UART1_BIT_UCSZ1)|(1<<UART1_BIT_UCSZ0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}/* uart_init */
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Function: uart1_getc()
|
||||||
|
Purpose: return byte from ringbuffer
|
||||||
|
Returns: lower byte: received byte from ringbuffer
|
||||||
|
higher byte: last receive error
|
||||||
|
**************************************************************************/
|
||||||
|
unsigned int uart1_getc(void)
|
||||||
|
{
|
||||||
|
unsigned char tmptail;
|
||||||
|
unsigned int data;
|
||||||
|
unsigned char lastRxError;
|
||||||
|
|
||||||
|
|
||||||
|
if ( UART1_RxHead == UART1_RxTail ) {
|
||||||
|
return UART_NO_DATA; /* no data available */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* calculate buffer index */
|
||||||
|
tmptail = (UART1_RxTail + 1) & UART_RX_BUFFER_MASK;
|
||||||
|
|
||||||
|
/* get data from receive buffer */
|
||||||
|
data = UART1_RxBuf[tmptail];
|
||||||
|
lastRxError = UART1_LastRxError;
|
||||||
|
|
||||||
|
/* store buffer index */
|
||||||
|
UART1_RxTail = tmptail;
|
||||||
|
|
||||||
|
UART1_LastRxError = 0;
|
||||||
|
return (lastRxError << 8) + data;
|
||||||
|
|
||||||
|
}/* uart1_getc */
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Function: uart1_putc()
|
||||||
|
Purpose: write byte to ringbuffer for transmitting via UART
|
||||||
|
Input: byte to be transmitted
|
||||||
|
Returns: none
|
||||||
|
**************************************************************************/
|
||||||
|
void uart1_putc(unsigned char data)
|
||||||
|
{
|
||||||
|
unsigned char tmphead;
|
||||||
|
|
||||||
|
|
||||||
|
tmphead = (UART1_TxHead + 1) & UART_TX_BUFFER_MASK;
|
||||||
|
|
||||||
|
while ( tmphead == UART1_TxTail ){
|
||||||
|
;/* wait for free space in buffer */
|
||||||
|
}
|
||||||
|
|
||||||
|
UART1_TxBuf[tmphead] = data;
|
||||||
|
UART1_TxHead = tmphead;
|
||||||
|
|
||||||
|
/* enable UDRE interrupt */
|
||||||
|
UART1_CONTROL |= _BV(UART1_UDRIE);
|
||||||
|
|
||||||
|
}/* uart1_putc */
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Function: uart1_puts()
|
||||||
|
Purpose: transmit string to UART1
|
||||||
|
Input: string to be transmitted
|
||||||
|
Returns: none
|
||||||
|
**************************************************************************/
|
||||||
|
void uart1_puts(const char *s )
|
||||||
|
{
|
||||||
|
while (*s)
|
||||||
|
uart1_putc(*s++);
|
||||||
|
|
||||||
|
}/* uart1_puts */
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Function: uart1_puts_p()
|
||||||
|
Purpose: transmit string from program memory to UART1
|
||||||
|
Input: program memory string to be transmitted
|
||||||
|
Returns: none
|
||||||
|
**************************************************************************/
|
||||||
|
void uart1_puts_p(const char *progmem_s )
|
||||||
|
{
|
||||||
|
register char c;
|
||||||
|
|
||||||
|
while ( (c = pgm_read_byte(progmem_s++)) )
|
||||||
|
uart1_putc(c);
|
||||||
|
|
||||||
|
}/* uart1_puts_p */
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
207
src/uart/uart.h
Normal file
207
src/uart/uart.h
Normal file
|
@ -0,0 +1,207 @@
|
||||||
|
#ifndef UART_H
|
||||||
|
#define UART_H
|
||||||
|
/************************************************************************
|
||||||
|
Title: Interrupt UART library with receive/transmit circular buffers
|
||||||
|
Author: Peter Fleury <pfleury@gmx.ch> http://tinyurl.com/peterfleury
|
||||||
|
File: $Id: uart.h,v 1.13 2015/01/11 13:53:25 peter Exp $
|
||||||
|
Software: AVR-GCC 4.x, AVR Libc 1.4 or higher
|
||||||
|
Hardware: any AVR with built-in UART/USART
|
||||||
|
Usage: see Doxygen manual
|
||||||
|
|
||||||
|
LICENSE:
|
||||||
|
Copyright (C) 2015 Peter Fleury, GNU General Public License Version 3
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @defgroup pfleury_uart UART Library <uart.h>
|
||||||
|
* @code #include <uart.h> @endcode
|
||||||
|
*
|
||||||
|
* @brief Interrupt UART library using the built-in UART with transmit and receive circular buffers.
|
||||||
|
*
|
||||||
|
* This library can be used to transmit and receive data through the built in UART.
|
||||||
|
*
|
||||||
|
* An interrupt is generated when the UART has finished transmitting or
|
||||||
|
* receiving a byte. The interrupt handling routines use circular buffers
|
||||||
|
* for buffering received and transmitted data.
|
||||||
|
*
|
||||||
|
* The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE constants define
|
||||||
|
* the size of the circular buffers in bytes. Note that these constants must be a power of 2.
|
||||||
|
* You may need to adapt these constants to your target and your application by adding
|
||||||
|
* CDEFS += -DUART_RX_BUFFER_SIZE=nn -DUART_TX_BUFFER_SIZE=nn to your Makefile.
|
||||||
|
*
|
||||||
|
* @note Based on Atmel Application Note AVR306
|
||||||
|
* @author Peter Fleury pfleury@gmx.ch http://tinyurl.com/peterfleury
|
||||||
|
* @copyright (C) 2015 Peter Fleury, GNU General Public License Version 3
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
#if (__GNUC__ * 100 + __GNUC_MINOR__) < 405
|
||||||
|
#error "This library requires AVR-GCC 4.5 or later, update to newer AVR-GCC compiler !"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**@{*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** constants and macros
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @brief UART Baudrate Expression
|
||||||
|
* @param xtalCpu system clock in Mhz, e.g. 4000000UL for 4Mhz
|
||||||
|
* @param baudRate baudrate in bps, e.g. 1200, 2400, 9600
|
||||||
|
*/
|
||||||
|
#define UART_BAUD_SELECT(baudRate,xtalCpu) (((xtalCpu) + 8UL * (baudRate)) / (16UL * (baudRate)) -1UL)
|
||||||
|
|
||||||
|
/** @brief UART Baudrate Expression for ATmega double speed mode
|
||||||
|
* @param xtalCpu system clock in Mhz, e.g. 4000000UL for 4Mhz
|
||||||
|
* @param baudRate baudrate in bps, e.g. 1200, 2400, 9600
|
||||||
|
*/
|
||||||
|
#define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) ( ((((xtalCpu) + 4UL * (baudRate)) / (8UL * (baudRate)) -1UL)) | 0x8000)
|
||||||
|
|
||||||
|
/** @brief Size of the circular receive buffer, must be power of 2
|
||||||
|
*
|
||||||
|
* You may need to adapt this constant to your target and your application by adding
|
||||||
|
* CDEFS += -DUART_RX_BUFFER_SIZE=nn to your Makefile.
|
||||||
|
*/
|
||||||
|
#ifndef UART_RX_BUFFER_SIZE
|
||||||
|
#define UART_RX_BUFFER_SIZE 32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @brief Size of the circular transmit buffer, must be power of 2
|
||||||
|
*
|
||||||
|
* You may need to adapt this constant to your target and your application by adding
|
||||||
|
* CDEFS += -DUART_TX_BUFFER_SIZE=nn to your Makefile.
|
||||||
|
*/
|
||||||
|
#ifndef UART_TX_BUFFER_SIZE
|
||||||
|
#define UART_TX_BUFFER_SIZE 32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* test if the size of the circular buffers fits into SRAM */
|
||||||
|
#if ( (UART_RX_BUFFER_SIZE+UART_TX_BUFFER_SIZE) >= (RAMEND-0x60 ) )
|
||||||
|
#error "size of UART_RX_BUFFER_SIZE + UART_TX_BUFFER_SIZE larger than size of SRAM"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** high byte error return code of uart_getc()
|
||||||
|
*/
|
||||||
|
#define UART_FRAME_ERROR 0x1000 /**< @brief Framing Error by UART */
|
||||||
|
#define UART_OVERRUN_ERROR 0x0800 /**< @brief Overrun condition by UART */
|
||||||
|
#define UART_PARITY_ERROR 0x0400 /**< @brief Parity Error by UART */
|
||||||
|
#define UART_BUFFER_OVERFLOW 0x0200 /**< @brief receive ringbuffer overflow */
|
||||||
|
#define UART_NO_DATA 0x0100 /**< @brief no receive data available */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** function prototypes
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Initialize UART and set baudrate
|
||||||
|
@param baudrate Specify baudrate using macro UART_BAUD_SELECT()
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
extern void uart_init(unsigned int baudrate);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get received byte from ringbuffer
|
||||||
|
*
|
||||||
|
* Returns in the lower byte the received character and in the
|
||||||
|
* higher byte the last receive error.
|
||||||
|
* UART_NO_DATA is returned when no data is available.
|
||||||
|
*
|
||||||
|
* @return lower byte: received byte from ringbuffer
|
||||||
|
* @return higher byte: last receive status
|
||||||
|
* - \b 0 successfully received data from UART
|
||||||
|
* - \b UART_NO_DATA
|
||||||
|
* <br>no receive data available
|
||||||
|
* - \b UART_BUFFER_OVERFLOW
|
||||||
|
* <br>Receive ringbuffer overflow.
|
||||||
|
* We are not reading the receive buffer fast enough,
|
||||||
|
* one or more received character have been dropped
|
||||||
|
* - \b UART_OVERRUN_ERROR
|
||||||
|
* <br>Overrun condition by UART.
|
||||||
|
* A character already present in the UART UDR register was
|
||||||
|
* not read by the interrupt handler before the next character arrived,
|
||||||
|
* one or more received characters have been dropped.
|
||||||
|
* - \b UART_FRAME_ERROR
|
||||||
|
* <br>Framing Error by UART
|
||||||
|
*/
|
||||||
|
extern unsigned int uart_getc(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Put byte to ringbuffer for transmitting via UART
|
||||||
|
* @param data byte to be transmitted
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
extern void uart_putc(unsigned char data);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Put string to ringbuffer for transmitting via UART
|
||||||
|
*
|
||||||
|
* The string is buffered by the uart library in a circular buffer
|
||||||
|
* and one character at a time is transmitted to the UART using interrupts.
|
||||||
|
* Blocks if it can not write the whole string into the circular buffer.
|
||||||
|
*
|
||||||
|
* @param s string to be transmitted
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
extern void uart_puts(const char *s );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Put string from program memory to ringbuffer for transmitting via UART.
|
||||||
|
*
|
||||||
|
* The string is buffered by the uart library in a circular buffer
|
||||||
|
* and one character at a time is transmitted to the UART using interrupts.
|
||||||
|
* Blocks if it can not write the whole string into the circular buffer.
|
||||||
|
*
|
||||||
|
* @param s program memory string to be transmitted
|
||||||
|
* @return none
|
||||||
|
* @see uart_puts_P
|
||||||
|
*/
|
||||||
|
extern void uart_puts_p(const char *s );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro to automatically put a string constant into program memory
|
||||||
|
*/
|
||||||
|
#define uart_puts_P(__s) uart_puts_p(PSTR(__s))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @brief Initialize USART1 (only available on selected ATmegas) @see uart_init */
|
||||||
|
extern void uart1_init(unsigned int baudrate);
|
||||||
|
/** @brief Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc */
|
||||||
|
extern unsigned int uart1_getc(void);
|
||||||
|
/** @brief Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc */
|
||||||
|
extern void uart1_putc(unsigned char data);
|
||||||
|
/** @brief Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts */
|
||||||
|
extern void uart1_puts(const char *s );
|
||||||
|
/** @brief Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p */
|
||||||
|
extern void uart1_puts_p(const char *s );
|
||||||
|
/** @brief Macro to automatically put a string constant into program memory */
|
||||||
|
#define uart1_puts_P(__s) uart1_puts_p(PSTR(__s))
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
|
||||||
|
#endif // UART_H
|
||||||
|
|
Loading…
Reference in a new issue