# sensorless_bldc_sw — Makefile for ARM GCC

TARGET   = sensorless_bldc
BUILD    = build
CMSIS    = CMSIS/Core

# Source files
SRC_C  = \
	Core/Src/main.c \
	Core/Src/bldc_hw.c \
	Core/Src/bldc_comm.c \
	Core/Src/bldc_bemf.c \
	Core/Src/bldc_pid.c \
	Core/Src/bldc_fsm.c \
	Core/Src/system_stm32f10x.c

SRC_S  = Startup/startup_stm32f10x_hd.s

# Object files
OBJ_C  = $(SRC_C:%.c=$(BUILD)/%.o)
OBJ_S  = $(SRC_S:%.s=$(BUILD)/%.o)
OBJS   = $(OBJ_C) $(OBJ_S)

# Include paths
INC = \
	-I Core/Inc \
	-I $(CMSIS)

# Compiler flags
CROSS  = arm-none-eabi-
CC     = $(CROSS)gcc
AS     = $(CROSS)gcc -x assembler-with-cpp
SIZE   = $(CROSS)size
OBJCOPY = $(CROSS)objcopy
OBJDUMP = $(CROSS)objdump

# Defines: STM32F103VE = High Density (+ USE_STDPERIPH_DRIVER for HAL)
DEFS = -DSTM32F10X_HD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000

CFLAGS  = -mcpu=cortex-m3 -mthumb -mfloat-abi=soft \
          -O2 -g -Wall -Wextra -Wno-unused-parameter \
          -ffunction-sections -fdata-sections \
          -std=c99 $(DEFS) $(INC)

LDFLAGS = -mcpu=cortex-m3 -mthumb -mfloat-abi=soft \
          -TSTM32F103VE_FLASH.ld \
          -Wl,--gc-sections -Wl,-Map=$(BUILD)/$(TARGET).map \
          -ffreestanding -nostartfiles \
          -specs=nano.specs -lc -lgcc

# ==================== Targets ====================

.PHONY: all clean flash size

all: $(BUILD)/$(TARGET).elf $(BUILD)/$(TARGET).hex $(BUILD)/$(TARGET).bin size

# Link
$(BUILD)/$(TARGET).elf: $(OBJS) STM32F103VE_FLASH.ld
	@mkdir -p $(@D)
	$(CC) $(OBJS) $(LDFLAGS) -o $@

# Compile C
$(BUILD)/%.o: %.c Makefile
	@mkdir -p $(@D)
	$(CC) $(CFLAGS) -c $< -o $@

# Compile assembly
$(BUILD)/%.o: %.s Makefile
	@mkdir -p $(@D)
	$(AS) $(CFLAGS) -c $< -o $@

# Generate hex
$(BUILD)/$(TARGET).hex: $(BUILD)/$(TARGET).elf
	$(OBJCOPY) -O ihex $< $@

# Generate bin
$(BUILD)/$(TARGET).bin: $(BUILD)/$(TARGET).elf
	$(OBJCOPY) -O binary $< $@

# Size
size: $(BUILD)/$(TARGET).elf
	$(SIZE) $<

# Clean
clean:
	rm -rf $(BUILD)

# Flash (use openocd)
flash: $(BUILD)/$(TARGET).bin
	openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "program $< 0x08000000 verify reset exit"

-include $(OBJS:.o=.d)
