# STM32F103RCT6 FOC Control System Makefile

CC = arm-none-eabi-gcc
AS = arm-none-eabi-as
LD = arm-none-eabi-ld
OBJCOPY = arm-none-eabi-objcopy
OBJDUMP = arm-none-eabi-objdump
SIZE = arm-none-eabi-size

TARGET = STM32F103RCT6_FOC
CPU = cortex-m3
MCU = STM32F103xC

ROOT_DIR = .
CORE_DIR = $(ROOT_DIR)/Core

SRCS = \
  $(CORE_DIR)/Src/main.c \
  $(CORE_DIR)/Src/oled.c \
  $(CORE_DIR)/Src/ma600a.c \
  $(CORE_DIR)/Src/motor.c \
  $(CORE_DIR)/Src/foc.c

ASMS = \
  $(CORE_DIR)/Src/startup_stm32f103xe.s

INCS = \
  -I$(CORE_DIR)/Inc \
  -I$(ROOT_DIR)/Drivers/CMSIS/Device/ST/STM32F1xx/Include

DEFS = \
  -D$(MCU)

CFLAGS = \
  -mcpu=$(CPU) \
  -mthumb \
  -mfloat-abi=soft \
  -Wall \
  -Wextra \
  -O0 \
  -g3 \
  -std=c99 \
  $(DEFS) \
  $(INCS)

ASFLAGS = \
  -mcpu=$(CPU) \
  -mthumb \
  -mfloat-abi=soft \
  -g

LDFLAGS = \
  -mcpu=$(CPU) \
  -mthumb \
  -mfloat-abi=soft \
  -T$(ROOT_DIR)/STM32F103RCT6_FLASH.ld \
  -Wl,-Map=$(TARGET).map \
  -Wl,--gc-sections

OBJS = $(SRCS:.c=.o) $(ASMS:.s=.o)

.PHONY: all clean flash

all: $(TARGET).elf $(TARGET).hex $(TARGET).bin

$(TARGET).elf: $(OBJS)
	$(CC) $(LDFLAGS) -o $@ $^
	$(SIZE) $@

$(TARGET).hex: $(TARGET).elf
	$(OBJCOPY) -O ihex $< $@

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

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

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

clean:
	-del $(TARGET).elf $(TARGET).hex $(TARGET).bin $(TARGET).map
	-del Core\Src\main.o Core\Src\oled.o Core\Src\ma600a.o Core\Src\motor.o Core\Src\foc.o Core\Src\startup_stm32f103xe.o

flash: $(TARGET).hex
	st-flash write $(TARGET).hex 0x8000000
