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