# Minimal Makefile for STM32F407 SPI test with SEGGER RTT
#
# Toolchain: arm-none-eabi-gcc
#
# Uses:
# - standalone stm32f4xx-hal-driver repository
# - CMSIS device pack for STM32F4
# - CMSIS Core
# - SEGGER RTT
HAL_REPO ?= stm32f4xx-hal-driver
CMSIS_CORE_REPO ?= cmsis_core
CMSIS_DEVICE_F4_REPO ?= cmsis_device_f4
HAL_DIR := $(HAL_REPO)
CMSIS_CORE := $(CMSIS_CORE_REPO)/CMSIS/Core
CMSIS_DEV := $(CMSIS_DEVICE_F4_REPO)
CC := arm-none-eabi-gcc
AS := arm-none-eabi-gcc
OBJCOPY := arm-none-eabi-objcopy
SIZE := arm-none-eabi-size
TARGET := bootloader
BUILD := build
APP_OBJDIR := $(BUILD)/app
RTT_OBJDIR := $(BUILD)/rtt
HAL_OBJDIR := $(BUILD)/hal
CMSIS_OBJDIR := $(BUILD)/cmsis
CFLAGS := -mcpu=cortex-m4 \
-mthumb \
-O0 \
-g3 \
-ffunction-sections \
-fdata-sections \
-Wall \
-Wextra \
-Wno-unused-parameter \
-std=gnu11 \
-DSTM32F407xx \
-DUSE_HAL_DRIVER \
-DUSER_VECT_TAB_ADDRESS \
-DVECT_TAB_SRAM
INCLUDES := -Iinclude \
-Iinc \
-Ihal_conf \
-IRTT \
-I$(HAL_DIR)/Inc \
-I$(CMSIS_CORE)/Include \
-I$(CMSIS_DEV)/Include
LDSCRIPT := STM32F417IG_SRAM.ld
LDFLAGS := -T$(LDSCRIPT) \
-Wl,--gc-sections \
--specs=nosys.specs
# --------------------------------------------------------------------------
# Sources
# --------------------------------------------------------------------------
APP_SRCS_C := \
src/main.c \
src/common.c \
src/spi_transport_backend.c
RTT_SRCS_C := \
RTT/SEGGER_RTT.c \
RTT/SEGGER_RTT_printf.c
HAL_SRCS_C := \
$(HAL_DIR)/Src/stm32f4xx_hal.c \
$(HAL_DIR)/Src/stm32f4xx_hal_gpio.c \
$(HAL_DIR)/Src/stm32f4xx_hal_dma.c \
$(HAL_DIR)/Src/stm32f4xx_hal_spi.c \
$(HAL_DIR)/Src/stm32f4xx_hal_flash.c \
$(HAL_DIR)/Src/stm32f4xx_hal_flash_ex.c \
$(HAL_DIR)/Src/stm32f4xx_hal_cortex.c \
$(HAL_DIR)/Src/stm32f4xx_hal_rcc.c
CMSIS_SRCS_C := \
$(CMSIS_DEV)/Source/Templates/system_stm32f4xx.c
SRCS_S := \
src/startup_stm32f40_41xxx.s
# --------------------------------------------------------------------------
# Object files
# --------------------------------------------------------------------------
APP_OBJS := \
$(patsubst src/%.c,$(APP_OBJDIR)/%.o,$(APP_SRCS_C))
RTT_OBJS := \
$(patsubst RTT/%.c,$(RTT_OBJDIR)/%.o,$(RTT_SRCS_C))
HAL_OBJS := $(addprefix $(HAL_OBJDIR)/,$(notdir $(HAL_SRCS_C:.c=.o)))
CMSIS_OBJS := \
$(addprefix $(CMSIS_OBJDIR)/,$(notdir $(CMSIS_SRCS_C:.c=.o)))
STARTUP_OBJS := \
$(patsubst %.s,$(BUILD)/%.o,$(SRCS_S))
OBJS := \
$(APP_OBJS) \
$(RTT_OBJS) \
$(HAL_OBJS) \
$(CMSIS_OBJS) \
$(STARTUP_OBJS)
DEPS := $(OBJS:.o=.d)
# --------------------------------------------------------------------------
# Targets
# --------------------------------------------------------------------------
.PHONY: all clean size
all: $(BUILD)/$(TARGET).elf \
$(BUILD)/$(TARGET).bin \
size
# --------------------------------------------------------------------------
# Application
# --------------------------------------------------------------------------
$(APP_OBJDIR)/%.o: src/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -c $< -o $@
# --------------------------------------------------------------------------
# SEGGER RTT
# --------------------------------------------------------------------------
$(RTT_OBJDIR)/%.o: RTT/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -c $< -o $@
# --------------------------------------------------------------------------
# HAL
# --------------------------------------------------------------------------
$(HAL_OBJDIR)/%.o: $(HAL_DIR)/Src/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -c $< -o $@
# --------------------------------------------------------------------------
# CMSIS
# --------------------------------------------------------------------------
$(CMSIS_OBJDIR)/%.o: $(CMSIS_DEV)/Source/Templates/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -c $< -o $@
# --------------------------------------------------------------------------
# Startup
# --------------------------------------------------------------------------
$(BUILD)/%.o: %.s
@mkdir -p $(dir $@)
$(AS) $(CFLAGS) -c $< -o $@
# --------------------------------------------------------------------------
# Link
# --------------------------------------------------------------------------
$(BUILD)/$(TARGET).elf: $(OBJS)
$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) -o $@
# --------------------------------------------------------------------------
# Binary
# --------------------------------------------------------------------------
$(BUILD)/$(TARGET).bin: $(BUILD)/$(TARGET).elf
$(OBJCOPY) -O binary $< $@
# --------------------------------------------------------------------------
# Size
# --------------------------------------------------------------------------
size: $(BUILD)/$(TARGET).elf
$(SIZE) $<
# --------------------------------------------------------------------------
# Clean
# --------------------------------------------------------------------------
clean:
rm -rf $(BUILD)
# --------------------------------------------------------------------------
# Dependencies
# --------------------------------------------------------------------------
-include $(DEPS)