PROJECT=test
SRCS   = main.c
STM_DIR=.

STM_PERIPH_SRC = $(STM_DIR)/Libraries/STM32F4xx_StdPeriph_Driver/src

vpath %.c $(STM_PERIPH_SRC)

SRCS  += system_stm32f4xx.c

SRCS  += stm32f4xx_rcc.c
SRCS  += stm32f4xx_gpio.c

SRCS += $(STM_DIR)/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f429_439xx.s

INC_DIRS += $(STM_DIR)/Libraries/CMSIS/Include
INC_DIRS += $(STM_DIR)/Libraries/CMSIS/Device/ST/STM32F4xx/Include
INC_DIRS += $(STM_DIR)/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates
INC_DIRS += $(STM_DIR)/Libraries/STM32F4xx_StdPeriph_Driver/inc
INC_DIRS += .

OBJDIR = build

TOOLCHAIN = arm-none-eabi

CC      = $(TOOLCHAIN)-g++
OBJCOPY = $(TOOLCHAIN)-objcopy
GDB     = $(TOOLCHAIN)-gdb

INCLUDE = $(addprefix -I,$(INC_DIRS))

DEFS    = -DSTM32F429_439xx -DUSE_STDPERIPH_DRIVER

CFLAGS  = -ggdb
CFLAGS += -O0
CFLAGS += -Wall -Wextra -Warray-bounds
CFLAGS += -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
CXXFLAGS = -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -ffunction-sections -fdata-sections -g -fno-rtti -fno-exceptions 

LFLAGS  = --specs=nosys.specs -Tstm32_flash.ld
LXXFLAGS = --specs=nosys.specs -Tstm32_flash.ld -Wl,--gc-sections -static 


$(PROJECT): $(PROJECT).elf mv

$(PROJECT).elf: $(SRCS)
	$(CC) $(INCLUDE) $(DEFS) $(CXXFLAGS) $(LXXFLAGS) $^ -o $@
	$(OBJCOPY) -O ihex $(PROJECT).elf   $(PROJECT).hex
	$(OBJCOPY) -O binary $(PROJECT).elf $(PROJECT).bin

mv: $(PROJECT).elf $(PROJECT).hex $(PROJECT).bin
	mv $(PROJECT).elf $(PROJECT).hex $(PROJECT).bin -t build/

clean:
	rm -f build/*.o build/$(PROJECT).elf build/$(PROJECT).hex build/$(PROJECT).bin

flash: build/virgo.bin
	openocd -f interface/ftdi/olimex-arm-usb-ocd-h.cfg -f target/stm32f4x.cfg -c "init" -c "reset halt" -c "flash probe 0" -c "flash write_image erase build/test.bin 0x08000000" -c "reset" -c "exit"

