# Makefile — OOPC LED Demo for STM32F103 + arm-none-eabi-gcc
# 用法: make all           → 编译
#       make clean         → 清理
#       make size          → 查看固件大小

# ─── 目标芯片 ───
TARGET   = led_oopc_demo
MCU      = cortex-m3
FLOAT_ABI = soft

# ─── 路径配置 ───
PROJ_DIR     = .
SPL_BASE     = /root/open_source_study/stmbl/lib/STM32F10x_StdPeriph_Driver-V3.6.1
CMSIS_BASE   = /root/open_source_study/stmbl/lib/CMSIS/Device/ST/STM32F10x

# ─── 头文件搜索路径 ───
INCLUDES  = -I$(PROJ_DIR)
INCLUDES += -I$(SPL_BASE)/inc
INCLUDES += -I$(CMSIS_BASE)/Include
INCLUDES += -I/root/open_source_study/stmbl/lib/CMSIS/Include

# ─── 源文件 ───
SRC_C  = $(PROJ_DIR)/main.c
SRC_C += $(PROJ_DIR)/led.c
SRC_C += $(PROJ_DIR)/button.c
SRC_C += $(PROJ_DIR)/system_stm32f10x.c
SRC_C += $(wildcard $(SPL_BASE)/src/*.c)

# ─── 启动文件 ───
STARTUP_ASM = $(PROJ_DIR)/startup_stm32f10x_md.s

# ─── 编译标志 ───
CFLAGS  = -mcpu=$(MCU) -mthumb -mfloat-abi=$(FLOAT_ABI)
CFLAGS += -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER
CFLAGS += -Os -ffunction-sections -fdata-sections -Wall -Wextra
CFLAGS += -Wno-unused-parameter
CFLAGS += $(INCLUDES)

LDFLAGS = -mcpu=$(MCU) -mthumb -mfloat-abi=$(FLOAT_ABI)
LDFLAGS += -Wl,--gc-sections -Wl,-Map=$(TARGET).map
LDFLAGS += -T $(PROJ_DIR)/STM32F103C8Tx_FLASH.ld
LDFLAGS += -specs=nano.specs -specs=nosys.specs

# ─── 目标文件 ───
OBJS_C   = $(SRC_C:.c=.o)
OBJS_ASM = $(STARTUP_ASM:.s=.o)

# ─── 工具链 ───
CC      = arm-none-eabi-gcc
OBJCOPY = arm-none-eabi-objcopy
SIZE    = arm-none-eabi-size

# ─── 规则 ───
.PHONY: all clean size

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

$(TARGET).elf: $(OBJS_C) $(OBJS_ASM)
	$(CC) $(LDFLAGS) -o $@ $^ -lm
	$(SIZE) $@

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

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

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

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

size: $(TARGET).elf

clean:
	rm -f $(OBJS_C) $(OBJS_ASM)
	rm -f $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).map