Makefile générique pour AVR-GCC qui fait le café

La version précédente était un peu lourde pour des petits projets. Voici une nouvelle version[1] nettement plus simple, il suffit de renseigner la variable FIRMWARE (le nom du projet), le type de micro-contrôleur (MCU) et la fréquence de l’oscillateur. Cerise sur le gâteau, il fait même le café.

Notes

[1] Compatible avec gmake uniquement

La partie flashage utilise Avrdude. Elle est prévue pour MacOS (Darwin) et FreeBSD avec un adaptateur ISP USB. Il faudra probablement l’adapter à votre environnement (OS et modèle de programmateur).
Les règles disponibles sont:

  • all: construit le projet (génération du fichier HEX). C’est la règle par défaut
  • coffee: idem + flashe et vérifie la puce, configure les fusibles et nettoie tout en sortant.
  • asm: génère un fichier assembleur pour le projet
  • bin: génère un fichier binaire pour le projet
  • verify: Vérifie le contenu de la cible
  • erase: efface le contenu de la cible
  • rfuse: lit la valeur des fusibles
  • wfuse: configure les fusibles de la cible
  • load: charge le fichier HEX dans la cible
  • dump: génère un fichier HEX depuis la cible
  • clean: nettoyage du projet
  • mrproper: nettoyage de printemps
  • archive: archivage du projet
#
# $Id: Makefile,v 1.3 2011/04/08 12:43:06 luc Exp luc $
#

FIRMWARE	:=WOPR-V2
MCU		:=attiny2313
#HZ		:=10000000
HZ		:=8000000
#
# Valeurs des fusibles
LFUSE		:=0xce
HFUSE		:=0xdf

#
# Vous ne devriez pas avoir besoin de modifier ce qui suit
CC		:=avr-gcc
OBJCOPY		:=avr-objcopy
CFLAGS		:=-Os -D F_CPU=$(HZ)
CFLAGS		+=-g -mmcu=$(MCU) -Wall -Wstrict-prototypes
HEADERS         := $(wildcard *.h)
SOURCES         := $(wildcard *.c)
OBJECTS         := $(patsubst %.c,%.o,$(SOURCES))

all: $(FIRMWARE).hex

coffee: all load verify wfuse mrproper
	@echo "All is nice. Have a good day."

$(FIRMWARE).hex: $(FIRMWARE).out
	@printf "Generating $(FIRMWARE).hex..."
	@$(OBJCOPY) -R .eeprom -O ihex $(FIRMWARE).out
		$(FIRMWARE).hex
	@echo "done."

$(FIRMWARE).out: $(OBJECTS)
	@printf "Linking    $(FIRMWARE)..."
	@$(CC) $(CFLAGS) -o $(FIRMWARE).out
		-Wl,-Map,$(FIRMWARE).map $(OBJECTS)
	@echo "done."

.c.o:
	@printf "Compiling  $<..."
	@$(CC) $(CFLAGS) -Os -c $< -o $@
	@echo "done."

asm: $(FIRMWARE).out
	@printf "Generating assembler source file..."
	@avr-objdump -D -S $(FIRMWARE).out > $(FIRMWARE).s
	@echo "done."

bin: $(FIRMWARE).out
	@printf "Generating $(FIRMWARE).hex..."
	@$(OBJCOPY) -R .eeprom -O binary $(FIRMWARE).out
		$(FIRMWARE).bin
	@echo "done."
#
# Configuration du programmateur ISP
LOADER=avrdude

ifeq ($(shell uname -s), FreeBSD)
ISP=-c stk500v2 -P /dev/cuaU0		# Programmateur USB
#ISP	:=-c stk200 -P /dev/ppi0	# Programmateur CENTRONIX
endif

ifeq ($(shell uname -s), Darwin)
MODEM	:= $(shell ([-c /dev/tty*usbmodem* ] && ls /dev/tty*usbmodem*))
ISP	:=-c stk500v2 -P $(MODEM)
endif

LOADER	:=$(LOADER) -p $(MCU) $(ISP)
LOAD	:=$(LOADER) -i 5 -U flash:w:$(FIRMWARE).hex
DUMP	:=$(LOADER) -i 5 -U flash:r:$(FIRMWARE).hex:i
VERIFY	:=$(LOADER) -i 5 -U flash:v:$(FIRMWARE).hex
ERASE	:=$(LOADER) -i 5 -e
RFUSE	:=$(LOADER) -U lfuse:r:low.txt:b -U hfuse:r:high.txt:b
WFUSE	:=$(LOADER) -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m

load:
	@printf "Loading firmware..."
	@$(LOAD) > /dev/null 2>&1
	@echo "done."
dump:
	@printf "Reading $(MCU) device..."
	@$(DUMP) > /dev/null 2>&1
	@echo "done."
verify:
	@printf "Verify $(MCU) device..."
	@$(VERIFY) > /dev/null 2>&1
	@echo "done."
erase:
	@printf "Erasing $(MCU) device..."
	@$(ERASE) > /dev/null 2>&1
	@echo "done."
rfuse:
	@printf "Reading fuse..."
	@$(RFUSE) > /dev/null 2>&1
	@echo "done."
wfuse:
	@printf "Writing fuse..."
	@$(WFUSE) > /dev/null 2>&1
	@echo "done."
#
# Nettoyage, Archivage, etc.
clean :
	@printf "Cleaning source tree..."
	@rm -f *.map *.bin *~ *.out *.gch *.o
		$(FIRMWARE) $(FIRMWARE).asm
	@echo "done."

mrproper : clean
	@rm -f *.hex

archive: mrproper
	@tar cvzf ../$(FIRMWARE).tgz ../$(FIRMWARE)
#EOF

Sur MacOS, j’utilise la distribution CrossPack AVR d’Objective Development. Du coup, les binaires du compilateur ne sont pas dans le PATH. Il suffit de modifier le makefile comme suit:

ifeq ($(shell uname -s), Darwin)
CCPATH		:=/usr/local/CrossPack-AVR/bin
else
CCPATH		:=/usr/local/bin
endif
CC		:=$(CCPATH)/avr-gcc
OBJCOPY		:=$(CCPATH)/avr-objcopy

2 thoughts on “Makefile générique pour AVR-GCC qui fait le café

  1. J’apprécie vraiment le genre de sujets que vous postez ici. Merci pour partager des informations entre nous une grande qui est réellement utile. Bonne journée!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>