Определим кроссплатформу для нашего проекта:
# 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