|
|
|
#####################################################################################
|
|
|
|
# File config
|
|
|
|
#####################################################################################
|
|
|
|
|
|
|
|
main_file = main.asm
|
|
|
|
startup_file = startup_stm32l100xc.s
|
|
|
|
lib_dir = lib/
|
|
|
|
|
|
|
|
#####################################################################################
|
|
|
|
# ASSEMBLER CONFIG
|
|
|
|
#####################################################################################
|
|
|
|
|
|
|
|
ASOPTS = --cpu Cortex-M3 --apcs interwork
|
|
|
|
|
|
|
|
# Add library to include path
|
|
|
|
ASOPTS += -I$(lib_dir)
|
|
|
|
|
|
|
|
# Debug flags
|
|
|
|
ifeq ($(G), 1)
|
|
|
|
ASOPTS += -g
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
#####################################################################################
|
|
|
|
# LINKER CONFIG
|
|
|
|
#####################################################################################
|
|
|
|
|
|
|
|
LDOPTS = --cpu Cortex-M3 --strict
|
|
|
|
LDOPTS += --ro-base 0x08000000 --entry 0x08000000 --rw-base 0x20000000
|
|
|
|
LDOPTS += --entry Reset_Handler --first __Vectors
|
|
|
|
|
|
|
|
# Debug flags
|
|
|
|
ifneq ($(G), 1)
|
|
|
|
LDOPTS += --no_debug
|
|
|
|
endif
|
|
|
|
|
|
|
|
# Verbose flags (run make V=1)
|
|
|
|
ifeq ($(V), 1)
|
|
|
|
LDOPTS += --summary_stderr --map --xref --callgraph --symbols
|
|
|
|
LDOPTS += --info summarysizes,sizes,totals,unused,veneers
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
#####################################################################################
|
|
|
|
# EXTERNAL PROGRAM NAMES
|
|
|
|
#####################################################################################
|
|
|
|
|
|
|
|
# armlink, armasm, fromelf - exe files in Wine directory (with Keil installed)
|
|
|
|
|
|
|
|
# Example launcher for Keil exe programs:
|
|
|
|
#
|
|
|
|
# #!/bin/bash
|
|
|
|
# WINEDEBUG=fixme-all wine ~/.wine/drive_c/Keil_v5/ARM/ARMCC_505u2/bin/armasm.exe $@
|
|
|
|
|
|
|
|
# Disable Wine fixme warnings
|
|
|
|
ENVS = WINEDEBUG=fixme-all
|
|
|
|
# Stop DS-5 from trying to use it's internal unlicensed compiler (Attempt at DRM?)
|
|
|
|
ENVS += ARMCC5_ASMOPT='' ARMCC5_CCOPT='' ARMCC5_FROMELFOPT='' ARMCC5_LINKOPT='' ARMCOMPILER6_ASMOPT='' ARMCOMPILER6_CLANGOPT=''
|
|
|
|
ENVS += ARMCOMPILER6_FROMELFOPT='' ARMCOMPILER6_LINKOPT='' ARM_PRODUCT_PATH='' ARM_TOOL_VARIANT=''
|
|
|
|
|
|
|
|
|
|
|
|
WINEPREFIX=$(ENVS) wine ~/.wine/drive_c/Keil_v5/ARM/ARMCC_505u2/bin
|
|
|
|
|
|
|
|
LD = $(WINEPREFIX)/armlink.exe
|
|
|
|
AS = $(WINEPREFIX)/armasm.exe
|
|
|
|
FROMELF = $(WINEPREFIX)/fromelf.exe
|
|
|
|
OBJDUMP = arm-none-eabi-objdump
|
|
|
|
STFLASH = st-flash
|
|
|
|
RM = rm
|
|
|
|
|
|
|
|
|
|
|
|
# --- END OF CONFIG ---
|
|
|
|
|
|
|
|
main_base = $(basename $(main_file))
|
|
|
|
startup_base = $(basename $(startup_file))
|
|
|
|
|
|
|
|
|
|
|
|
.PHONY: all build clean flash hex disasm
|
|
|
|
|
|
|
|
all: build
|
|
|
|
|
|
|
|
# Link object files to AXF file
|
|
|
|
output.axf: $(main_base).o $(startup_base).o
|
|
|
|
@echo -e "\e[0;33mLinking object files to $@\e[0m"
|
|
|
|
@$(LD) $(LDOPTS) --output $@ "$(main_base).o" "$(startup_base).o"
|
|
|
|
|
|
|
|
# Get BIN image file from AXF file
|
|
|
|
%.bin: %.axf
|
|
|
|
@echo -e "\e[0;33mConverting $< to $@\e[0m"
|
|
|
|
@$(FROMELF) --bincombined --output $@ $<
|
|
|
|
|
|
|
|
# Get Intel Hex file from AXF file
|
|
|
|
%.hex: %.axf
|
|
|
|
@echo -e "\e[0;33mConverting $< to $@\e[0m"
|
|
|
|
@$(FROMELF) --i32combined --output $@ $<
|
|
|
|
|
|
|
|
# Get Object file from Assembler source file
|
|
|
|
$(main_base).o: $(main_file)
|
|
|
|
@echo -e "\e[0;32mCompiling $< to $@\e[0m"
|
|
|
|
@$(AS) $(ASOPTS) --list $(main_base).lst -o $@ --depend $(main_base).d $<
|
|
|
|
|
|
|
|
$(startup_base).o: $(startup_file)
|
|
|
|
@echo -e "\e[0;32mCompiling $< to $@\e[0m"
|
|
|
|
@$(AS) $(ASOPTS) --list $(startup_base).lst -o $@ --depend $(startup_base).d $<
|
|
|
|
|
|
|
|
# Get binary image (compile and link)
|
|
|
|
build: output.bin
|
|
|
|
|
|
|
|
# Get hex image (compile and link)
|
|
|
|
hex: output.hex
|
|
|
|
|
|
|
|
# Run through assembler (checks for errors)
|
|
|
|
asm: $(main_base).o
|
|
|
|
|
|
|
|
# Run through linker
|
|
|
|
link: output.axf
|
|
|
|
|
|
|
|
# Flash using st-link
|
|
|
|
flash: output.bin
|
|
|
|
@echo -e "\e[0;96mWriting image to device via ST-Link\e[0m"
|
|
|
|
@$(STFLASH) write "output.bin" 0x8000000
|
|
|
|
@echo -e "\e[0;96mWrite OK!\e[0m"
|
|
|
|
|
|
|
|
disasm: output.axf
|
|
|
|
@echo -e "\e[0;33mDisassembling $< to output.disasm\e[0m"
|
|
|
|
@$(OBJDUMP) -d $< > output.disasm
|
|
|
|
|
|
|
|
# Remove temporary files
|
|
|
|
clean:
|
|
|
|
@echo -e "\e[0;32mRemoving temporary files\e[0m"
|
|
|
|
$(RM) -f *.bak *.lnp *.iex *.hex *.elf *.axf *.htm *.lnp *.lst *.plg *.tra *.o *.map *.d *.dep *.disasm *.bin
|