Created
June 15, 2014 15:26
-
-
Save robertcasanova/19f96e1c67fabf465753 to your computer and use it in GitHub Desktop.
Makefile AVR
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
##########------------------------------------------------------########## | |
########## Project-specific Details ########## | |
########## Check these every time you start a new project ########## | |
##########------------------------------------------------------########## | |
MCU = atmega328p | |
F_CPU = 1000000 | |
BAUD = 9600 | |
## Also try BAUD = 19200 or 38400 if you're feeling lucky. | |
## This is where your main() routine lives | |
MAIN = main.c | |
## If you've split your program into multiple .c / .h files, | |
## include the additional source (in same directory) here | |
LOCAL_SOURCE = | |
## Here you can link to one more directory (and multiple .c files) | |
EXTRA_SOURCE_DIR = ../../AVR-Programming-Library/ | |
EXTRA_SOURCE_FILES = USART.c | |
##########------------------------------------------------------########## | |
########## Programmer Defaults ########## | |
########## Set up once, then forget about it ########## | |
########## (Can override. See bottom of file.) ########## | |
##########------------------------------------------------------########## | |
PROGRAMMER_TYPE = usbasp | |
# extra arguments to avrdude: baud rate, chip type, -F flag, etc. | |
PROGRAMMER_ARGS = | |
##########------------------------------------------------------########## | |
########## Makefile Magic! ########## | |
########## Summary: ########## | |
########## We want a .hex file ########## | |
########## Compile source files into .elf ########## | |
########## Convert .elf file into .hex ########## | |
########## You shouldn't need to edit below. ########## | |
##########------------------------------------------------------########## | |
## Defined programs / locations | |
CC = avr-gcc | |
OBJCOPY = avr-objcopy | |
OBJDUMP = avr-objdump | |
AVRSIZE = avr-size | |
AVRDUDE = avrdude | |
## Compilation options, type man avr-gcc if you're curious. | |
CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU)UL -DBAUD=$(BAUD) -Os -I. -I$(EXTRA_SOURCE_DIR) | |
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums | |
CFLAGS += -Wall -Wstrict-prototypes | |
CFLAGS += -g -ggdb | |
CFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,--relax | |
CFLAGS += -std=gnu99 | |
## CFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf | |
## CFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf | |
## Lump target and extra source files together | |
TARGET = $(strip $(basename $(MAIN))) | |
SRC = $(TARGET).c | |
EXTRA_SOURCE = $(addprefix $(EXTRA_SOURCE_DIR), $(EXTRA_SOURCE_FILES)) | |
SRC += $(EXTRA_SOURCE) | |
SRC += $(LOCAL_SOURCE) | |
## List of all header files | |
HEADERS = $(SRC:.c=.h) | |
## For every .c file, compile an .o object file | |
OBJ = $(SRC:.c=.o) | |
## Generic Makefile targets. (Only .hex file is necessary) | |
all: $(TARGET).hex | |
%.hex: %.elf | |
$(OBJCOPY) -R .eeprom -O ihex $< $@ | |
%.elf: $(SRC) | |
$(CC) $(CFLAGS) $(SRC) --output $@ | |
%.eeprom: %.elf | |
$(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ | |
debug: | |
@echo | |
@echo "Source files:" $(SRC) | |
@echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) | |
@echo | |
# Optionally create listing file from .elf | |
# This creates approximate assembly-language equivalent of your code. | |
# Useful for debugging time-sensitive bits, | |
# or making sure the compiler does what you want. | |
disassemble: $(TARGET).lst | |
disasm: disassemble | |
eeprom: $(TARGET).eeprom | |
%.lst: %.elf | |
$(OBJDUMP) -S $< > $@ | |
# Optionally show how big the resulting program is | |
size: $(TARGET).elf | |
$(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf | |
clean: | |
rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ | |
$(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ | |
$(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ | |
$(TARGET).eeprom | |
squeaky_clean: | |
rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ | |
##########------------------------------------------------------########## | |
########## Programmer-specific details ########## | |
########## Flashing code to AVR using avrdude ########## | |
##########------------------------------------------------------########## | |
flash: $(TARGET).hex | |
$(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< | |
## An alias | |
program: flash | |
flash_eeprom: $(TARGET).eeprom | |
$(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< | |
avrdude_terminal: | |
$(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt | |
## If you've got multiple programmers that you use, | |
## you can define them here so that it's easy to switch. | |
## To invoke, use something like `make flash_arduinoISP` | |
flash_usbtiny: PROGRAMMER_TYPE = usbtiny | |
flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments | |
flash_usbtiny: flash | |
flash_usbasp: PROGRAMMER_TYPE = usbasp | |
flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments | |
flash_usbasp: flash | |
flash_arduinoISP: PROGRAMMER_TYPE = avrisp | |
flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 | |
## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 | |
flash_arduinoISP: flash | |
flash_109: PROGRAMMER_TYPE = avr109 | |
flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 | |
flash_109: flash | |
##########------------------------------------------------------########## | |
########## Fuse settings and suitable defaults ########## | |
##########------------------------------------------------------########## | |
## Mega 48, 88, 168, 328 default values | |
LFUSE = 0x62 | |
HFUSE = 0xdf | |
EFUSE = 0x00 | |
## Generic | |
FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m | |
fuses: | |
$(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ | |
$(PROGRAMMER_ARGS) $(FUSE_STRING) | |
show_fuses: | |
$(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv | |
## Called with no extra definitions, sets to defaults | |
set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m | |
set_default_fuses: fuses | |
## Set the fuse byte for full-speed mode | |
## Note: can also be set in firmware for modern chips | |
set_fast_fuse: LFUSE = 0xE2 | |
set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m | |
set_fast_fuse: fuses | |
## Set the EESAVE fuse byte to preserve EEPROM across flashes | |
set_eeprom_save_fuse: HFUSE = 0xD7 | |
set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m | |
set_eeprom_save_fuse: fuses | |
## Clear the EESAVE fuse byte | |
clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m | |
clear_eeprom_save_fuse: fuses |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment