Makefile

Определим кроссплатформу для нашего проекта:

# Compilator prefix
CROSS_PREFIX=arm-none-eabi-

Также определим компилятор и прочие программы для сборки:

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

Укажем пути библиотек, заголовочных файлов и файлов исходных кодов ОСРВ:

# Paths
STM_PATH=../../stlink/example
LIBS_STM_PATH=$(STM_PATH)/libs_stm
FREERTOS_PATH=../FreeRTOSV7.1.1/Source

Определим платформу с которой мы будем работать - stm32f10x:

# Platform
PLATFORM=stm32f10x

Зададим основные флаги компилятора - оптимизацию по размеру, тип командой системы а также тип ядра процессора и указатель для заголовочного файла который показывает семейство используемого МК:

# Primary compiler flags
CFLAGS=-g -Os -mlittle-endian -mthumb -ffreestanding
CFLAGS+= -mcpu=cortex-m3 -DSTM32F10X_MD

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

# 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+= -I$(FREERTOS_PATH)/include
CFLAGS+= -I$(FREERTOS_PATH)/portable/GCC/ARM_CM3
CFLAGS+= -Wl,-T,stm32f102xb_flash.ld

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

# Linker flags
LDFLAGS=-L. -nostartfiles

Укажем путь хранения исходных файлов проекта и ОС:

# Sources and objects

SRCS=$(wildcard *.c)
SRCS+=$(FREERTOS_PATH)/list.c
SRCS+=$(FREERTOS_PATH)/croutine.c
SRCS+=$(FREERTOS_PATH)/queue.c
SRCS+=$(FREERTOS_PATH)/tasks.c
SRCS+=$(FREERTOS_PATH)/timers.c
SRCS+=$(FREERTOS_PATH)/portable/GCC/ARM_CM3/port.c
SRCS+=$(FREERTOS_PATH)/portable/MemMang/heap_1.c

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

OBJS=$(SRCS:.c=.o)
Зададим правила для компиляции, сборки, прошивки и очистки проекта:
# Rules for compile
all: firmware.bin
# Making binary firmware file
%bin: %elf
    $(OBJCOPY) -O binary $^ $@
    $(SIZE) $^
# 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 $(OBJS)
# Rules for write firmware to mcu
write: firmware.bin
    qstlink2 -cewV ./firmware.bin
# PHONY
.PHONY: all clean