############# program name TARGET = PIR_NEW # program version VER_MAJOR = 0 VER_MINOR = 1 TOOL = arm-none-eabi- # compile options MCU = cortex-m3 OPTIMIZE = -O2 USE_LTO = NO # Select family CHIP = LPC1756 #defines DEFS = -D$(CHIP) DEFS += -DVER_MAJOR=$(VER_MAJOR) DEFS += -DVER_MINOR=$(VER_MINOR) ########################################################### # common part for all my cortex-m3 projects ########################################################### BASE = ../ CC = $(TOOL)gcc CXX = $(TOOL)g++ LD = $(TOOL)gcc AS = $(CC) -x assembler-with-cpp OBJCOPY = $(TOOL)objcopy OBJDUMP = $(TOOL)objdump SIZE = $(TOOL)size -d FLASHER = openocd RM = rm -f CP = cp MD = mkdir # dirs SRCDIR = $(BASE) OBJDIR = obj EXEDIR = exe LSTDIR = lst PRJDIR = prj BAKDIR = bak #files HEX = $(EXEDIR)/$(TARGET).hex BIN = $(EXEDIR)/$(TARGET).bin ELF = $(EXEDIR)/$(TARGET).elf MAP = $(LSTDIR)/$(TARGET).map LSS = $(LSTDIR)/$(TARGET).lss OK = $(EXEDIR)/$(TARGET).ok COMMON = $(BASE)/codesourcery # CMSIS CM3DIR = $(BASE)/cmsis \ $(BASE)/cmsis_boot LPC17DIRS = $(BASE)/lpc17xx_lib # linker script (chip dependent) LD_SCRIPT = $(CHIP).ld # source directories (all *.c, *.cpp and *.S files included) DIRS := $(SRCDIR) DIRS += $(CM3DIR) DIRS += $(LPC17DIRS) DIRS += $(COMMON) DIRS += $(BASE) DIRS += $(BASE)/log DIRS += $(BASE)/at45db081 DIRS += $(BASE)/fatfs DIRS += $(BASE)/freemodbus DIRS += $(BASE)/freertos DIRS += $(BASE)/h DIRS += $(BASE)/in_out DIRS += $(BASE)/LPCUSB DIRS += $(BASE)/syscals # includes INCS := $(patsubst %, -I "%", $(DIRS)) # individual source files SRCS := $(BASE)main.c SRCS += $(BASE)eeprom.c SRCS += $(BASE)rtc_cal.c #calc obj files list OBJS := $(SRCS) OBJS += $(wildcard $(addsuffix /*.cpp, $(DIRS))) OBJS += $(wildcard $(addsuffix /*.c, $(DIRS))) OBJS += $(wildcard $(addsuffix /*.S, $(DIRS))) OBJS := $(notdir $(OBJS)) OBJS := $(OBJS:.cpp=.o) OBJS := $(OBJS:.c=.o) OBJS := $(OBJS:.S=.o) OBJS := $(patsubst %, $(OBJDIR)/%, $(OBJS)) #files to archive ARCFILES = \ $(SRCDIR) \ $(PRJDIR) \ $(SCMDIR) \ $(BASE)/makefile \ $(BASE)/.cproject \ $(BASE)/.project # flags FLAGS = -mcpu=$(MCU) -mthumb FLAGS += $(INCS) FLAGS += -MD FLAGS += $(DEFS) FLAGS += -Wa,-adhlns=$(addprefix $(LSTDIR)/, $(notdir $(addsuffix .lst, $(basename $<)))) AFLAGS = $(FLAGS) WARN = -Wall -Wextra WARN += -Wshadow -Wcast-qual -Wcast-align WARN += -Wredundant-decls WARN += -Wpointer-arith # WARN += -Wunreachable-code # WARN += -pedantic CFLAGS = $(FLAGS) CFLAGS += $(OPTIMIZE) CFLAGS += -std=gnu99 CFLAGS += -g CFLAGS +=-I$(BASE)/freertos/portable CFLAGS +=-I$(BASE)/freertos/include CFLAGS +=-I$(BASE)/lpc17xx_lib/include CFLAGS +=-I$(BASE)/at45db081/header CFLAGS +=-I$(BASE)/cmsis_boot/ CFLAGS +=-I$(BASE)/fatfs/ CFLAGS +=-I$(BASE)/freemodbus/include CFLAGS +=-I$(BASE)/freemodbus/port CFLAGS +=-I$(BASE)/freemodbus/rtu CFLAGS +=-I$(BASE)/freemodbus/ascii CFLAGS +=-I$(BASE)/h CFLAGS +=-I$(BASE)/log CFLAGS +=-I$(BASE)/LPCUSB CFLAGS +=-I$(BASE)/ CFLAGS += -ffunction-sections -fdata-sections CFLAGS += $(WARN) CFLAGS += -Wimplicit CFLAGS += -Wnested-externs CXXFLAGS = $(FLAGS) CXXFLAGS += $(OPTIMIZE) CXXFLAGS += -g CXXFLAGS += -fno-exceptions -fno-rtti CXXFLAGS += -ffunction-sections -fdata-sections CXXFLAGS += -fno-threadsafe-statics CXXFLAGS += -funsigned-bitfields -fshort-enums CXXFLAGS += $(WARN) CXXFLAGS += -Winline LD_FLAGS = -mcpu=$(MCU) LD_FLAGS += -mthumb LD_FLAGS += -nostartfiles LD_FLAGS += -g LD_FLAGS += -lc LD_FLAGS += -lm LD_FLAGS += -Wl,-Map="$(MAP)" LD_FLAGS += -Wl,--gc-sections LD_FLAGS += -T$(LD_SCRIPT) ifeq ($(USE_LTO),YES) CFLAGS += -flto CXXFLAGS += -flto LD_FLAGS += -flto $(OPTIMIZE) endif ######## openocd command-line # reset all hardware by SRST oocd_params_srst = -c "reset_config srst_only" oocd_params_srst += -c "adapter_nsrst_assert_width 10" oocd_params_srst += -c "adapter_nsrst_delay 2" # debug level (d0..d3) oocd_params = -d0 # interface and board/target settings (using the OOCD target-library here) # oocd_params += -c "fast enable" oocd_params += -f interface/jlink.cfg oocd_params += -f $(COMMON)/lpc1766.cfg #oocd_params += $(oocd_params_srst) oocd_params += -c init -c targets oocd_params_program = $(oocd_params) # commands to prepare flash-write oocd_params_program += -c "halt" # flash-write and -verify oocd_params_program += -c "flash write_image erase $(ELF)" # openOCD adds CSUM in addresses 0x1C..0x1F for write only, not for verify # TODO: Insert CSUM into $(EXEDIR)/$(TARGET).bin by srecord # oocd_params_program += -c "verify_image $(ELF)" # reset target oocd_params_program += -c "reset run" # terminate OOCD after programming oocd_params_program += -c shutdown # just reset oocd_params_reset = $(oocd_params) oocd_params_reset += -c "reset run" oocd_params_reset += -c shutdown .SILENT : .PHONY: all start dirs build clean program reset archive ############# targets all : start dirs $(ELF) $(BIN) $(LSS) $(OK) build: clean all start: @echo --- building $(TARGET) $(LSS): $(ELF) makefile @echo --- making asm-lst... # @$(OBJDUMP) -dStC $(ELF) > $(LSS) @$(OBJDUMP) -dC $(ELF) > $(LSS) $(OK): $(ELF) @$(SIZE) $(ELF) @echo "Errors: none" $(ELF): $(OBJS) makefile @echo --- linking... $(LD) $(LD_FLAGS) $(OBJS) -o "$(ELF)" $(HEX): $(ELF) @echo --- make hex... @$(OBJCOPY) -O ihex $(ELF) $(HEX) $(BIN): $(ELF) @echo --- make binary... @$(OBJCOPY) -O binary $(ELF) $(BIN) program: $(ELF) @echo "Programming with OPENOCD" $(FLASHER) $(oocd_params_program) reset: @echo Resetting device $(FLASHER) $(oocd_params_reset) VPATH := $(DIRS) $(OBJDIR)/%.o: %.cpp makefile @echo --- compiling $<... $(CXX) -c $(CXXFLAGS) -o $@ $< $(OBJDIR)/%.o: %.c makefile @echo --- compiling $<... $(CC) -c $(CFLAGS) -o $@ $< $(OBJDIR)/%.o: %.S makefile @echo --- assembling $<... $(AS) -c $(AFLAGS) -o $@ $< dirs: $(OBJDIR) $(EXEDIR) $(LSTDIR) $(BAKDIR) $(OBJDIR): -@$(MD) $(OBJDIR) $(EXEDIR): -@$(MD) $(EXEDIR) $(LSTDIR): -@$(MD) $(LSTDIR) $(BAKDIR): -@$(MD) $(BAKDIR) clean: -@$(RM) $(OBJDIR)/*.d 2>/dev/null -@$(RM) $(OBJDIR)/*.o 2>/dev/null -@$(RM) $(LSTDIR)/*.lst 2>/dev/null -@$(RM) $(ELF) -@$(RM) $(HEX) -@$(RM) $(LSS) -@$(RM) $(MAP) archive: @echo --- archiving... 7z a $(BAKDIR)/$(TARGET)_`date +%Y-%m-%d,%H-%M-%S` $(ARCFILES) @echo --- done! # dependencies ifeq (,$(findstring build,$(MAKECMDGOALS))) ifeq (,$(findstring clean,$(MAKECMDGOALS))) ifeq (,$(findstring dirs,$(MAKECMDGOALS))) -include $(wildcard $(OBJDIR)/*.d) endif endif endif