################################################################
ARCH_FLAGS = -msoft-float -mfloat-abi= soft
ARCH_FLAGS += -mthumb -mcpu= cortex-m3
# Clock speed constants
DEFS += -DF_CPU= 72000000UL
DEFS += -DSTM32F10X_MD
DEFS += -DARM_MATH_CM3
DEFS += -DUSE_STDPERIPH_DRIVER
LDSCRIPT = lib/cmsis/stm32_flash.ld
STARTUP_SCRIPT = lib/cmsis/startup_stm32f10x_md.s
################################################################
# Main file
BINARY = main
# Project include dirs
INCL_DIRS := project
# C files
SOURCES := $( shell find project -type f -name "*.c" )
#SOURCES += $(shell find lib/sbmp/library -type f -name "*.c")
HEADERS := $( shell find project -type f -name "*.h" )
#HEADERS += $(shell find lib/sbmp/library -type f -name "*.h")
#INCL_DIRS += lib/sbmp/library
################################################################
# Add library sources and include paths
LIB_INCL_DIRS =
LIB_SOURCES =
i n c l u d e l i b / C M S I S . m k
i n c l u d e l i b / S P L . m k
i n c l u d e l i b / S B M P . m k
INCL_DIRS += $( LIB_INCL_DIRS)
LIB_OBJS_ = $( LIB_SOURCES:.c= .o)
LIB_OBJS = $( LIB_OBJS_:.S= .o)
# .c -> .o
OBJS = $( SOURCES:%.c= %.o)
OBJS += $( STARTUP_SCRIPT:.s= .o)
LIBNAME = stm32f103spl
LIBFILE = lib/lib$( LIBNAME) .a
################################################################
SUBDIR_ROOTS = .
GARBAGE_PATTERNS := *.o *.d *.elf *.bin *.hex *.srec *.list *.map *.dis *.disasm .depend
DIRS := . $( shell find $( SUBDIR_ROOTS) -type d)
GARBAGE := $( foreach DIR,$( DIRS) ,$( addprefix $( DIR) /,$( GARBAGE_PATTERNS) ) )
###############################################################################
###############################################################################
###############################################################################
# Be silent per default, but 'make V=1' will show all compiler calls.
i f n e q ( $( V ) , 1 )
Q := @
NULL := 2>/dev/null
e n d i f
###############################################################################
# Executables
PREFIX ?= arm-none-eabi
CC := $( PREFIX) -gcc
CXX := $( PREFIX) -g++
LD := $( PREFIX) -gcc
AR := $( PREFIX) -ar
AS := $( PREFIX) -as
OBJCOPY := $( PREFIX) -objcopy
SIZE := $( PREFIX) -size
OBJDUMP := $( PREFIX) -objdump
GDB := $( PREFIX) -gdb
STFLASH := $( shell which st-flash)
###############################################################################
# For CMSIS compatibility
DEFS += -D__weak= "__attribute__((weak))" -D__packed= "__attribute__((__packed__))"
DEFS += -DVERBOSE_LOGGING= 1
###############################################################################
# C flags
CFLAGS += -Os -ggdb -std= gnu99 -Wfatal-errors
CFLAGS += -Wall -Wextra -Wshadow
CFLAGS += -Wwrite-strings -Wold-style-definition -Winline -Wmissing-noreturn -Wstrict-prototypes
CFLAGS += -Wredundant-decls -Wfloat-equal -Wsign-compare
CFLAGS += -fno-common -ffunction-sections -fdata-sections -Wunused-function
CFLAGS += -MD -Wno-format-zero-length
CFLAGS += $( INCL_DIRS:%= -I%) $( DEFS)
#-flto
# Special flags to hide warnings in CMSIS
LIB_CFLAGS = -Wno-shadow -Wno-float-equal -Wno-inline -Wno-unused-parameter -Wno-unused
#-Wno-old-style-definition -Wno-strict-prototypes
###############################################################################
# Linker flags
LDFLAGS += --static -lm -lc -nostartfiles -specs= nano.specs
LDFLAGS += -Llib
LDFLAGS += -T$( LDSCRIPT)
LDFLAGS += -Wl,-Map= $( *) .map
LDFLAGS += -Wl,--gc-sections
#-specs=nano.specs
###############################################################################
# Used libraries
LDLIBS += -lm -lc -l$( LIBNAME)
LDLIBS += -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group
###############################################################################
###############################################################################
###############################################################################
.PHONY : all images clean elf bin hex srec list dis ttyusb ttyacm lib libcheck size
.SUFFIXES : .elf .bin .hex .srec .list .map .images
.SECONDEXPANSION :
.SECONDARY :
all : elf size
elf : $( BINARY ) .elf
bin : $( BINARY ) .bin
hex : $( BINARY ) .hex
srec : $( BINARY ) .srec
list : $( BINARY ) .list
images : $( BINARY ) .images
flash : $( BINARY ) .flash
dis : $( BINARY ) .elf
$( Q) $( OBJDUMP) -dS $( BINARY) .elf -j .text -j .isr_vector > $( BINARY) .dis
lib : CFLAGS += $( LIB_CFLAGS )
lib : $( LIBFILE )
$(LIBFILE) : $( LIB_OBJS )
$( Q) $( AR) rcsv $@ $( LIB_OBJS)
libcheck :
$( Q) if [ ! -e $( LIBFILE) ] ; then \
echo "--- You must build the lib first! ---" ; \
exit 1; \
fi
size : $( BINARY ) .elf
$( Q) $( SIZE) -A $( BINARY) .elf | grep -v " 0"
%.images : %.bin %.hex %.srec %.list %.map
%.bin : %.elf
$( Q) $( OBJCOPY) -Obinary $( *) .elf $( *) .bin
%.hex : %.elf
$( Q) $( OBJCOPY) -Oihex $( *) .elf $( *) .hex
%.srec : %.elf
$( Q) $( OBJCOPY) -Osrec $( *) .elf $( *) .srec
%.list : %.elf
$( Q) $( OBJDUMP) -S $( *) .elf > $( *) .list
%.elf %.map : libcheck $( OBJS ) $( HEADERS )
$( Q) $( LD) $( LDFLAGS) $( ARCH_FLAGS) $( OBJS) $( LDLIBS) -o $( *) .elf
$( Q) ./parsemap.php
$( Q) $( SIZE) $( *) .elf
%.o : %.c
$( Q) echo " CC $( *) .c "
$( Q) $( CC) $( CFLAGS) $( ARCH_FLAGS) -o $( *) .o -c $( *) .c
%.o : %.s
$( Q) echo " CC $( *) .s "
$( Q) $( CC) $( CFLAGS) $( ARCH_FLAGS) -o $( *) .o -c $( *) .s
%.o : %.S
$( Q) echo " CC $( *) .S "
$( Q) $( CC) $( CFLAGS) $( ARCH_FLAGS) -o $( *) .o -c $( *) .S
clean :
$( Q) $( RM) -r $( GARBAGE)
%.flash : %.bin
@printf " FLASH $<\n "
$( Q) $( STFLASH) write $( *) .bin 0x8000000
-include $(OBJS : .o =.d )