:::: MENU ::::

makefile для ARM cortex-m3 на простом примере, часть 1

На примере makefile для STM32L, покажем как писать makefile для ARM cortex-m3.

NOTE: У вас уже должен быть установлен cross компилятор для ARM, например отсюда: GNU Tools for ARM Embedded Processorshttps://launchpad.net/gcc-arm-embedded.

Для начала создадим простой проект:

Project
* main.c 
* System
    * stm32l152rb.ld
    * Src 
        * system_stm32l1xx.c
        * startup_stm32l1xx_md.s
    * Inc
        * core_cm3.h
        * core_cmFunc.h
        * core_cmInstr.h
        * stm32l1xx.h
        * system_stm32l1xx.h

Файлы stm32l152rb.ld, system_stm32l1xx.cstartup_stm32l1xx_md.s, system_stm32l1xx.hstm32l1xx.h можно найти в интернете, они распространяются ST соответственно для своих микроконтроллеров. Файлы core_cmInstr.h, core_cmInstr.hcore_cm3.h это часть CMSIS (Cortex Microcontroller Software Interface Standard) они распространяются ARM, ну и в библиотеках от ST их тоже можно найти.

main.c создаем сами и для примера пишем туда, какой-нибудь простой код:

#include "stm32l1xx.h"
int main(void)
{
    while(1);
}

Для того, что бы все было понятно, как полностью скомпилировать и слинковать проект, я буду все делать по шагам и использовать полные пути. А после выполнения пошаговой сборки, мы создадим Makefile, который будет делать все автоматически.

Итак мой cross компилятор лежит:

/home/sasha/ARMTollChain/gcc-arm-none-eabi-4_9-2014q4/bin/

Путь к проекту:

/home/sasha/Project_X/NewGenSTM32/start/

NOTE: В командах представленных ниже, эти пути вы должны заменить на свои.

Сначала, компилируем все .c и .s файлы по отдельности. Для этого в корневой директории проекта выполняем команды:

/home/sasha/ARMTollChain/gcc-arm-none-eabi-4_9-2014q4/bin/arm-none-eabi-gcc \
-mcpu=cortex-m3 \
-mlittle-endian \
-mthumb \
-I/home/sasha/Project_X/NewGenSTM32/start/System/Inc \
-c \
main.c \
-o \
main.o

В директории проекта System/Src:

/home/sasha/ARMTollChain/gcc-arm-none-eabi-4_9-2014q4/bin/arm-none-eabi-gcc \
-mcpu=cortex-m3 \
-mlittle-endian \
-mthumb \
-I/home/sasha/Project_X/NewGenSTM32/start/System/Inc \
-c \
system_stm32l1xx.c \
-o \
system_stm32l1xx.o

И

/home/sasha/ARMTollChain/gcc-arm-none-eabi-4_9-2014q4/bin/arm-  none-eabi-gcc \
-mcpu=cortex-m3 \
-mlittle-endian \
-mthumb \
-I/home/sasha/Project_X/NewGenSTM32/start/System/Inc \
-c \
startup_stm32l1xx_md.s \
-o \
startup_stm32l1xx_md.o

Теперь у нас есть все *.o, теперь их нужно слинковать.

В корневой директории нашего проекта:

/home/sasha/ARMTollChain/gcc-arm-none-eabi-4_9-2014q4/bin/arm-none-eabi-gcc \
-mcpu=cortex-m3 \
-mlittle-endian \
-mthumb \
-T/home/sasha/Project_X/NewGenSTM32/start/System/stm32l152rb.ld \
-Wl,--gc-sections \
/home/sasha/Project_X/NewGenSTM32/start/main.o \
/home/sasha/Project_X/NewGenSTM32/start/System/Src/system_stm32l1xx.o \
/home/sasha/Project_X/NewGenSTM32/start/System/Src/startup_stm32l1xx_md.o \
-o \
main.elf

Теперь у нас есть .elf. Для прошивки в микроконтроллер нам нужен .bin. Для его получения вызываем команду:

arm-none-eabi-objcopy -Oihex main.elf main.hex

В следующей статье будем вводить команды не по отдельности, а напишем Makefile, который все сделает сам.

Ссылка на скачивание примера — start.tar.