############################################################################## # # # Teacup - Lean and efficient firmware for RepRap printers # # # # by Triffid Hunter, Traumflug, jakepoz, many others. # # # # This firmware is Copyright (c) ... # # 2009 - 2010 Michael Moon aka Triffid_Hunter # # 2010 - 2013 Markus "Traumflug" Hitter # # # # 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 # # (at your option) 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. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # # ############################################################################## ############################################################################## # # # Makefile for ARM targets. Use it with # # # # make -f Makefile-ARM # # # # or copy/link it to Makefile for convenience. # # # ############################################################################## ############################################################################## # # # Change these to suit your hardware # # # ############################################################################## MCU ?= lpc1114 # MCU ?= stm32f411 # some size parameters. Not important for flashing and compiling. ifeq ($(MCU), lpc1114) FLASH_SIZE = 32 RAM_SIZE = 4 else ifeq ($(MCU), stm32f411) FLASH_SIZE = 512 RAM_SIZE = 128 endif # CPU clock rate not defined here, but in the CMSIS headers. ############################################################################## # # # Where to find your compiler and linker. Later, this is completed like # # CC = $(TOOLCHAIN)gcc # # # ############################################################################## TOOLCHAIN = arm-none-eabi- # TOOLCHAIN = /hardware/tools/gcc-arm-none-eabi-4.8.3-2014q1/bin/arm-none-eabi- ############################################################################## # # # Programmer settings for "make program" # # # ############################################################################## # Unlike with AVR, there is no one tool for uploading to all chips. Some # need 'lpc21isp', others (e.g. Arduinos) need 'bossac'. # # To deal with this, we simply define the port here and do the rest directly # in the rules for the 'program' target. # Frequency of the on-chip R/C oscillator or the on-board quartz crystal. # Not to confuse with the CPU's clock frequency, which is usually much higher. F_CRYSTAL ?= 12000000 # This is your uploader with any option before your uploadfile $< # and your uploadfile (hex, bin or whatelse) ifeq ($(MCU), lpc1114) UPLOADER ?= lpc21isp -control UPLOAD_FILE = $(PROGRAM).hex else ifeq ($(MCU), stm32f411) UPLOADER ?= st-flash --reset write UPLOAD_FILE = $(BUILDDIR)/$(PROGRAM).bin endif ifeq ($(MCU), lpc1114) UPLOADER_FLAGS = $(UPLOADER_PORT) UPLOADER_FLAGS += 115200 UPLOADER_FLAGS += $(F_CRYSTAL) else ifeq ($(MCU), stm32f411) UPLOADER_FLAGS = 0x8000000 endif # Serial port the electronics is connected to. #UPLOADER_PORT ?= /dev/ttyUSB0 UPLOADER_PORT ?= /dev/ttyACM0 #UPLOADER_PORT ?= com1 ############################################################################## # # # Below here, defaults should be ok. # # # ############################################################################## PROGRAM = teacup # The thing we build by default, and also the thing we clean. TARGET = $(PROGRAM).hex # Arduino IDE takes the "compile everything available"-approach, so we have # to keep this working and can take a shortcut: SOURCES = $(wildcard *.c) # Other target MCU specific adjustments: ifeq ($(MCU), lpc1114) STARTUP_FILE = cmsis-startup_lpc11xx.s else ifeq ($(MCU), stm32f411) STARTUP_FILE = cmsis-startup_stm32f411xe.s endif # Link time optimization is on by default ifeq ($(USE_FLTO),) USE_FLTO=yes endif # Startup definitions. Not target MCU specific. CFLAGS = -D__STARTUP_CLEAR_BSS -D__START=main ifeq ($(MCU), lpc1114) CFLAGS += -mthumb -mcpu=cortex-m0 CFLAGS += -mtune=cortex-m0 CFLAGS += -D__ARM_LPC1114__ else ifeq ($(MCU), stm32f411) CFLAGS += -mthumb -mcpu=cortex-m4 CFLAGS += -mtune=cortex-m4 CFLAGS += -D__ARM_STM32F411__ CFLAGS += -mfpu=fpv4-sp-d16 CFLAGS += -mfloat-abi=hard CFLAGS += -mlittle-endian CFLAGS += -D__FPU_PRESENT=1 CFLAGS += -fomit-frame-pointer endif # Other options ... CFLAGS += -Wall CFLAGS += -Wstrict-prototypes CFLAGS += -Os ifeq ($(USE_FLTO),yes) CFLAGS += -flto endif CFLAGS += -ffunction-sections CFLAGS += -fdata-sections #CFLAGS += -dM -E # To list all predefined macros into the .o file. LDFLAGS = --specs=nano.specs LDFLAGS += --specs=nosys.specs ifeq ($(MCU), lpc1114) LDFLAGS += -T cmsis-lpc1114.ld else ifeq ($(MCU), stm32f411) LDFLAGS += -T cmsis-stm32f411xe.ld endif LDFLAGS += -Wl,--as-needed LDFLAGS += -Wl,--gc-sections LIBS = -lm -include Makefile-common # Architecture specific targets .PHONY: all program size all: $(PROGRAM).hex $(BUILDDIR)/$(PROGRAM).lst $(BUILDDIR)/$(PROGRAM).sym size # TODO: The echo is only for Gen7-ARM LPC1114. The stm flashes don't need this. # This message could confuse someone. Remove this message for stm or write some # friendly text for it. ifeq ($(MCU), lpc1114) define upload_echo @echo @echo "To let the bootloader complete his work, connect now PIO0_1 to GND," @echo "then press Reset for a moment. The bootloader should begin uploading." @echo "After being done, disconnect PIO0_1 and press reset again. On a" @echo "Gen7-ARM, PIO0_1 is the Step pin of the Z stepper driver." @echo endef else ifeq ($(MCU), stm32f411) define upload_echo @echo @echo "Starting upload..." @echo "This should normally take no time." @echo endef endif program: $(UPLOAD_FILE) config.h $(call upload_echo) $(UPLOADER) $< $(UPLOADER_FLAGS) $(BUILDDIR)/teacup.elf: $(BUILDDIR)/startup.o $(BUILDDIR)/startup.o: $(STARTUP_FILE) | $(BUILDDIR) @echo " CC $@" @$(CC) -c $(CFLAGS) -o $@ $< ## Interpret TARGET section sizes wrt different ARM chips ## Usage: $(call show_size,section-name,section-regex,lpc1114-size-in-k) define show_size @$(OBJDUMP) -h $^ | \ perl -MPOSIX -ne \ '/.($2)\s+([0-9a-f]+)/ && do { $$a += eval "0x$$2" }; \ END { printf " %-7s: %5d bytes %3d%%\n", "$1", $$a, \ ceil($$a * 100 / ($3 * 1024)), \ }' endef size: $(BUILDDIR)/$(PROGRAM).elf @echo " SIZES ARM... $(MCU)" $(call show_size,FLASH,text,$(FLASH_SIZE)) $(call show_size,RAM,data|bss,$(RAM_SIZE)) $(call show_size,EEPROM,eeprom,0.0001)