На примере makefile для STM32L, покажем как писать makefile для ARM cortex-m3.
NOTE: У вас уже должен быть установлен cross компилятор для ARM, например отсюда: GNU Tools for ARM Embedded Processors — https://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.c, startup_stm32l1xx_md.s, system_stm32l1xx.h, stm32l1xx.h можно найти в интернете, они распространяются ST соответственно для своих микроконтроллеров. Файлы core_cmInstr.h, core_cmInstr.h, core_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.