PRJ_ROOT = /home/larry/arm/reg
TARGET = main

LIB = /home/larry/arm/STM32CubeF1
CMSIS = $(LIB)/Drivers/CMSIS
CMSIS_DEV = $(CMSIS)/Device/ST/STM32F1xx
HAL = $(LIB)/Drivers/STM32F1xx_HAL_Driver

LINK = STM32F103X6_FLASH.ld
START = startup_stm32f103x6.s
FLASH_ADDR = 0x08000000
INTERFACE_CFG = interface/stlink.cfg
TARGET_CFG = target/stm32f1x.cfg

STARTUP = startup_stm32f103x6.s

HAL_SRCS = $(filter-out %template.c, $(wildcard $(HAL)/Src/*.c))
USR_SRCS = $(wildcard $(PRJ_ROOT)/Src/*.c)
SRCS = $(HAL_SRCS)
SRCS += $(USR_SRCS)
OBJS = $(SRCS:.c=.o)
OBJS += $(STARTUP:.s=.o)

CC = arm-none-eabi-gcc
CC_FLAGS = -c -g3 -mthumb -mcpu=cortex-m3 -Wall \
		   -I $(PRJ_ROOT)/Inc \
		   -I $(CMSIS)/Include \
		   -I $(CMSIS_DEV)/Include \
		   -I $(HAL)/Inc
AS = arm-none-eabi-gcc
AS_FLAGS = -c -g -mthumb -mcpu=cortex-m3 -Wa,--warn
LD = arm-none-eabi-gcc
LD_FLAGS = -mthumb -mcpu=cortex-m3 \
		   -T $(LINK) \
		   -specs=nosys.specs -static \
		   -Wl,-cref,-u,Reset_Handler \
		   -Wl,-Map=main.map \
		   -Wl,--gc-sections \
		   -Wl,--defsym=malloc_getpagesize_P=0x80 \
		   -Wl,--start-group -lc -lm \
		   -Wl,--end-group \
		   -Wall
OBJCOPY = arm-none-eabi-objcopy

$(TARGET).bin: $(TARGET).elf
	$(OBJCOPY) -O binary $< $@

$(TARGET).elf: $(OBJS)
	$(LD) $(LD_FLAGS) -o $@ $^

%.o: %.c
	$(CC) $(CC_FLAGS) -o $@ $<

%.o: %.s
	$(AS) $(AS_FLAGS) -o $@ $<

flash: $(TARGET).bin
	openocd -f $(INTERFACE_CFG) -f $(TARGET_CFG) \
		-c init \
		-c halt \
		-c "flash write_image erase $(TARGET).bin $(FLASH_ADDR)" \
		-c reset \
		-c shutdown

debug:
	openocd -f $(INTERFACE_CFG) -f $(TARGET_CFG)

clean:
	rm -f $(TARGET).elf $(TARGET).bin $(TARGET).map $(OBJS) $(STARTUP).o

Clean: clean
	rm -f $(HAL)/Src/*.o
