Вариант тулчейна для разработки под STM32F0 в Linux на основе PlatformIO

С переходом на Debian Linux как основную рабочую систему пришлось заменять некоторые Windows-программы,  которым нет аналога в Linux, на что-то новое. Если в вопросе разработки печатных плат я специально заранее начал ковырять KiCAD (причём, вполне успешно, хотя после Sprint Layout было очень непривычно), то вот поиск аналога Keil uVision у меня продолжается до сих пор. Я пробовал:

  • Sublime Text 3, makefile, написанный руками, arm-gcc-none-eabi – неудобно, всё приходится прописывать руками. На маленьких проектах ещё может проканать, но я хотел поразбираться с FreeRTOS, и всё вбивать вручную стало влом.
  • QtCreator Bare Metal + тот же тулчейн arm-gcc-none-eabi (вообще, альтернатив немного от слова нет совсем), система сборки – qbs. Уже удобнее, всё равно много ручной работы, не очень удобно организованная сборка+прошивка (без отладки). Чтобы вменяемо собрать проект, нужно вручную все стадии описать в пресловутом qbs файле.
  • SW4STM32 от STMicro на основе эклипса. Дело вкуса, мне в эклипсе неудобно, и всё равно ну очень много надо руками подтягивать, существующие файлы из среды не добавишь, надо копировать вручную, да ещё и CMSIS само не тянет, может только HAL или SPL
  • Пока что финалист – Atom+PlatformIO, насчёт него подробнее как раз и распишу

Многие воспринимают PlatformIO как просто замену Arduino IDE, потому что работа с ней в основном расписана с позиций ардуинского фреймворка и мало кто знает, что оно может в framework-cmsis, которым я по сути и пользуюсь. В итоге, ручками мы правим только platformio.ini, в котором не сильно-то много и нужно написать, обычно хватает того, что создаётся при создании проекта. К этому получаем впридачу удобную работу с библиотеками, которые могут автоинклюдиться (но для них нужен library.json, да, его приходится писать руками), автоподтягивание CMSIS, контролируемый процесс сборки, удобный редактор с кучей своих плагинов окромя PlatformIO. Но в каждой бочке мёда есть ложка дёгтя, и тут без этого не обошлось. Кратко – framework-cmsis поддерживает ДАЛЕКО не все контроллеры STM32. Но спокуха, сейчас запилим)

Итак, платы с STM32F030F4 нет вообще. Не проблема, идём в
~/.platformio/platforms/ststm32/boards
и копируем любую плату. Формируем описание для новой платы, привожу для STM32F030F4, править согласно своим требованиям:

{
"build": {
"core": "stm32",
"cpu": "cortex-m0",
"extra_flags": "-DSTM32F030x6",
"f_cpu": "48000000L",
"mcu": "stm32f030f4",
"variant": "stm32f030x6"
},
"debug": {
"jlink_device": "STM32F030F4",
"openocd_target": "stm32f0x",
"svd_path": "STM32F030.svd"
},
"frameworks": [
"cmsis",
"spl"
],
"name": "STM32F030F4P6 Generic",
"upload": {
"maximum_ram_size": 4096,
"maximum_size": 16384,
"protocol": "stlink",
"protocols": [
"jlink",
"stlink",
"blackmagic",
"serial"
]
},
"url": "https://www.hotmcu.com/stm32f030f4p6-minimum-systerm-boardcortexm0-p-208.html",
"vendor": "ST"
}

Казалось бы, в чём подвох, по если сейчас попытаться собрать любой проект, мы получим ехидный еррор, что cmsis и слышать не хотел о нашем народном микроконтроллере. Что ж, придётся ему рассказать.

Дальше понадобятся файлы CMSIS, просто так его вытащить не получится, во всяком случае, я не нашёл. Как вариант, можно скачать Device Pack для 5 киля отсюда, открыть его архиватором и честно тырнуть оттуда самый свежий вариант. Ещё потребуется скрипт для линковщика, хотя PlatformIO может что-то и сама состряпать. Не помню, где я нашёл свой, но в конце статьи приложу. Его нужно переименовать в STM32F030F4_FLASH.ld и запихнуть в
~/.platformio/packages/framework-cmsis/platformio/ldscripts
Дело за малым, распихать по полкам CMSIS. Кусок его с ядрозависимыми хедерами уже есть и там даже есть хедер для M0. Нужны лишь файлы system_stm32f0xx.h/.c, набор хедеров stm32f030xxxx.h и главный хедер stm32f0xx.h, их пихаем в
~./platformio/packages/framework-cmsis/variants/ststm32/stm32f0/common
и на уровне с common создаём папку stm32f030x4, куда пихаем ассемблерный стартап-файл. Структуру папок для моего МК приложу где-нибудь снизу.

Теперь PlatformIO уже не будет яростно материться, узнает контроллер как родной и радостно попытается компилить, но не тут-то было, ибо по-умолчанию проект будет линковаться с -nostartfiles и -nostdlib и вылетит еррор насчёт необъявленного _init для либсов. Лезем руками в
~/.platformio/platforms/ststm32/builder/frameworks/_bare.py
находим там LINKFLAGS и нещадно выпиливаем вышеупомянутое. Вуаля, проект будет собираться, либсы будут хавать треть оперативки, всё как и должно быть. Избавиться от этого прожорливого едока пока не получилось, но пути ищутся.

Вот, собсна, и всё. Не сильно сложно, вечерок покурил сборочные файлы и структуру других семейств.  А вот и обещанный архивчик – stm32f0

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *