Makefile

Makefile

Определим кросс-компилятор из уже установленного toolchain:

# Compilator prefix
CROSS_PREFIX=arm-softfloat-linux-gnueabi-

Затем нам нужно определить комплилятор и утилиту для копирования объектных файлов:

# Compilators and utils
CC=$(CROSS_PREFIX)gcc
OBJCOPY=$(CROSS_PREFIX)objcopy

Добавим пути и платформу для внешних заголовочных файлов:

# Paths
STM_PATH=../../stlink/example
LIBS_STM_PATH=$(STM_PATH)/libs_stm
# Platform
PLATFORM=stm32f4xx

Первичные флаги для компилятора содержат необходимые опции для компилятора и сборщика, а также опции оптимизации и специальные настройки под ядро мк:

# Primary compiler flags
CFLAGS=-g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc
CFLAGS+= -mcpu=cortex-m3 -DSTM32F4XX

Вторичные же флаги содержат пути библиотек и заголовочных файлов для компилятора и сброщика, а также карту памяти для сборки кода:

# Secondary compiler flags
CFLAGS+= -I.
CFLAGS+= -I$(LIBS_STM_PATH)/inc/base
CFLAGS+= -I$(LIBS_STM_PATH)/inc/core_support
CFLAGS+= -I$(LIBS_STM_PATH)/inc/device_support
CFLAGS+= -Wl,-T,stm32f4xxxg_flash.ld
# Linker flags
LDFLAGS=-L.

Определим входные файлы и правила сборки, очистки для них, а также правила для загрузки прошивки в мк, т.к. прошивка стандартными средствами st-util не работает, то воспользуетмся дополнительной утилитой для прошивки:

# Sources and objects
SRCS=$(wildcard *.c)
OBJS=$(SRCS:.c=.o)
# Rules for compile
all: firmware.bin
# Making binary firmware file
%bin: %elf
    $(OBJCOPY) -O binary $^ $@
# Making elf
firmware.elf: $(OBJS)
    $(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS)
# Making objects
%.o: $.c
    $(CC) $(CFLAGS) -c -o $@ $^
# Rules for clean
clean:
    rm -rf *.o *.elf *.bin
# Rules for write firmware to mcu
write: firmware.bin
    qstlink2 -cewV ./firmware.bin
# PHONY
.PHONY: all clean