Первый старт с STM32-Discovery [Часть 4]
Сегодня по плану:
- создать основу для проекта
- написать Makefile
- попробовать прошить МК
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
… |
в этой части описаны так называемые цели, т.е. сам сценарий сборки |
Основа проекта
Нам осталось только всё созданные файлы разложить по “полочкам”, мне нравиться вот такая структура проекта:
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:
comments powered by Disqus