# 交叉编译工具链：arm-none-eabi-gcc
# make          → 真板子用的固件（走 I2C 读真传感器）
# make sim      → 模拟器用的固件（内置数据源，见 src/sensor.c）
# make run      → 在 QEMU 上跑 10 秒，串口输出存到 build/uart.log

CROSS   ?= arm-none-eabi-
# 🔴 模拟器的机型是 STM32F100RB，只有 8K RAM；按目标芯片的 20K 链接，栈顶会落在
# 没有映射的地址上，一上电就挂——现象是串口一个字都不出，看着像串口没配对。
LDSCRIPT ?= linker.ld
CC      = $(CROSS)gcc
OBJCOPY = $(CROSS)objcopy
SIZE    = $(CROSS)size

CFLAGS  = -mcpu=cortex-m3 -mthumb -Wall -Wextra -Os -g3 -std=c11 \
          -ffunction-sections -fdata-sections -Iinclude
LDFLAGS = -T $(LDSCRIPT) -nostartfiles -nostdlib -Wl,--gc-sections -Wl,-Map=build/fw.map

SRC  = src/startup.c src/main.c src/uart.c src/sensor.c src/crc.c
ELF  = build/fw.elf

all: $(ELF)

$(ELF): $(SRC) $(LDSCRIPT) | build
	$(CC) $(CFLAGS) $(EXTRA) $(SRC) $(LDFLAGS) -o $@
	$(OBJCOPY) -O binary $@ build/fw.bin
	$(OBJCOPY) -O ihex   $@ build/fw.hex
	$(SIZE) $@

sim:
	$(MAKE) EXTRA=-DSIM_SENSOR LDSCRIPT=linker-qemu.ld

build:
	mkdir -p build

run: sim
	timeout 10 qemu-system-arm -M stm32vldiscovery -kernel $(ELF) \
	    -nographic -serial mon:stdio > build/uart.log 2>&1 || true
	cat build/uart.log

clean:
	rm -rf build

.PHONY: all sim run clean build
