diff --git a/Makefile b/Makefile new file mode 100644 --- /dev/null +++ b/Makefile @@ -0,0 +1,232 @@ +# STM32F0xx Makefile +# ##################################### +# +# Part of the uCtools project +# uctools.github.com +# +####################################### +# user configuration: +####################################### + +BUILD_NUMBER ?= 0 + +# SOURCES: list of sources in the user application +SOURCES = main.c system_stm32f0xx.c adc.c dma.c gpio.c i2c.c stm32f0xx_hal_msp.c stm32f0xx_it.c usart.c gps.c + +# TARGET: name of the user application +TARGET = wsprhab-b$(BUILD_NUMBER) + +# BUILD_DIR: directory to place output files in +BUILD_DIR = build + +# LD_SCRIPT: location of the linker script +LD_SCRIPT = STM32F031G6_FLASH.ld + +# USER_DEFS user defined macros +USER_DEFS = -D HSE_VALUE=16000000 +USER_DEFS += -D WSPRHAB_BUILD_NUMBER=$(BUILD_NUMBER) + +# USER_INCLUDES: user defined includes +USER_INCLUDES = + +# USB_INCLUDES: includes for the usb library +# USB_INCLUDES = -IMiddlewares/ST/STM32_USB_Device_Library/Core/Inc +#USB_INCLUDES += -IMiddlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc + +SI5351_INCLUDES = -Ilib/si5351 + +JTENCODE_INCLUDES = -Ilib/jtencode + +# USER_CFLAGS: user C flags (enable warnings, enable debug info) +USER_CFLAGS = -Wall -g -ffunction-sections -fdata-sections -Os -fno-common --function-sections -fdata-sections -flto +# USER_LDFLAGS: user LD flags +USER_LDFLAGS = -fno-exceptions -ffunction-sections -fdata-sections -Wl,--gc-sections -flto +USER_LDFLAGS += --static +# -nostartfiles + +# TARGET_DEVICE: device to compile for +TARGET_DEVICE = STM32F031x6 + +####################################### +# end of user configuration +####################################### +# +####################################### +# binaries +####################################### +CC = arm-none-eabi-gcc +AR = arm-none-eabi-ar +RANLIB = arm-none-eabi-ranlib +SIZE = arm-none-eabi-size +OBJCOPY = arm-none-eabi-objcopy +MKDIR = mkdir -p +####################################### + +# core and CPU type for Cortex M0 +# ARM core type (CORE_M0, CORE_M3) +CORE = CORE_M0 +# ARM CPU type (cortex-m0, cortex-m3) +CPU = cortex-m0 + +# where to build STM32Cube +CUBELIB_BUILD_DIR = $(BUILD_DIR)/STM32Cube + +# various paths within the STmicro library +CMSIS_PATH = drivers/CMSIS +CMSIS_DEVICE_PATH = $(CMSIS_PATH)/Device/ST/STM32F0xx +DRIVER_PATH = drivers/STM32F0xx_HAL_Driver + + +# includes for gcc +INCLUDES = -I$(CMSIS_PATH)/Include +INCLUDES += -I$(CMSIS_DEVICE_PATH)/Include +INCLUDES += -I$(DRIVER_PATH)/Inc +INCLUDES += -Iinc +#INCLUDES += $(USB_INCLUDES) +INCLUDES += $(USER_INCLUDES) +INCLUDES += $(SI5351_INCLUDES) +INCLUDES += $(JTENCODE_INCLUDES) + + +# macros for gcc +DEFS = -D$(CORE) $(USER_DEFS) -D$(TARGET_DEVICE) + +# compile gcc flags +CFLAGS = $(DEFS) $(INCLUDES) +CFLAGS += -mcpu=$(CPU) -mthumb -msoft-float +CFLAGS += $(USER_CFLAGS) + +# default action: build the user application +all: $(BUILD_DIR)/$(TARGET).bin $(BUILD_DIR)/$(TARGET).hex + +flash: all + st-flash write $(BUILD_DIR)/$(TARGET).bin 0x8000000 + + +####################################### +# build the st micro peripherial library +# (drivers and CMSIS) +####################################### + +CUBELIB = $(CUBELIB_BUILD_DIR)/libstm32cube.a + +# List of stm32 driver objects +CUBELIB_DRIVER_OBJS = $(addprefix $(CUBELIB_BUILD_DIR)/, $(patsubst %.c, %.o, $(notdir $(wildcard $(DRIVER_PATH)/Src/*.c)))) + +# shortcut for building core library (make cubelib) +cubelib: $(CUBELIB) + +$(CUBELIB): $(CUBELIB_DRIVER_OBJS) + $(AR) rv $@ $(CUBELIB_DRIVER_OBJS) + $(RANLIB) $@ + +$(CUBELIB_BUILD_DIR)/%.o: $(DRIVER_PATH)/Src/%.c | $(CUBELIB_BUILD_DIR) + $(CC) -c $(CFLAGS) -o $@ $^ + +$(CUBELIB_BUILD_DIR): + $(MKDIR) $@ + +####################################### +# build the USB library +####################################### +#USB_MIDDLEWARE_PATH = ./Middlewares/ST/STM32_USB_Device_Library/ +#USB_BUILD_DIR = $(BUILD_DIR)/usb +#USB_SOURCES += usbd_ctlreq.c usbd_ioreq.c usbd_core.c usbd_cdc.c +# list of usb library objects +#USB_OBJECTS += $(addprefix $(USB_BUILD_DIR)/,$(notdir $(USB_SOURCES:.c=.o))) + +#usb: $(USB_OBJECTS) + +#$(USB_BUILD_DIR)/%.o: $(USB_MIDDLEWARE_PATH)/Core/Src/%.c | $(USB_BUILD_DIR) +# $(CC) -Os $(CFLAGS) -c -o $@ $^ +# +#$(USB_BUILD_DIR)/%.o: $(USB_MIDDLEWARE_PATH)/Class/CDC/Src/%.c | $(USB_BUILD_DIR) +# $(CC) -Os $(CFLAGS) -c -o $@ $^ + +#$(USB_BUILD_DIR): +# @echo $(USB_BUILD_DIR) +# $(MKDIR) $@ + + +####################################### +# build the user libraries +####################################### + +# si5351 +SI5351_PATH = ./lib/si5351/ +SI5351_BUILD_DIR = $(BUILD_DIR)/si5351 +SI5351_SOURCES += si5351.c + +SI5351_OBJECTS += $(addprefix $(SI5351_BUILD_DIR)/,$(notdir $(SI5351_SOURCES:.c=.o))) + +si5351: $(SI5351_OBJECTS) + +$(SI5351_BUILD_DIR)/%.o: $(SI5351_PATH)/%.c | $(SI5351_BUILD_DIR) + $(CC) -Os $(CFLAGS) -c -o $@ $^ + +$(SI5351_BUILD_DIR): + @echo $(SI5351_BUILD_DIR) + $(MKDIR) $@ + +# jtencode +JTENCODE_PATH = ./lib/jtencode/ +JTENCODE_BUILD_DIR = $(BUILD_DIR)/jtencode +JTENCODE_SOURCES += jtencode.c init_rs_int.c encode_rs_int.c + +JTENCODE_OBJECTS += $(addprefix $(JTENCODE_BUILD_DIR)/,$(notdir $(JTENCODE_SOURCES:.c=.o))) + +jtencode: $(JTENCODE_OBJECTS) + +$(JTENCODE_BUILD_DIR)/%.o: $(JTENCODE_PATH)/%.c | $(JTENCODE_BUILD_DIR) + $(CC) -Os $(CFLAGS) -c -o $@ $^ + +$(JTENCODE_BUILD_DIR): + @echo $(JTENCODE_BUILD_DIR) + $(MKDIR) $@ + + + +####################################### +# build the user application +####################################### + +# list of user program objects +OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(SOURCES:.c=.o))) +# add an object for the startup code +OBJECTS += $(BUILD_DIR)/startup_stm32f031x6.o + +# use the periphlib core library, plus generic ones (libc, libm, libnosys) +LIBS = -lstm32cube -lc -lm -lnosys +LDFLAGS = -T $(LD_SCRIPT) -L $(CUBELIB_BUILD_DIR) -static $(LIBS) $(USER_LDFLAGS) + +$(BUILD_DIR)/$(TARGET).hex: $(BUILD_DIR)/$(TARGET).elf + $(OBJCOPY) -O ihex $(BUILD_DIR)/$(TARGET).elf $@ + +$(BUILD_DIR)/$(TARGET).bin: $(BUILD_DIR)/$(TARGET).elf + $(OBJCOPY) -O binary $(BUILD_DIR)/$(TARGET).elf $@ + +#$(USB_OBJECTS) -o $(USB_OBJECTS) +$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) $(SI5351_OBJECTS) $(JTENCODE_OBJECTS) $(CUBELIB) + $(CC) -o $@ $(CFLAGS) $(OBJECTS) $(SI5351_OBJECTS) $(JTENCODE_OBJECTS) \ + $(LDFLAGS) -Xlinker \ + -Map=$(BUILD_DIR)/$(TARGET).map + $(SIZE) $@ + +$(BUILD_DIR)/%.o: src/%.c | $(BUILD_DIR) + $(CC) $(CFLAGS) -Os -c -o $@ $^ + +$(BUILD_DIR)/%.o: src/%.s | $(BUILD_DIR) + $(CC) $(CFLAGS) -c -o $@ $^ + +$(BUILD_DIR): + $(MKDIR) $@ + +# delete all user application files, keep the libraries +clean: + -rm $(BUILD_DIR)/*.o + -rm $(BUILD_DIR)/*.elf + -rm $(BUILD_DIR)/*.hex + -rm $(BUILD_DIR)/*.map + -rm $(BUILD_DIR)/*.bin + +.PHONY: clean all cubelib