CROSS ?= arm-none-eabi- CC := $(CROSS)gcc CXX := $(CROSS)c++ AS := $(CROSS)as OBJCOPY := $(CROSS)objcopy LD := $(CROSS)ld SIZE := $(CROSS)size GDB := $(CROSS)gdb OOCD ?= openocd #OOCD_INTERFACE ?= stlink-v2-1 OOCD_INTERFACE ?= jlink OOCD_TARGET ?= stm32f4x top_dir := $(shell pwd) cmsis_dir := $(top_dir)/cmsis stdph_dir := $(top_dir)/stdperiph lib_dir := $(top_dir)/lib usb_dir := $(top_dir)/usb link_script := $(top_dir)/stm32f4x.lds specs := --specs=nosys.specs --specs=nano.specs debug ?= 1 ifeq ($(debug),1) debug_flags := -O0 -g -ggdb else debug_flags := -Os -DNDEBUG endif cmsis_startup := cmsis_srcs := inc_flags += -I$(cmsis_dir)/inc \ -I$(stdph_dir)/inc \ -I$(lib_dir)/ \ -I$(top_dir)/src COMM_CFLAGS += -mthumb -fno-common -Wall -ffunction-sections -fdata-sections \ -ffreestanding -fno-builtin -mcpu=cortex-m4 TARGET ?= f429 -include targets.mk FP_FLAGS ?= -mfloat-abi=hard -mfpu=fpv4-sp-d16 -D__FPU_USED=1 -D__FPU_PRESENT=1 TARGET_CFLAGS += $(FP_FLAGS) TARGET_CFLAGS += $(COMM_CFLAGS) TARGET_CFLAGS += -DUSE_STDPERIPH_DRIVER CFLAGS += -std=gnu99 CFLAGS += $(debug_flags) CFLAGS += $(inc_flags) CFLAGS += $(TARGET_CFLAGS) ASFLAGS += $(TARGET_CFLAGS) LDFLAGS += -Xlinker --gc-sections -Xlinker --print-memory-usage \ -Xlinker --sort-section=alignment -mcpu=cortex-m4 $(FP_FLAGS) \ ROMBASE ?= 0x08000000 ROMSZ ?= 2048k RAMBASE ?= 0x20000000 RAMSZ ?= 192k stdph_srcs := \ $(stdph_dir)/src/misc.c \ $(stdph_dir)/src/stm32f4xx_adc.c \ $(stdph_dir)/src/stm32f4xx_can.c \ $(stdph_dir)/src/stm32f4xx_cec.c \ $(stdph_dir)/src/stm32f4xx_crc.c \ $(stdph_dir)/src/stm32f4xx_cryp_aes.c \ $(stdph_dir)/src/stm32f4xx_cryp.c \ $(stdph_dir)/src/stm32f4xx_cryp_des.c \ $(stdph_dir)/src/stm32f4xx_cryp_tdes.c \ $(stdph_dir)/src/stm32f4xx_dac.c \ $(stdph_dir)/src/stm32f4xx_dbgmcu.c \ $(stdph_dir)/src/stm32f4xx_dcmi.c \ $(stdph_dir)/src/stm32f4xx_dfsdm.c \ $(stdph_dir)/src/stm32f4xx_dma2d.c \ $(stdph_dir)/src/stm32f4xx_dma.c \ $(stdph_dir)/src/stm32f4xx_dsi.c \ $(stdph_dir)/src/stm32f4xx_exti.c \ $(stdph_dir)/src/stm32f4xx_flash.c \ $(stdph_dir)/src/stm32f4xx_flash_ramfunc.c \ $(stdph_dir)/src/stm32f4xx_fmpi2c.c \ $(stdph_dir)/src/stm32f4xx_gpio.c \ $(stdph_dir)/src/stm32f4xx_hash.c \ $(stdph_dir)/src/stm32f4xx_hash_md5.c \ $(stdph_dir)/src/stm32f4xx_hash_sha1.c \ $(stdph_dir)/src/stm32f4xx_i2c.c \ $(stdph_dir)/src/stm32f4xx_iwdg.c \ $(stdph_dir)/src/stm32f4xx_lptim.c \ $(stdph_dir)/src/stm32f4xx_ltdc.c \ $(stdph_dir)/src/stm32f4xx_pwr.c \ $(stdph_dir)/src/stm32f4xx_qspi.c \ $(stdph_dir)/src/stm32f4xx_rcc.c \ $(stdph_dir)/src/stm32f4xx_rng.c \ $(stdph_dir)/src/stm32f4xx_rtc.c \ $(stdph_dir)/src/stm32f4xx_sai.c \ $(stdph_dir)/src/stm32f4xx_sdio.c \ $(stdph_dir)/src/stm32f4xx_spdifrx.c \ $(stdph_dir)/src/stm32f4xx_spi.c \ $(stdph_dir)/src/stm32f4xx_syscfg.c \ $(stdph_dir)/src/stm32f4xx_tim.c \ $(stdph_dir)/src/stm32f4xx_usart.c \ $(stdph_dir)/src/stm32f4xx_wwdg.c \ ifeq ($(use_usb),1) usb_srcs := \ $(usb_dir)/otg/src/usb_core.c \ $(usb_dir)/otg/src/usb_dcd_int.c \ $(usb_dir)/otg/src/usb_dcd.c \ $(usb_dir)/core/src/usbd_core.c \ $(usb_dir)/core/src/usbd_ioreq.c \ $(usb_dir)/core/src/usbd_req.c \ $(usb_dir)/cdc/src/usbd_cdc_core.c \ CFLAGS += -I$(usb_dir)/core/inc -I$(usb_dir)/otg/inc\ -I$(usb_dir)/cdc/inc -DUSE_USB_OTG_FS \ -DUSE_ULPI_PHY lib_srcs += $(lib_dir)/usb/usbd_cdc.c lib_srcs += $(lib_dir)/usb/usbd_desc.c lib_srcs += $(lib_dir)/usb/usb_bsp.c CFLAGS += -I$(lib_dir)/usb endif cmsis_srcs += \ $(cmsis_dir)/src/system_stm32f4xx.c lib_srcs += \ $(lib_dir)/gcc_stubs.c \ $(lib_dir)/printf.c \ $(lib_dir)/fifo.c \ $(lib_dir)/cmd.c \ $(lib_dir)/gpio.c \ $(lib_dir)/a3k.c \ $(lib_dir)/serial.c \ $(lib_dir)/fmc_sdram.c \ project_srcs += \ $(top_dir)/src/i2c.c \ $(top_dir)/src/main.c objs += $(cmsis_startup:.S=.o) $(cmsis_srcs:.c=.o) objs += $(stdph_srcs:.c=.o) objs += $(lib_srcs:.c=.o) objs += $(usb_srcs:.c=.o) objs += $(project_srcs:.c=.o) firmware.elf: | $(link_script) all: firmware.bin firmware.hex firmware.hex : firmware.elf $(OBJCOPY) -O ihex $< $@ firmware.bin : firmware.elf $(OBJCOPY) -O binary $< $@ firmware.elf : $(objs) $(CC) $(LDFLAGS) -Wl,-Map="$@.map" -T $(link_script) $(specs) $^ -o $@ @$(SIZE) -Bd $@ %.o : %.s @echo "compiling $(notdir $<)" @$(CC) $(CFLAGS) -c $< -o $@ %.o : %.S @echo "compiling $(notdir $<)" @$(CC) $(CFLAGS) -c $< -o $@ %.lds : %.lds.S $(CC) -E -P -DROMBASE=$(ROMBASE) -DROMSZ=$(ROMSZ) -DRAMBASE=$(RAMBASE) -DRAMSZ=$(RAMSZ) -o $@ $< BINARY := firmware ifeq ($(OOCD_FILE),) flash: $(BINARY).elf @printf " FLASH $<\n" (echo "halt; program $(realpath $(*).elf) verify reset" | nc -4 localhost 4444 2>/dev/null) || \ $(OOCD) -f interface/$(OOCD_INTERFACE).cfg \ -c "transport select swd" \ -f target/$(OOCD_TARGET).cfg \ -c "program $(BINARY).elf verify reset exit" \ $(NULL) else flash: $(BINARY).elf @printf " FLASH $<\n" (echo "halt; program $(realpath $(*).elf) verify reset" | nc -4 localhost 4444 2>/dev/null) || \ $(OOCD) -f $(OOCD_FILE) \ -c "program $(BINARY).elf verify reset exit" \ $(NULL) endif dbg: $(BINARY).elf $(GDB) $^ -x $(top_dir)/gdb/init.gdb clean: @rm -rf $(objs) *.lds distclean: clean @rm -rf firmware.* tags