# ============================================================================= # HERV Firmware - Nuvoton NANO100SE3BN (Cortex-M0) # Eclipse(Nueclipse) -> VS Code + ARM-GCC 마이그레이션 # # 사용법: # make : 빌드 (build/HERV.elf, .hex, .bin) # make clean : 빌드 정리 # make flash : Nu-Link 으로 플래시 (OpenOCD-Nuvoton 필요) # make erase : 칩 erase # make size : 메모리 사용량 출력 # ============================================================================= PROJECT := HERV BUILD := build # --- Toolchain --- PREFIX := arm-none-eabi- CC := $(PREFIX)gcc AS := $(PREFIX)gcc -x assembler-with-cpp LD := $(PREFIX)gcc OBJCOPY := $(PREFIX)objcopy SIZE := $(PREFIX)size # --- MCU --- MCU := -mcpu=cortex-m0 -mthumb # --- Include 경로 (Eclipse 와 동일) --- INCLUDES := \ -ILibrary/CMSIS/Include \ -ILibrary/Device/Nuvoton/Nano100Series/Include \ -ILibrary/StdDriver/inc \ -IUser # --- 공통 컴파일 플래그 (Eclipse subdir.mk 에서 추출) --- COMMON_FLAGS := $(MCU) -Os -g \ -fmessage-length=0 -fsigned-char \ -ffunction-sections -fdata-sections CFLAGS := $(COMMON_FLAGS) $(INCLUDES) -std=gnu11 -MMD -MP ASFLAGS := $(COMMON_FLAGS) -MMD -MP # --- 링커 --- LDSCRIPT := Library/Device/Nuvoton/Nano100Series/Source/GCC/gcc_arm.ld LDFLAGS := $(COMMON_FLAGS) -T$(LDSCRIPT) \ -Xlinker --gc-sections \ -Wl,-Map=$(BUILD)/$(PROJECT).map # --- 소스 자동 수집 --- # 주의: User/pwm_duty10000.c 가 StdDriver/pwm.c 를 대체하므로 pwm.c 는 빌드에서 제외 # (Eclipse Nueclipse 프로젝트도 동일하게 pwm.c 를 exclude 하고 빌드) STDDRIVER_EXCLUDE := Library/StdDriver/src/pwm.c C_SRCS := \ $(wildcard User/*.c) \ $(filter-out $(STDDRIVER_EXCLUDE), $(wildcard Library/StdDriver/src/*.c)) \ Library/Device/Nuvoton/Nano100Series/Source/system_Nano100Series.c \ Library/Device/Nuvoton/Nano100Series/Source/GCC/_syscalls.c ASM_SRCS := \ Library/Device/Nuvoton/Nano100Series/Source/GCC/startup_Nano100Series.S # --- Object 파일 (build/ 아래 같은 트리 구조 유지) --- OBJS := $(addprefix $(BUILD)/, $(C_SRCS:.c=.o)) \ $(addprefix $(BUILD)/, $(ASM_SRCS:.S=.o)) DEPS := $(OBJS:.o=.d) # --- 출력 --- ELF := $(BUILD)/$(PROJECT).elf HEX := $(BUILD)/$(PROJECT).hex BIN := $(BUILD)/$(PROJECT).bin # ============================================================================= # Targets # ============================================================================= .PHONY: all clean flash erase debug-server size rebuild all: $(ELF) $(HEX) $(BIN) size # clean -> all 을 순차 실행 (병렬 make -jN 에서 clean/all 동시 실행 방지) rebuild: @$(MAKE) clean @$(MAKE) all $(ELF): $(OBJS) @echo '[LD] $@' @$(LD) $(LDFLAGS) -o $@ $^ $(HEX): $(ELF) @echo '[HEX] $@' @$(OBJCOPY) -O ihex $< $@ $(BIN): $(ELF) @echo '[BIN] $@' @$(OBJCOPY) -O binary $< $@ size: $(ELF) @echo '' @$(SIZE) --format=berkeley $< @echo '' # C 컴파일 $(BUILD)/%.o: %.c @mkdir -p $(dir $@) @echo '[CC] $<' @$(CC) $(CFLAGS) -c $< -o $@ # Assembly 컴파일 $(BUILD)/%.o: %.S @mkdir -p $(dir $@) @echo '[AS] $<' @$(AS) $(ASFLAGS) -c $< -o $@ # Nu-Link 으로 플래시 굽기 flash: $(ELF) openocd -f openocd.cfg -c "program $(ELF) verify reset exit" # OpenOCD GDB 서버만 실행 (VS Code 디버그용) debug-server: openocd -f openocd.cfg # 칩 erase erase: openocd -f openocd.cfg -c "init; reset halt; nuc_chip_erase; exit" clean: @echo 'Cleaning...' @rm -rf $(BUILD) -include $(DEPS)