Возможно STM32CubeIDE и обладает рядом недостатков, но у нее, на мой взгляд, есть несколько преимуществ – таких как проприетарность и бесплатность, ради которых, как минимум, стоит обратить внимание на эту среду разработки, если вы не сделали этого раньше.
Объектом прошивки выбран не очень распространенный микроконтроллер STM32F072 с ядром ARM Cortex-M0, для более привычных STM32F103 на ARM Cortex-M3, с поправкой на ядро, процесс идентичен.
Все необходимые ресурсы можно скачать с сайта st.com, и вот что понадобится:
- Сама IDE, я использую Windows версию, но также доступны версии под Mac и Linux
- Библиотека CMSIS для ARM Cortex-M0, она находится в архиве STM32CubeFx, разбитом по версиям ядра. Сам архив, помимо CMSIS, содержит великое множество других ресурсов начиная от примеров работы с периферией до драйверов USB, собственно, именно этот архив используется, если создавать проект с помощью STM32Cube
- Не помешает Datasheet и Reference Manual
После установки, запуска и выбора папки Workspace можно начать создание проекта. На текущий момент STM32CubeIDE версии 1.1.0, так что по расположению различных настроек следует исходить из этого.
Создание нового проекта — File/New/STM32Project. После некоторого раздумия появляется окно выбора микроконтроллера, в моем случае это STM32F072RB в корпусе LQFP64, выбираю нужную строку, жму далее. Далее предлагается выбрать имя проекта, расположение, язык программирования C/C++, исполняемый файл/статическая библиотека и будет-ли проект сгенерирован с помощью CubeMX или сами с усами. Генерация кубом, в данном случае не нужна, поэтому тип проекта Empty — финиш.
Слева, в окне Project Explorer, появилось дерево проекта, правда он не совсем Empty, как заказывали. Впринципе, если устраивает сгенерированная структура папок, можно добавить туда файлы из библиотеки CMSIS и работать дальше, но здесь я покажу как можно привести структуру проекта в гармонию со своим чувством прекрасного, поэтому удаляется всё, кроме скрипта линкера т.е. файла c расширением .ld — он еще пригодится.
Все манипуляции с папками и файлами можно проводить как в проводнике так и внутри IDE, нажав правой кнопкой на название проекта, к примеру: правая кнопка –> new –> Folder. Если структура проекта изменялась вне IDE, то нужно просто обновить проект: правая кнопка –> Refresh.
Мой вариант структуры проекта выглядит так:
- Startup – здесь будет храниться скрипт линкера, тот самый, оставшийся от сгенерированного проекта, а также startup файл взятый из CMSIS
- CMSIS\src и CMSIS\inc – здесь будут лежать исходники, файлы с расширением .c в папке scr и заголовочные файлы с расширением .h в папке inc соответственно, относящиеся к библиотеке CMSIS
- Core\src и Core\inc – здесь будет расположен собственно сам проект, для начала стоит положить туда main.c и main.h
Теперь нужно перенести файлы библиотеки CMSIS в проект. Библиотека состоит из файлов ядра и файлов периферии. Файлы ядра начинаются с core_ или cmsis_ они общие для всех микроконтроллеров, использующих данное ядро. Файлы периферии содержат в названии наименование микроконтроллера stm32 и специфичны для конкретного производителя, в данном случае, компании STM.
В распакованном виде архив содержит папку STM32Cube_FW_F0_V1.11.0, все пути указаны относительно этой папки. Итого, нужно скопировать:
В CMSIS\inc:
- Drivers\CMSIS\Include\cmsis_compiler.h
- Drivers\CMSIS\Include\cmsis_gcc.h
- Drivers\CMSIS\Include\cmsis_version.h
- Drivers\CMSIS\Include\core_cm0.h
- Drivers\CMSIS\Device\ST\STM32F0xx\Include\stmf0xx.h
- Drivers\CMSIS\Device\ST\STM32F0xx\Include\stm32f072xb.h
- Drivers\CMSIS\Device\ST\STM32F0xx\Include\system_stm32f0xx.h
В CMSIS\src:
- Drivers\CMSIS\Device\ST\STM32F0xx\Source\Templates\system_stm32f0xx.c
В Startup:
- Drivers\CMSIS\Device\ST\STM32F0xx\Source\Templates\gcc\startup_stm32f072xb.s
Так выглядит проект в заполненном виде.
Так как были проведены некоторые манипуляции с папками проекта, нужно отобразить это в настройках.
Правая кнопка по названию проекта -> Properties -> C/C++ Build -> Settings -> Tool Settings -> MCU GCC Linker -> General – здесь нужно указать новое расположение скрипта линкера с помощью кнопки Browse…
Также нужно указать пути к файлам проекта
Properties -> C/C++ General -> Includes
Properties -> C/C++General -> Source Location
В Includes пути к папкам inc, а в Source Location логично было-бы к папкам src, но если так сделать, то в дереве проекта будут отдельно добавлены эти папки. Чтобы не загромождать визуально дерево, в Source Location можно указать корневые папки Core, CMSIS и Startup.
Для того чтобы проект скомпилировался нужно раскомментировать в файле stm32f0xx.h строку с названием микроконтроллера ну и конечно же в main.c добавить функцию main.
Собственно всё. Безошибочная компиляция и сразу же куда-то подевалось целых полтора килобайта памяти ОЗУ она же RAM, и сразу же вспоминается стек и куча, в процессе создания проекта они нигде не упоминались. Величина стека и кучи указана в файле скрипта линкера, тот что с расширением .ld, их можно и нужно изменять в соответствии с требованиями проекта. Эти значения находятся в начале файла в виде меток _Min_Heap_Size/_Min_Stack_Size с указанием размера в шестнадцатеричном виде.
В качестве примера, приведу небольшой проект традиционного мигания светодиодом.
Светодиод будет мигать на отладочной плате STM32F072B-DISCO, тактирование осуществляться от внутреннего генератора HSI48 частотой 48 МГц, а в качестве источника задержки использоваться таймер SysTick, генерирующий прерывания с периодом в 1 мс, при помощи которых отсчитывается точное время задержки. Светодиод подключен к выводу 6 порта С, настроенного на выход push-pull.
Надеюсь, данная информация кому-то пригодится, т.к. в свое время, несмотря на обилие материалов по программированию STM32, мне пришлось перелопатить достаточно много мануалов, чтобы осознать вещи, кажущиеся сейчас очевидными.
Комментарии (46)
VolodjaT
22.12.2019 01:22Сегодня какраз устанавливал среду для изучения STM32. Начал с cubeide — ужаснулся. Поставил keil — это небо и земля в сравнении с этой поделкой
Reason89
22.12.2019 05:42У кейла ограничение в 32кб. С которым рано или поздно сталкиваешься.
VolodjaT
22.12.2019 12:04вряд ли для такого большого проекта будут использовать Cube IDE
Особенно если коммерческая разработкаReason89
22.12.2019 12:15+1Добавил в простой проект USB+FATFS на STM32F4 и уже вылетел за порог в 32кб. По началу отключал то, что не использую, изменял уровни оптимизации. В конечном итоге плюнул и перешел на Atolic.
Arcanum7
23.12.2019 17:06Это вы ещё FreeRtos не использовали до кучи к вышеперечисленному с парой десятков задач.
ArXen42
22.12.2019 14:43Первый раз пробовал что-то написать под STM32 из под Keil. Очень быстро перелез на CLion (gcc + OpenOCD), т.к. Keil, как IDE, по ощущениям, отстает где-то на 10-15 лет. Удобный редактор с возможностью vim режима, быстрая и точная навигация по определениям, подстветка, продвинутое автоформатирование, подсказки вроде clang-tidy, рефакторинги, интеграция с git, даже темная тема и другие мелочи — всего этого в keil не хватает.
Предполагаю, что в нем есть какие-то свои фичи, которых нет в более универсальных IDE вроде CLion или VS Code, но пока не сталкивался (может они нужны на более сложных задачах, где CLion + gcc + OpenOCD + gdb не хватит, не знаю).
buldo
22.12.2019 21:00А есть где дока, как использовать такую связку?
ArXen42
23.12.2019 18:46+1https://www.jetbrains.com/help/clion/embedded-development.html
Есть более старая, но чуть более подробная статья из трех частей:
https://blog.jetbrains.com/clion/2016/06/clion-for-embedded-development/
От себя могу добавить, что, используя эту связку, можно без проблем писать на C++ 2a под STM32 (gcc последний 2019-q4).
Для этого мне понадобилось только сделать пару однострочников, которые переименовывают все .c файлы в .cpp и обратно (на время перегенерации проекта в Cube, если что-то меняю или просто мигрирую на новую версию).
Понадобилось только добавить немного static_cast'ов в нескольких местах (и не забывать откатывать изменения генератора cube на этих строчках через git), игнорировать несколько видов предупреждений (у меня получилось -Wall -Wno-register -Wno-write-strings -Wno-sign-compare -Wno-unknown-pragmas -fno-exceptions -Wno-psabi в CMAKE_CXX_FLAGS) и исключить код FreeRTOS из переименования в cpp (иначе планировщик перестает работать когда код FreeRTOS скомпилирован как C++).
Arcanum7
23.12.2019 17:07CLion платный жеж ( или я что-то пропустил?).
ArXen42
23.12.2019 18:35Есть бесплатные студенческие лицензии, а так платный. Но аналогов по удобству нет, сомневаюсь, что Qt Creator или VS Code смогут добраться до такого же уровня в обозримом будущем (впрочем, они всё еще далеко впереди Keil).
Narical
22.12.2019 11:45Автор, в чем заключаются плюсы проприетарности?
heavyC1oud Автор
22.12.2019 11:52в надежде, что когда-нибудь уберут косяки
garageman
22.12.2019 13:41Одни уберут но новых добавят. У них чипы (и доки) зато традиционно хороши. А со средами разработки традиционно не очень. :)
Ghost999
22.12.2019 11:46Как у него с отладчиком? Если есть, что и как нужно подключать ;)
heavyC1oud Автор
22.12.2019 11:50Отладчик на месте, Run -> Debug, там же настройки, если подключен какой-нибудь ST-Link, оно само все настраивает
Serge78rus
22.12.2019 12:20Само то оно настраивает конечно, но если хочется использовать трассировку через 3-х проводный SWD (semihosting), то многое в настройках приходится подправлять руками.
Ghost999
23.12.2019 16:14Интересует китайский j-link. Просто решил попробовать stm, подыскиваю среду. Кто что советует. И ещё вопрос, как либы скомпилированные подключать? Есть библиотека STM32CRYPTOLIB, а как подключить не нашёл
Serge78rus
23.12.2019 16:50Библиотеки подключаются так же, как и к любому C/C++ проекту на Eclipse. Открываем свойства проекта, в панеле диалога слева выбираем C/C++ Build -> Settings. Открываем вкладку Tool Settings. Открываем в дереве MCU GCC Linker -> Libraries и добавляем в панель Libraries нужные библиотеки. Так же в MCU GCC Compiler -> Include paths в панеле Include paths добавляем пути к заголовочным файлам библиотек.
remzalp
23.12.2019 15:58Идет из коробки и сразу работает. Вообще настраивать не пришлось.
При установке еще предлагает дрова stlink, jlink поставить.
Windows/Linux — полёт успешный
garageman
22.12.2019 12:16У меня слегка эгоистичный подход — использую "чистый" Eclipse для всего. Проще довесить требуемые целевой архитектурой плагины чем перепревыкать. Да, STM32CubeMX есть плагином под эклипс. И работает, единственный минус — под linux надо указывать gtk=2.
EddyEm
22.12.2019 17:51Советую попробовать qt creator. Очень удобная штука. Переполз на него с geany через sublime. Самая лучшая навигация по коду + в реальном времени подсвечиваются различные проблемы, диагностированным статическим анализатором clang.
В общем, свободная IDE гораздо лучше всякой проприетарщины!buldo
22.12.2019 21:07Тут ведь дело не только в работе с кодом — нормальный дебаг, отображение состояния переферии, трассировка значений переменных — вот это все можно добавить в qt creator?
EddyEm
24.12.2019 09:48qtcreator из коробки работает с gdb, так что, если кому-то нужна внутрисхемная отладка, с этим проблем нет.
Лично я отлаживаю более привычным для меня способом: посредством диагностических сообщений (UART, USB), а также с помощью логанализатора и осциллографа. Пока еще ни разу не испытывал потребности во внутрисхемной отладке.
В принципе, есть еще вариант — сеггер предлагает посредством jlink в реальном времени сообщения отсылать с меньшей нагрузкой, нежели уарт (как я понял, выделяется область памяти с флажками и собственно сообщениями, а jlink периодически это мониторит). Но я — не сторонник уж такой лохматой проприетарщины, чтобы вместо stlink'а jlink использовать.Serge78rus
24.12.2019 10:17Через stlink тоже можно гнать трассировочные сообщения, причем даже двумя разными способами: синхронным (через обычное трехпроводное подключение) и асинхронным (требует одной дополнительной линии связи).
EddyEm
24.12.2019 10:26Понятно, что в принципе это возможно, но пока свободных (да и даже проприетарных) реализаций не встречал.
Честно говоря, st-link я использую в основном лишь для STM8, а STM32 прошиваю встроенным бутлоадером либо через UART, либо через DFU.Serge78rus
24.12.2019 14:08Та же STM32CubeIDE поддерживает при переключении Debug probe с выбираемого по умолчанию «ST-LINK (ST-LINK GDB server)» на «ST-LINK (OpenOCD)» и небольших манипуляций с конфигурацией проекта. Если не хочется STMCubeIDE, то трассировочные сообщения поддерживает тот же консольный st-util с ключем --semihosting
sami777
23.12.2019 23:02Ребята, создавать проект типа под SPL на CubeIDE никто не научился?
heavyC1oud Автор
24.12.2019 10:25SPL только руками, устарел же официально, в качестве приемника есть LL, куб его генерирует без заморочек
EddyEm
24.12.2019 10:28Учитывая то, какие портянки после кубового кодогенератора получаются, лучше использовать куб только по прямому назначению: для выбора наиболее подходящего под задачу МК и для уточнения, что всей необходимой периферии вам хватит.
Для инициализации периферии те же ST давным-давно написали набор очень хороших сниппетов (жаль только, что они лишь под STM32F0, но и на другие семейства их несложно перенести). Ну, а остальная логика все равно пишется руками, так что все эти SPL, HAL, opencm3 — излишества. По сути, если пользоваться дополнительно внешними библиотеками, придется не только RM+даташит на МК читать, но и документацию на библиотеку (да и частенько в ее код заглядывать, когда наткнешься на баг или тормоза).
looogle
24.12.2019 10:25Когда Atollic стал бесплатным, я очень обрадовался, потому что это цельная специализированная IDE с множеством полезных инструментов для отладки. Плюс, она отлично работала с дополнением Eclipse для поддержки CMake проектов. Единственное, она использовала старую версию CDT и не поддерживала всех современных фич языка C++. Но была надежда на то, что в будущем это пофиксят.
А потом вышла Stm32CubeIDE и сломала совместимость с CMake плагинами. Хочется работать — генерируюй проект в CubeMX. А когда у тебя CI и всё проекты на CMake + в основном ты пользуешься libopencm3… Пришлось оставить надежду и уйти на VS Code. Очень жаль, что так вышло.
oWart
Круто, а давно Stm32Cube стал IDE? Я даже соскучился как-то по эмбедд разработке…
NordicEnergy
Да с пол года где-то, может чуть больше. По сути в одну коробку упихали сам куб и собственно атолик (читай эклипс). Оно и раньше было жутко кривое и тормознутое, а сейчас еще веселее.
oWart
В свое время пользовался связкой Stm32Cube + IAR, все полностью устраивало
NordicEnergy
Использую куб, в смысле CubeMX, как очень удобный pinout, не более. В принципе и атоллик был вполне сносным инструментом, но вот чудовище, которое родили слепив их у меня на ryzen 3600x стартует просто минуту. Грешил на AMD, попробовал на 7700K, все тоже самое. Просто открытие пустого проекта минута! После 1-2 секунд VS Code у меня это вызывает боль.
CubeIDE постоянно крашится, настройки проекта через одно место сделали, на больших проектах автодополнение работает крайне медленно. На истину не претендую, но лично у меня впечатление осталось плохое о новом творение.
heavyC1oud Автор
Да, подсмотреть инициализацию в кубе милое дело. Насчет крашится, у меня пока не было, а вот создать совсем пустой Си проект и накидать туда все остальное так и не смог, т.к. на этапе настроек проекта, вылазит какая-то ошибка с внутренним кодом и дальше ничего не работает.
sim2q
Спасибо, тоже пропустил…
Cube cам-то примелькался, MX или IDE там в конце и не разобрать)
Arcanum7
Значит надо подождать ещё полгода пока вся «сырость пропечётся».