Используем CMake и GCC для программирования uC STM32 в линуксе.

Всё у армов хорошо, одна беда — все рассчитано на работу в определенных пропиетарных м платных IDE, которые, естественно, никто портировать на linux не собирается. Для линукса есть такая хорошая вещь — ODeV Idea используются make + gcc + eclipse + openocd. Однако, я решил пойти немного другим путем — разобратся, из чего состоит проект для stm32 и использовать cmake для сборки проектов.
UPD: Теперь всё лежит на github'е — https://github.com/ObKo/stm32-cmake
UPD2: Данный текст слегка устарел (но общий принцип сохранился), актуальные доки на github'е

Что же такое cmake?

Это кроссплатформенная система автоматизации сборки программного обеспечения из исходного кода. CMake не занимается непосредственно сборкой, a лишь генерирует файлы управления сборкой из файлов CMakeLists.txt
В CMakе используется свой крайне простой макро-язык. Его поймет любой человек, хоть немного знакомый с программированием. Очень много открытых проектов использует его как основную систему сборки.

Из чего состоят исходники проекта для stm32?

Что нужно для сборки с помощью gcc, использования CMSIS и стандартной библиотеки от STM:
  • Собственно наши исходники
  • Файл-конфигурация стандартной библиотеки STM (stm32f10x_conf.h)
  • Стартовый код — инициализирует чип и вызывает наш main()
  • Скрипт для линковшика, который правильно разместит по адресам нашу собранную программу
Почти всё это можно найти внутри STM32F10x Standart Peripherals Library, осталось это все собрать воедино. Обычно для этого используют GNU Make, но мы пойдем другим путем.

Что нам потребуется

  • OS: Любая, которая поддерживается cmake'ом и тулчейном, я проверял только на линуксе
  • CMake: http://cmake.org
  • ARM-GCC toolchain: Я использовал CodeSourcery G++
  • STM32F10x Standart Peripherals Library

Файл тулчейна для cmake

Такой файл описывает среду сборки нашей программы — компилятор, флаги, линковщик и т.п. Я написал готовую для использования конфигурацию, нужно только поменять пару переменных:

# CodeSourcery toolchain directory
SET(TOOLCHAIN_DIR /opt/arm-toolchain)
# STM Library directory
SET(STM32_StdPeriphLib_DIR /home/kosyak/Downloads/STM32F10x_StdPeriph_Lib_V3.5.0)

TOOLCHAIN_DIR — где лежит ARM Toolchain, STM32_StdPeriphLib_DIR — стандартная библиотека STM.
Далее в файле определены некоторые важные для нас переменные, которые мы будем использовать в проекте:
  • STM32_STARTUP_* — путь к файлу со стартовой программой, * — тип девайса (HD, MD и т.п.)
  • STM32_*_SOURCE — пути к исходникам модулей стд. библитеки периферии, * — SPI, I2C, TIM, etc.

Файл проекта cmake

CMakeLists.txt — самый главный файл, описывающий, что мы, собственно, хотим. Все подбробно описывать не буду, просто быстро пробегусь:
# Project name
PROJECT(stm32test)

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)

SET(CMAKE_TOOLCHAIN_FILE stm32.cmake)

Довольно понятно — проект с именем stm32test, требуем cmake не ниже 2.6 и подключаем файл тулчейна.

# Flash size
SET(STM32_FLASH_SIZE "512K")
# RAM size
SET(STM32_RAM_SIZE "64K")
# Stack address - bottom of RAM => RAM origin + RAM size
SET(STM32_STACK_ADDRESS "0x20010000")

# Origins
SET(STM32_FLASH_ORIGN "0x08000000")
SET(STM32_RAM_ORIGN "0x20000000")

Конфигурация памяти, будет нужна для линковщика.

# Compiler definitions
ADD_DEFINITIONS( 
  # Chip type 
  -DSTM32F10X_HD
  -DUSE_STDPERIPH_DRIVER
)

Дерективы препроцессора — серия HD, используем SPL.

# Set chip type
SET(STARTUP_SOURCE ${STM32_STARTUP_HD})

Выбираем нужный нам стартовый файл (для HD в моем случае).

# Uncomment needed modules
SET(MOD_SOURCES
#  ${STM32_MISC_SOURCE}
....
#  ${STM32_WWDG_SOURCE}
)

Выбираем нужные нам модули.

# Project sources
SET(PROJECT_SOURCES
  main.c
)

Собственно, наши исходники

CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/stm32_flash.ld.in ${CMAKE_CURRENT_BINARY_DIR}/stm32_flash.ld)
SET(CMAKE_EXE_LINKER_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/stm32_flash.ld ${CMAKE_EXE_LINKER_FLAGS}")

Скрипт для линковщика. Парсим файл stm32_flash.ld.in, подставляем в файле вместо ${VARIABLE_NAME} соотв. переменную и записываем результат в stm32_flash.ld, потом передаем параметром для линкера.

INCLUDE_DIRECTORIES(
  ${CMAKE_CURRENT_SOURCE_DIR}/.
  ${STM32_StdPeriphLib_INCLUDE_DIRS}
)

Директории, где будем искать заголовочные файлы.

ADD_EXECUTABLE(${CMAKE_PROJECT_NAME}.elf ${PROJECT_SOURCES} ${MOD_SOURCES} ${STARTUP_SOURCE})

ADD_CUSTOM_COMMAND(TARGET ${CMAKE_PROJECT_NAME}.elf POST_BUILD COMMAND ${CMAKE_OBJCOPY} ARGS -Oihex ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.hex)
ADD_CUSTOM_COMMAND(TARGET ${CMAKE_PROJECT_NAME}.elf POST_BUILD COMMAND ${CMAKE_OBJCOPY} ARGS -Obinary ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.bin)

Компилируем (из файлов проекта, модулей, стартового кода), преобразуем из формата elf в hex и bin

Как это работает

В архиве: CMakeLists.txt — файл проекта, stm32.cmake — файл тулчейна, stm32_flash.ld.in — параметризуемый скрипт линковщика, stm32f10x_conf.h — конфигурация для SPL. Запускаем терминал, переходим в директорию проекта, запускаем cmake:
$ cmake -DCMAKE_TOOLCHAIN_FILE=stm32.cmake .

Если все правильно, то он сгенирирует Makefile, делаем
$ make

и получаем скомпилированную прошивку.
В дальнейшем планирую прикрутить всё это дело к эклипсу, благо поддержка cmake в eclipse есть.
UPD: Текущая версия шаблона проекта здесь: http://stm32.kosyak.info/stm32_cmake_template.tar.gz
  • +2
  • 16 июня 2011, 21:00
  • Kosyak
  • 1
Файлы в топике: stm32_cmake.tar.gz

Комментарии (12)

RSS свернуть / развернуть
ждёмс инструкцию к эклипсу) сегодня попробую CMake в деле
0
  • avatar
  • pkm
  • 16 июня 2011, 21:36
… насколько я помню CodeSourcery G++ бесплатно предоставляет только 30-дневный триал
кстати сегодня мне пришло письмо на мыло
In December 2010, CodeSourcery was acquired by Mentor Graphics and is now officially a part of the Mentor Embedded division. Our customers stand to benefit the most from this move as both Mentor Embedded and CodeSourcery share a synergistic vision around our commitments to open source tools and technologies
0
… а вот и ссылка на новую совместную с Mentor IDE Sourcery CodeBench
0
… насколько я помню CodeSourcery G++ бесплатно предоставляет только 30-дневный триал
кстати сегодня мне пришло письмо на мыло

Качай CodeSourcery G++ Lite, это только сам тулчейн без IDE, полностью бесплатный.
Сам сейчас пользуюсь Eclipse + CodeSourcery G++ Lite + STLink GDB server.

Если лень заморачиватся с мейкфайлами можно прикрутить ARM плагин к эклипсу.
0
Утащил в блог STM32
0
… и получаем скомпилированную прошивку

Дык ее еще и залить надо. Опять вайн (wine) или есть что-то альтернативное ст-линку? Сам пользуюсь виндой только для того, чтобы прошить камень, не очень удобно туда-сюда переключаться.

Кстати, в линухе кто-нибудь вообще завел (и как?) STLink GDB server для STM32Discovery под эклипсом?
0
Так а stm32flash чем не приглянулось? Оно по USARTу шьет при помощи встроенного бутлоадера.
0
речь о GDB, он не только для прошивки нужен, но и для отладки
0
«Сам пользуюсь виндой только для того, чтобы прошить камень» я про это писал)
тут про отладку ни слова
0
Кстати, в линухе кто-нибудь вообще завел (и как?) STLink GDB server для STM32Discovery под эклипсом?
0
опечатка в первом же предложении: «в определенных пропиетарных м платных IDE»…

кстати о проприетарщине — где-то в интернетах была статья об использовании Eclipse с плагином ARM и компилятором ARM-GCC для программирования под STM32F (всё свободное). Лично я именно так и написал первую программу — этим инструментарием, полностью из свободного ПО. Работает и в винде, и в линуксе. Исключение — прошивальщик (проприетарный STM32 ST-Link Utility).
0
Спасибо за статью! После прочтения улеглось в голове большое количество разрозненной информации!
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.