# STM32F0xx Makefile # ##################################### # # Part of the uCtools project # uctools.github.com # ####################################### # user configuration: ####################################### # SOURCES: list of sources in the user application SOURCES = main.c gpio.c ssd1306.c display.c flash.c max31855.c max31865.c pid.c SOURCES += system/usbd_conf.c system/usbd_cdc_if.c system/usb_device.c system/usbd_desc.c system/spi.c system/interrupts.c system/system_stm32f0xx.c system/stringhelpers.c system/syslib.c #SRC = $(shell find . -name *.c) # TARGET: name of the user application TARGET = main # BUILD_DIR: directory to place output files in BUILD_DIR = build # LD_SCRIPT: location of the linker script LD_SCRIPT = stm32f042c6_flash.ld # USER_DEFS user defined macros USER_DEFS = -D HSI48_VALUE=48000000 -D HSE_VALUE=16000000 # USER_INCLUDES: user defined includes USER_INCLUDES = -Isystem # 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 # USER_CFLAGS: user C flags (enable warnings, enable debug info) USER_CFLAGS = -Wall -g -ffunction-sections -fno-exceptions -fdata-sections -Os --function-sections -fno-common # USER_LDFLAGS: user LD flags USER_LDFLAGS = -fno-exceptions -ffunction-sections -fno-exceptions -fdata-sections -Wl,--gc-sections USER_LDFLAGS += --static # TARGET_DEVICE: device to compile for TARGET_DEVICE = STM32F042x6 ####################################### # 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 += -I$(CURDIR) INCLUDES += -I$(CURDIR)/usb INCLUDES += $(USB_INCLUDES) INCLUDES += $(USER_INCLUDES) # macros for gcc DEFS = -D$(CORE) $(USER_DEFS) -D$(TARGET_DEVICE) # compile gcc flags CFLAGS = $(DEFS) $(INCLUDES) CFLAGS += -mcpu=$(CPU) -mthumb CFLAGS += $(USER_CFLAGS) # default action: build the user application all: $(BUILD_DIR)/$(TARGET).hex ####################################### # 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 application ####################################### SYSTEM_BUILD_DIR = $(BUILD_DIR)/system # list of user program objects #OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(SOURCES:.c=.o))) OBJECTS = $(addprefix $(BUILD_DIR)/,$(SOURCES:.c=.o)) # add an object for the startup code OBJECTS += $(BUILD_DIR)/system/startup_stm32f042x6.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) $(LIBS) $(USER_LDFLAGS) $(BUILD_DIR)/$(TARGET).hex: $(BUILD_DIR)/$(TARGET).elf | $(SYSTEM_BUILD_DIR) $(OBJCOPY) -O ihex $(BUILD_DIR)/$(TARGET).elf $@ $(OBJCOPY) -O binary $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).bin $(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) $(USB_OBJECTS) $(CUBELIB) | $(SYSTEM_BUILD_DIR) $(CC) -o $@ $(CFLAGS) $(USER_LDFLAGS) $(OBJECTS) $(USB_OBJECTS) \ -L$(CUBELIB_BUILD_DIR) -static $(LIBS) -Xlinker \ -Map=$(BUILD_DIR)/$(TARGET).map \ -T $(LD_SCRIPT) $(SIZE) $@ $(SYSTEM_BUILD_DIR): @echo $(SYSTEM_BUILD_DIR) $(MKDIR) $@ $(BUILD_DIR)/%.o: %.c | $(BUILD_DIR) $(SYSTEM_BUILD_DIR) $(CC) $(CFLAGS) -Os -c -o $@ $^ $(BUILD_DIR)/%.o: %.s | $(BUILD_DIR) $(SYSTEM_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)/*.bin -rm $(BUILD_DIR)/*.map .PHONY: clean all cubelib