Cоздание минимального проекта под STM32 в Atollic True Studio вручную

К моему глубокому сожалению и удивлению несмотря на популярность и развесистость либ, но CoIDE похоже приказала долго жить. Сайт сдох, разработчики молчат. Могли бы и в опенсорц податься, все предпосылки к этому были, но… В общем, кто этих китайцев поймет. Дремучие они.

А жаль, из бесплатных это была пожалуй наиболее юзерфрендли среда для создания проектов под STM32 где можно было родить минимальный проект в три клика, причем реально минимальный. Только CMSIS и все. Никаких тебе монструозных кубов и прочей дичи. Выдающих портянки кода от одного только косого взгляда.

Что делать? Куда бежать? STM, говорят, прикупил Atollic True Studio, вышвырнул оттуда поддержку всех сторонних камней и дал нахаляву. Решил я попробовать это чудо. В конце концов чем оно отличаеться то от CoIDE? Тот же Eclipse…

Оказалось отличается, т.к. о поддержке STM там разве что заголовок в шапке говорит, да темплейты под самые популярные борды. И больше ничего, все придется делать ручками.

Чтож, онанизм так онанизм. Наши руки не для скуки!

▌Кач, кач, кач — качаем софт

Качай эту студию с официального сайта и ставь.

Также надо скачать файлы куба, если еще не скачал. CMSIS свежий найти можно только там. У меня в примере будет контроллер STM32F103C8T6, поэтому нам нужен куб для F1 (гуглить stm32cubef1).

▌Создаем проект

При запуске студия предложит указать рабочую директорию, можно оставить по дефолту, а лучше перекинуть туда, где у тебя исходники разные лежат. У меня это D:\Coding\ARM\

Потом ,с чистого листа создаем проект:

Выбираем С Project:

Да, там можно указать сразу CMSIS проект, но … это не работает. Т.е. никакой CMSIS не подключается, вообще ничего не происходит. Так что создаем пустой проект. А тулчейн выбираем Atollic ARM Tools:

Дальше, на выбор, предлагается два конфига. Дебаг и Релиз. Собственно это разные настройки среды для отладки и финальной сборки. Можно оставить два и переключаться между ними. Скажем в дебаге оставить оптимизацию для дебага, а в релизе сделать Os — по размеру. Но не суть важно, я обычно оставляю только релиз. Так привык. Путаницы меньше. Снимаем лишние галочки и финиш.

В нашей папке проекта возникнет два сиротливых файла самого проекта. Пора накидать структуру и накидать первого мяса:

Добавили папочки. В одном будет CMSIS файлы, в другом наш код, и еще под стартовые файлы папочку. Многие делают внутри еще деление на inc и src, чтобы разделить инклюдники и сорцы. Я нет, мне так удобней.

Теперь открываем наш архив в CubeF1 и лезем там в папку Drivers\CMSIS\Include и начинем тащить в свою папку проекта CMSIS нужные файлы. Какие нужны?

  • cmsis_gcc.h — Мы используем GCC компилятор.
  • core_cm3.h — У нас ядро CortexM3
  • core_cmFunc.h — За каким то хреном в последние три файла вынесли то, что раньше было в cm3, так что их тоже подключаем.
  • core_cmInstr.h
  • core_cmSimd.h

Следом идем в CMSIS\Device\ST\STM32F1xx\Include\ и тащим оттуда файлы хидеров к конкретно нашему камню. Какие нужны?

stm32f1xx.h
system_stm32f1xx.h
stm32f103xb.h

Но тут внимательней с stm32f103xb.h он зависит от размера камня. Как узнать какой из файлов нужен? На выбор для 103 серии там аж четыре варианта *x6, *xb, *xe, *xg. Какой выбрать для STM32F103C8? И почему именно stm32f103xb.h?

Ответ будет в stm32f1xx.h. Если его открыть и найти дефайны контроллеров, то

Сразу станет понятно к какой подгруппе отнести наш камень. Его и выбираем.

Осталось докинуть туда исходники и стартап.

Идем в папку Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\

И копируем себе в CMSIS папку system_stm32f1xx.c

А себе в папочку Startup тащи файл startup_stm32f103xb.s (или другой, если у нас другой контроллер *xe или *x6, например) из папки Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\gcc\

Там же можно поживиться и скриптом для линкера. Но его лучше взять из того, что сама студия предложит. О нем ниже.

Добавили файлы, заходи в свойства проекта в студии в раздел С/C++ Build -> Settings. Тут же он ругнется, что мол мы Target не указали,а для какого проца рожать то?

И предложить выбрать камень:

Бери какой у тебя там. У меня это STM32F103C8

Он до кучи предложит и стартап скрипт подцепить. По умолчанию кинет в корень, но лучше направить его в папку Startup, порядку больше.

Вот, кстати, тут видно, что стартап код для конфигурации Release, могла бы и Debug быть до кучи.

Следующим шагом надо добавить пути в проект. Идем в свойства проекта и в разделе C/C++ General ->Paths and Symbols, на вкладке Includes добавляем пути:

Если жать кнопочку Workplace то он возьмет их из текущей директории, только указать:

Будет как то так:

Кстати, видите там правее вкладка #Symbols? Туда можно вписать тактовую частоту внешнего кварца, если он есть. Я добавил туда значение HSE_VALUE 12000000U — у меня кварц на 12мгц. И оно забьет дефолтное значение 8000000, которое прописано в CMSIS.

Еще можно сделать генерацию hex файла. Ну на всякий, вдруг пригодится. Это в разделе C/C++ Build -> Settings -> Tool Settings -> Other -> Output format

Теперь надо раскомментировать наш контроллер в файле stm32f1xx.h. Помните, где мы там справлялись какой файл брать? Вот открывай его и правь, не забыв сохранить:

Или, лучше наверное, не править тут, а добавить в #Symbols еще и STM32F103xB на пару к HSE_VALUE

Все, можно создать в папке Code пару файлов main.c и main.h да родить примитивный скелетик проги который можно попробовать скомпилировать:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "main.h"
#include "stm32f1xx.h"
 
int main(void)
{
volatile uint8_t i;
 
 
SystemInit();  // Фукнция CMSIS которая установит тактовую частоту
 
// По умолчанию считает, что внешний кварц 8МГЦ, но можно добавить 
// в stm32f1xx.h #define HSE_VALUE 12000000U и переназначить кварц.
 
 
while(1)
	{
	i++;
	}
 
 
return 0;
}

Программа должна скомпилироваться, а в папке Release (или Debug, смотря какую конфигурацию оставить) появится *.elf *.hex *.list *.map файлы.

▌Отладка
Отладку надо тоже настроить. По умолчанию там какая то лажа в настройках и мне пришлось долго гуглить, что за лажа и где копать.

Итак, подключаем STLink к нашему контроллеру по SWD. Студия ставит тут же дрова стлинка, так что завестись должно все из коробки. Разве что рекомендую обновить прошивку самого стлинка, через STLink Utility.

Жми кнопку Debug, зеленую букашку такую в верхней панели инструментов, и получишь диалог настройки отладчика:

Во вкладке Main можно ничего не трогать. Главное проверить, чтобы в C/C++ Appliction был путь к нашему *.elf файлу. А в Project стоял наш проект. Ну и выбрана конфигурация реальная.

Во вкладке Debugger надо будет выбрать ST-Link и на этом все тут:

Теперь надо настроить оптимизаци под дебаг. Если это не сделать, то при попытке выполнить код под отладчиком получишь сообщение:

No source available for «main() …

И адрес последнего байта прошивки. Дебаг включится, но исходника не будет и шагать можно будет в лучшем случае по ассемблерному тексту.

Чтобы заработала отладка надо включить оптимизацию под нее. Идем в настройки проекта, в раздел С/С++ Build — Settings. Во вкладке Tool Settings ищем в дереве C Compiler раздел Debugging и ставим там Debug Level в Maximum (-g3).

Также можно основную оптимизацию переключить на оптимизацию под отладку. При этом при отладке не будут теряться строки программы, но помните, что это уже будет другая программа и некоторые глюки могут на ней не проявляться, так что рекомендую оставить -Os. Искать эту опцию в вкладке Tool Settings ищем в дереве C Compiler раздел Optimization параметр Optimizator level

И отладка пошла, появился маркер текущей строки…

Подключение SPL, HAL или LL уже тривиально. Накидываем их в папки, можно отдельную создать. Да добавляем в проект. И пишем… Олдово, ручками и по хардкору :)

В общем, вот такое вот ручное дрочево, часто весьма неочевидное и по куче менюшек надо лазать. И в каком месте оно специализированное под STM32? Специализированное под это как в Keil или в CoIDE раз раз и проект готов, со всеми необходимыми файлами. А тут же практически настройка того же эклипса и гцц.

48 thoughts on “Cоздание минимального проекта под STM32 в Atollic True Studio вручную”

  1. Дихалт, а почему ты скачивал Куб именно для F1. Они что, для всех семейств разные? Я скачал какой-то первый попавшийся (мк у меня stm32f767). Периферия вроде бы работает, а вот usb не хочет. Пересмотрел 100500 видео, у всех работает, а у меня как у самого рыжего ни в какую.

        1. Да! Куб изначально универсален!
          Вначале установи только STM32CubeMX последнюю версию 4.27.0.
          Потом когда будешь, в кубе, создавать проект под твой камень или отладочную плату, куб начинает подкачивать из интернете нужные ему файлы.

  2. …Или, лучше наверное, не править тут, а добавить в #Symbols еще и STM32F103xB на пару к HSE_VALUE…
    Это верное решение!

    1. Судя по всему только стартовой заставкой. Ну и то, что в него уже интегрирован тулчейн (своя версия) и драйвера отладчиков.

  3. А чем sw4stm32 не устраивает?
    P.s. из либ есть еще libopencm3 говорят ниче так, но я ее не смотрел.
    Проекты генерю в кубе, оптимизирую по необходимости узкие места.

        1. А за что его любить? Он накидает тебе хренову кучу мусора, хер пойми какого кода, плюс хер пойми еще в какую структуру. Я его разве что подглядеть инициализацию какую использую. Ну и ножки удобно смотреть что где куда. Вообще я даже хал не использую. Хватает ll

          1. Плюсую LL. Пожалуй, самое лучшее, что у ST получилось из библиотек. Кстати, CubeMX умеет генерировать код и под него.

            1. Минималистичная библиотека периферии от стм. По сути все на регистрах. Без кучи обёрточных функций.

                    1. «Description of STM32F3 HAL and low-layer drivers». Как минимум, в названии документа Low Layer. Я тоже думал, что Low Level, это было бы логично, но нет :)

      1. Да, тоже эклипс, с поправкой на то, что вроде как официальный от ст, куб умеет генерить проекты спецом под него.
        А в кубе кстати, для последних ядер типа stm32l07 и т.д. можно генерить проекты не на hal а на spl. Получается гибче и легче.

        1. Ну так и аттолик официальней некуда. Чето СТ похоже скупило все эти колхозные поделки и вместо того, чтобы зарубить всех кроме лучшей развивает этот зоопарк.

  4. Добавил к проекту HAL, и теперь все функции HALа компилируются и линкуются в итоговую прошивку. Как сделать так, чтобы компилировались только используемые функции, а не все, что есть в сишных файлах проекта?

      1. Нашел.
        Во вкладке Optimization для компилятора и линкера необходимо поставить галочки напротив «dead code removal».
        Причем, если поставить только в настройках компилятора, а в линкире не ставить, то работать не будет.

  5. «Чтобы заработала отладка надо включить оптимизацию под нее» — не оптимизацию, а генерацию отладочной информации. На результирующий код прошивки она никак не влияет, только лишь добавляется в особые секции объектного файла.

  6. Прошу прощения, может я чего не понимаю: а что, выбрать embedded C project на этапе создания проекта, чтоб эта балалайка задала наводящие вопросы и большинство последующих телодвижения сама сделала — не наш метод?

    1. Эм… У меня эта херь вообще не работала ни на одной из инсталляций. Просто без разговоров делала пустой проект без ничего. И никаких наводящих вопросов.

      1. Видать где-то ея перекосило при инсталляции. У меня (Build id: 20180117-1023) под линуксом всё делает сама, проц/плату спрашивает, тип отладчика и делает нормальный проект с нардами и поэтессами :) Если указываешь проц — пустой проект с CMSIS и LL, если плату, то докидывает HAL с мигалкой.

  7. Действительно странно, просто выбираешь embedded C project, раз-раз и готово. А тут у Di настоящий онанизм…. что у вас пошло не так……

    1. У меня почему то при выборе любого из пунктов этого списка создается тупо пустой проект. Даже ничего не спрашивает. Причем и дома и на работе. Надо попробовать скачать заново эту студию, может кривой релиз…

  8. Отмечу, что кокос сайт на медленном китайском хостинге и ничего там не сдохло. Гугль медленно, но верно все индексирует, например.

  9. Долго мучился с TrueSTUDIO под WinXP, ни как не удавалось откомпилировать проект созданный в STM32CubeMX. Под Win7 все удачно получилось!

  10. Гораздо проще на голый Eclipse CDT поставить вот этот плагинчик https://gnu-mcu-eclipse.github.io/tutorials/hello-arm/
    По сути он как раз и создает классический Hello world (моргалку пином) в один клик. При этом используется обычный gcc arm toolchain ну и для отладки OpenOCD (отладка работает сходу, никаких заморочек). Я вообще один и тот же инстанс еклипса использую для разработки avr, stm32 и java ;)
    (Для avr ставлю вот этот плагин — http://avr-eclipse.sourceforge.net/wiki/index.php/Plugin_Download)

  11. «А жаль, из бесплатных это была пожалуй наиболее юзерфрендли среда для создания проектов под STM32 где можно было родить минимальный проект в три клика, причем реально минимальный. Только CMSIS и все.»

    Вы видимо про EmBitz не знаете. Тоже в пару кликов можно создать минимальный проект.

  12. Бррр. Спасибо за распространение правильного подхода, хотел кое что добавить.
    1. system_stm32f1xx.c/.h не нужен, его можно выпилить, при этом убрав инклюды на которые компилятор будет ругаться и в файле .s выпилив вызов systeminit. Но тогда инициализацию системы тактирования придется ручками.
    2. Но если уж необходимо то вызов systeminit в функции main не нужен так как он вызывается перед ней в файле .s, получается безсмысленная перенастройка частоты 2 раза.
    3. Для gdb родным считается ключ -ggdb но это я уже придераюсь.

  13. Программирую stm32. Раньше сидел на Coocox. Для саморазвития стал осваивать Atollic. Подскажите, пожалуйста, кто-нибудь. Был очень не доволен тем, что нет (или не работает) автозавершение при написании кода. Можно ли это как нибудь исправить в atollic true studio?

    1. Тут оно есть, но не такое навязчивое как в кокосе. Контрл вниз или как то так. И появится вожделенный список. Наверное (точнее точно) можно и как в кокосе сделать, но это надо настройки эклипса ковырять.

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

Ваш e-mail не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.