|
|
|
#############################################
|
|
|
|
|
|
|
|
# CPU type
|
|
|
|
MCU = atmega328p
|
|
|
|
|
|
|
|
# CPU frequency [Hz]
|
|
|
|
F_CPU = 16000000
|
|
|
|
|
|
|
|
# Fuses (refer to datasheet)
|
|
|
|
LFUSE = 0xFF
|
|
|
|
HFUSE = 0xDE
|
|
|
|
EFUSE = 0x05
|
|
|
|
|
|
|
|
# AVRDUDE settings
|
|
|
|
PROG_BAUD = 57600
|
|
|
|
PROG_DEV = /dev/ttyUSB0
|
|
|
|
PROG_TYPE = arduino
|
|
|
|
|
|
|
|
# Build the final AVRDUDE arguments
|
|
|
|
PROG_ARGS = -c $(PROG_TYPE) -p $(MCU) -b $(PROG_BAUD) -P $(PROG_DEV)
|
|
|
|
|
|
|
|
#############################################
|
|
|
|
|
|
|
|
# Main file
|
|
|
|
BINARY = main
|
|
|
|
|
|
|
|
# Obj files to be built <- add .o for any .c files you add!
|
|
|
|
OBJS = $(BINARY).o
|
|
|
|
OBJS += lib/usart.o
|
|
|
|
OBJS += lib/iopins.o
|
|
|
|
OBJS += lib/spi.o
|
|
|
|
OBJS += lib/adc.o
|
|
|
|
|
|
|
|
# Dirs with header files
|
|
|
|
INCL_DIRS = . lib/
|
|
|
|
|
|
|
|
# Pre-defined macros
|
|
|
|
DEFS = -DF_CPU=$(F_CPU)UL
|
|
|
|
|
|
|
|
#############################################
|
|
|
|
|
|
|
|
# C flags
|
|
|
|
CFLAGS = -std=gnu99 -mmcu=$(MCU) $(DEFS) $(INCL_DIRS:%=-I%)
|
|
|
|
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -ffreestanding
|
|
|
|
CFLAGS += -Wall -Wno-main -Wno-strict-prototypes -Wno-comment
|
|
|
|
CFLAGS += -g2 -Wextra -Wfatal-errors -Wno-unused-but-set-variable
|
|
|
|
CFLAGS += -ffunction-sections -fdata-sections -Os
|
|
|
|
|
|
|
|
LDFLAGS = -Wl,--gc-sections -Wl,--relax -lm
|
|
|
|
|
|
|
|
#LD_FLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf
|
|
|
|
LD_FLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf
|
|
|
|
|
|
|
|
#############################################
|
|
|
|
|
|
|
|
## Defined programs / locations
|
|
|
|
CC = avr-gcc
|
|
|
|
OBJCOPY = avr-objcopy
|
|
|
|
OBJDUMP = avr-objdump
|
|
|
|
AVRSIZE = avr-size
|
|
|
|
AVRDUDE = avrdude
|
|
|
|
|
|
|
|
JUNK = *.o *.d *.elf *.bin *.hex *.srec *.list *.lst *.map *.dis *.disasm *.eep *.eeprom *.lss
|
|
|
|
|
|
|
|
.SUFFIXES: .elf .bin .hex .lst .map .eeprom .pre
|
|
|
|
.SECONDEXPANSION:
|
|
|
|
.SECONDARY:
|
|
|
|
|
|
|
|
.PHONY: all elf bin hex lst pre ee eeprom dis size clean flash flashe shell fuses show_fuses set_default_fuses
|
|
|
|
|
|
|
|
all: hex size
|
|
|
|
|
|
|
|
elf: $(BINARY).elf
|
|
|
|
bin: $(BINARY).bin
|
|
|
|
hex: $(BINARY).hex
|
|
|
|
lst: $(BINARY).lst
|
|
|
|
pre: $(BINARY).pre
|
|
|
|
ee: $(BINARY).eeprom
|
|
|
|
eeprom: $(BINARY).eeprom
|
|
|
|
dis: lst
|
|
|
|
|
|
|
|
# Show how big the resulting program is
|
|
|
|
size: elf
|
|
|
|
$(AVRSIZE) -C --mcu=$(MCU) $(BINARY).elf
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# --- Magic build targets ----------------
|
|
|
|
|
|
|
|
%.hex: %.elf
|
|
|
|
$(OBJCOPY) -R .eeprom -O ihex $< $@
|
|
|
|
|
|
|
|
%.elf %.map: $(OBJS)
|
|
|
|
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o $(*).elf
|
|
|
|
|
|
|
|
%.pre: %.c
|
|
|
|
$(CC) $(CFLAGS) -E $(*).c --output $@
|
|
|
|
|
|
|
|
%.eeprom: %.elf
|
|
|
|
$(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@
|
|
|
|
|
|
|
|
%.lst: %.elf
|
|
|
|
$(Q)$(OBJDUMP) -S $(*).elf > $(*).lst
|
|
|
|
|
|
|
|
%.o: %.c
|
|
|
|
$(CC) $(CFLAGS) -o $(*).o -c $(*).c
|
|
|
|
|
|
|
|
%.o: %.s
|
|
|
|
$(CC) $(CFLAGS) -o $(*).o -c $(*).s
|
|
|
|
|
|
|
|
|
|
|
|
# Clean all produced trash
|
|
|
|
clean:
|
|
|
|
rm -f $(JUNK)
|
|
|
|
cd lib && rm -f $(JUNK)
|
|
|
|
|
|
|
|
|
|
|
|
## === avrdude ===
|
|
|
|
|
|
|
|
flash: $(BINARY).hex
|
|
|
|
$(AVRDUDE) $(PROG_ARGS) -U flash:w:$<
|
|
|
|
|
|
|
|
flashe: $(BINARY).eeprom
|
|
|
|
$(AVRDUDE) $(PROG_ARGS) -U eeprom:w:$<
|
|
|
|
|
|
|
|
shell:
|
|
|
|
$(AVRDUDE) $(PROG_ARGS) -nt
|
|
|
|
|
|
|
|
# === fuses ===
|
|
|
|
|
|
|
|
# this may not work with the arduino programmer, I haven't tried.
|
|
|
|
|
|
|
|
FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m
|
|
|
|
|
|
|
|
fuses:
|
|
|
|
$(AVRDUDE) $(PROG_ARGS) $(FUSE_STRING)
|
|
|
|
|
|
|
|
show_fuses:
|
|
|
|
$(AVRDUDE) $(PROG_ARGS) -nv
|