Первый старт с STM32-Discovery [Часть 4]

6 Января 2011 К комментариям

Сегодня по плану:

  • создать основу для проекта
  • написать Makefile
  • попробовать прошить МК

STM32-Discovery

Makefile

В прошлый раз мы написали часть инициализации, теперь осталось собрать это все в единое целое, создать структуру проекта и попробовать собрать его.

Можно компилировать каждый отдельный файл в ручную, но гораздо удобнее автоматизировать этот процесс, для этого есть замечательная утилита GNU Make. Сценарий согласно которому она производит сборку проекта принято располагать в файле с именем Makefile, если не указывать на прямую пусть к файлу, то при запуске она ищет в текущей директории данный файл.

Формат файла достаточно своеобразен, поэтому лучше конечно почитать о нем в документации к make.

Я составил минимально возможный сценарий для сборки проекта:

#==========================================================
#	File:	Makefile for Cortex-M3
#	Date:	2011-01-02
#==========================================================

OPTIMIZATION = -Os

#----------------------------------------------------------

SRC_C = startup.c
SRC_C += main.c

#----------------------------------------------------------

CROSS_PATH = C:/Tools/CodeSourcery/2010-09-51/

CROSS = $(CROSS_PATH)/bin/arm-none-eabi-

INCLUDES += -I$(CROSS_PATH)/arm-none-eabi/include
INCLUDES += -I$(CROSS_PATH)/arm-none-eabi/include/lib
INCLUDES += -Imcu
INCLUDES += -Imcu/peripherals
INCLUDES += -Imcu/startup
INCLUDES += -Iutility

VPATH += mcu
VPATH += mcu/startup
VPATH += mcu/peripherals
VPATH += utility

#----------------------------------------------------------

FLAGS_C  = $(INCLUDES) -I.
FLAGS_C += $(OPTIMIZATION)
FLAGS_C += -Wall
FLAGS_C += -c
FLAGS_C += -fmessage-length=0
FLAGS_C += -fno-builtin
FLAGS_C += -ffunction-sections
FLAGS_C += -fdata-sections
FLAGS_C += -msoft-float
FLAGS_C += -mapcs-frame
FLAGS_C += -D__thumb2__=1
FLAGS_C += -mno-sched-prolog
FLAGS_C += -fno-hosted
FLAGS_C += -mtune=cortex-m3
FLAGS_C += -mcpu=cortex-m3
FLAGS_C += -mthumb
FLAGS_C += -mfix-cortex-m3-ldrd

FLAGS_LD = -Xlinker
FLAGS_LD += --gc-sections
FLAGS_LD += -mcpu=cortex-m3
FLAGS_LD += -mthumb
FLAGS_LD += -static   
FLAGS_LD += -nostdlib

#----------------------------------------------------------

all: clean target.elf

%.elf: $(SRC_C:%.c=target/%.o)
	@echo Linking: $@
	@$(CROSS)gcc $(FLAGS_LD) -T'mcu/stm32f100rb.lsf' -o 'target/$@' $^ $(LD_LIB)
	@echo '-----------------------------------------------------------'
	@$(CROSS)size 'target/target.elf'
	@$(CROSS)objcopy -O binary 'target/target.elf' 'target/target.bin'
	@$(CROSS)objcopy -O ihex 'target/target.elf' 'target/target.hex'
	@$(CROSS)objdump -h -S -z 'target/target.elf' > 'target/target.lss'
	@$(CROSS)nm -n 'target/target.elf' > 'target/target.sym'
	@rm -f target/*.o

$(SRC_C:%.c=target/%.o): target/%.o: %.c
	@echo Compiling: $>
	@$(CROSS)gcc $(FLAGS_C) -c $> -o $@

clean:
	@echo '-----------------------------------------------------------'
	@rm -f target/*.*	

.PHONY : all clean

Кратенько о содержании:

OPTIMIZATION = s задаем уровень оптимизации, может принимать [0,1,2,3,s] в данном случае оптимизировать по размеру выходного кода, как правило его не так часто нужно менять
SRC_C = startup.c
SRC_C += main.c
указываем какие файлы нужно компилировать, при добавлении новых нужно добавить в ручную, например создали файл test.c, то добавить нужно строчку SRC_C += test.c
CROSS_PATH = C:/Tools/CodeSourcery/2010-09-51/ CROSS = $(CROSS_PATH)/bin/arm-none-eabi- INCLUDES += -I$(CROSS_PATH)/arm-none-eabi/include
INCLUDES += -I$(CROSS_PATH)/arm-none-eabi/include/lib
INCLUDES += -Imcu
INCLUDES += -Imcu/peripherals
INCLUDES += -Imcu/startup
INCLUDES += -Iutility VPATH += mcu
VPATH += mcu/startup
VPATH += mcu/peripherals
VPATH += utility
указываем пути до GCC, а так же пути где компилятору искать файлы исходных кодов и заголовочные файлы.
FLAGS_C = $(INCLUDES) -I.
FLAGS_C += -O$(OPTIMIZATION)
FLAGS_C += -Wall
FLAGS_C += -c
FLAGS_C += -fmessage-length=0
FLAGS_C += -fno-builtin
FLAGS_C += -ffunction-sections
FLAGS_C += -fdata-sections
FLAGS_C += -msoft-float
FLAGS_C += -mapcs-frame
FLAGS_C += -D__thumb2__=1
FLAGS_C += -mno-sched-prolog
FLAGS_C += -fno-hosted
FLAGS_C += -mtune=cortex-m3
FLAGS_C += -mcpu=cortex-m3
FLAGS_C += -mthumb
FLAGS_C += -mfix-cortex-m3-ldrd FLAGS_LD = -Xlinker
FLAGS_LD += --gc-sections
FLAGS_LD += -mcpu=cortex-m3
FLAGS_LD += -mthumb
FLAGS_LD += -static
FLAGS_LD += -nostdlib
ключи для правильно компиляции и сборки
all: clean target.elf
в этой части описаны так называемые цели, т.е. сам сценарий сборки

Основа проекта

Нам осталось только всё созданные файлы разложить по “полочкам”, мне нравиться вот такая структура проекта:

image

target директория выходных файлов (прошивка)
mcu содержит файл инициализации, файл сценария для компоновщика
peripherals файлы для работы с периферией
корневая директория содержит только файл основной программы (main) и Makefile

Ну вот можно попробовать и собрать проект. Скачиваем, распаковываем в удобное место, переходим в корневую директорию проекта и выполняем команду “make all” и на выходе должны получить вот такую информацию:

-----------------------------------------------------------
Compiling: mcu/startup.c
Compiling: main.c
Linking: target.elf
-----------------------------------------------------------
   text	   data	    bss	    dec	    hex	filename
	376	      0	    200	    576	    240	target/target.elf

Если не получили проверьте правильность установки GCC, а если все правильно попробуем зашить программу в МК, правда пока эта программа ни чего не делает полезного ;)

Подключим плату STM32-Discovery к компьютеру и запустим STM32 ST-Link Utility:

2011-01-02



comments powered by Disqus