# Project name PROJECT_NAME=Base # Directory definition. ST_LIB_DIR=./stm32-api/STM32F10x_StdPeriph_Driver ARM_CMSIS_DIR=./stm32-api/CMSIS STARTUP_FILE=./startup_stm32f10x_hd.S # Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.). OUTDIR = build # Toolchain definition. CC=arm-none-eabi-gcc OBJCOPY=arm-none-eabi-objcopy OBJDUMP=arm-none-eabi-size NM = arm-none-eabi-nm LDSCRIPT=stm32_flash.ld # should use --gc-sections but the debugger does not seem to be able to cope with the option. LINKER_FLAGS=-Xlinker -o$(PROJECT_NAME).axf -Xlinker -M -Xlinker -Map=$(PROJECT_NAME).map -Xlinker --no-gc-sections # Debugging format. #DEBUG = stabs #DEBUG = dwarf-2 DEBUG= gdb # Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s #OPT = 2 #OPT = 3 #OPT = 0 # Compiler flag to set the C Standard level. # c89 - "ANSI" C # gnu89 - c89 plus GCC extensions # c99 - ISO C99 standard (not yet fully implemented) # gnu99 - c99 plus GCC extensions CSTANDARD = gnu89 # Compiler flags definition. CFLAGS=-g$(DEBUG) \ -O$(OPT) \ -std=$(CSTANDARD) \ -T$(LDSCRIPT) \ -I . \ -I ./STCode \ -I $(ST_LIB_DIR)/inc \ -I $(ARM_CMSIS_DIR)/CM3/DeviceSupport/ST/STM32F10x \ -I $(ARM_CMSIS_DIR)/CM3/CoreSupport \ -D STM32F10X_HD \ -D USE_STDPERIPH_DRIVER \ -D VECT_TAB_FLASH \ -D GCC_ARMCM3 \ -D inline= \ -D PACK_STRUCT_END=__attribute\(\(packed\)\) \ -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) \ -mthumb \ -mcpu=cortex-m3 \ -ffunction-sections \ -fdata-sections ADEFS=-D STM32F10X_HD \ -D USE_STDPERIPH_DRIVER \ -D VECT_TAB_FLASH \ -D GCC_ARMCM3 \ -D inline= \ -D PACK_STRUCT_END=__attribute\(\(packed\)\) \ -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) # Assembler flags ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:.S=.lst),-g$(DEBUG) ALL_ASFLAGS = -mcpu=cortex-m3 -mthumb-interwork -I. -x assembler-with-cpp $(ASFLAGS) # Source files SOURCE= main.c \ stm32f10x_it.c \ stf_syscalls_minimal.c \ system_stm32f10x.c \ # ST Library source files. ST_LIB_SOURCE= $(ARM_CMSIS_DIR)/CM3/CoreSupport/core_cm3.c \ $(ST_LIB_DIR)/src/misc.c \ $(ST_LIB_DIR)/src/stm32f10x_rcc.c \ $(ST_LIB_DIR)/src/stm32f10x_gpio.c \ SOURCE+=$(ST_LIB_SOURCE) # List of all source files without directory and file-extension. ALLSRCBASE = $(notdir $(basename $(SOURCE))) LIBS= # List of all objects files. OBJS = $(addprefix $(OUTDIR)/, $(addsuffix .o, $(ALLSRCBASE))) # Define Messages. # English MSG_BEGIN = -------- begin -------- MSG_END = -------- end -------- # Rules definition. *********************************************************** all: begin gccversion $(OUTDIR)/$(PROJECT_NAME).bin end $(OUTDIR)/$(PROJECT_NAME).bin : $(PROJECT_NAME).axf $(OBJCOPY) $(PROJECT_NAME).axf -O binary $(PROJECT_NAME).bin $(PROJECT_NAME).axf : $(OBJS) $(OUTDIR)/startup_stm32f10x.o Makefile $(CC) $(CFLAGS) $(OBJS) $(OUTDIR)/startup_stm32f10x.o $(LIBS) $(LINKER_FLAGS) # Compile: create object files from C source files. define COMPILE_C_TEMPLATE $(OUTDIR)/$(notdir $(basename $(1))).o : $(1) ## @echo @echo $$< "->" $$@ $(CC) -c $$(CFLAGS) $$< -o $$@ endef $(foreach src, $(SOURCE), $(eval $(call COMPILE_C_TEMPLATE, $(src)))) # $(OUTDIR)/startup_stm32f10x.o : $(STARTUP_FILE) Makefile $(CC) -c -mthumb $(ALL_ASFLAGS) -O1 $(STARTUP_FILE) -o $(OUTDIR)/startup_stm32f10x.o clean : cs-rm -f $(OBJS) cs-rm -f $(OUTDIR)/startup_stm32f10x.o cs-rm -f startup_stm32f10x_hd.lst cs-rm -f $(PROJECT_NAME).axf cs-rm -f $(PROJECT_NAME).map cs-rm -f $(PROJECT_NAME).bin log : $(PROJECT_NAME).axf $(NM) -n $(PROJECT_NAME).axf > $(PROJECT_NAME)_SymbolTable.txt $(OBJDUMP) --format=SysV $(PROJECT_NAME).axf > $(PROJECT_NAME)_MemoryListingSummary.txt $(OBJDUMP) $(OBJS) > $(PROJECT_NAME)_MemoryListingDetails.txt # Eye candy. begin: ## @echo @echo $(MSG_BEGIN) end: @echo $(MSG_END) ## @echo # Display compiler version information. gccversion : @$(CC) --version