CLion + STM32 без шелухи

Эта статья — краткий гайд о том, как с нуля завести STM32 под CLion, без шелухи в виде HAL и STM32CubeMX.
Предыстория
Несмотря на то, что примерно год назад STMicroelectronics представили свою IDE на базе Eclipse и CDT, она по-прежнему содержит в себе ряд минусов, которые, по большей части, перекрывает CLion.
На Хабре ранее уже была статья, посвященная запуску связки CLion + STM32, но она была старая, а новые версии CLion несколько изменились.
В интернете достаточно много публикаций на тему того, как запустить связку CLion + STM32CubeMX, но практически нигде нет ничего о том, как сделать все своими руками — может быть я очень плохо искал.
Я надеюсь, что данная статья будет актуальна не только для серии микроконтроллеров от STMicroelectronics, но и от других производителей, использующих те же серии ядер.
Мотивация
Как уже было сказано выше, STM32CubeIDE — среда разработки от STMicroelectronics — содержит в себе ряд минусов, унаследованных от Eclipse и CDT в целом. Среди них: отсутсвие автодополнения кода, отсутствие поддержки синтаксиса выше, чем C++14, отсутствие возможности выбрать самый последний тулчейн с сайта ARM и многое другое. Отдельно стоит отметить стабильность работы Eclipse и STM32CubeIDE в частности — она оставляет желать лучшего. У меня неоднократно случалось так, что я был вынужден полностью сносить IDE и ставить ее заново потому, что при обновлении происходила внутренняя ошибка.
Пару ремарок
Все примеры установок и т.д. будут приведены для macOS, потому что у меня именно она. Также я считаю что с этой системой (по сравнению с Linux и Windows) намного больше подводных камней и неочевидностей.
В качестве примера рассматривается проект с поддержкой C++. В моем конкретном случае это C++20. CLion поддерживает версии начиная от C++98 до C++23. Есть поддержка C90, C99, C11.
CLion
Собственно IDE ради которой все затевается. Можно скачать на сайте JetBrains и для начала попробовать месячный триал. Для счастливых обладателей студенческого билета есть возможность получить вообще весь софт JetBrains в полной комплектации сроком на год.
OpenOCD
Инструмент для удаленной отладки на целевом (target) устройстве. Скачать можно также с официального сайта. Либо набрать в консоли (для macOS) что-то такое:
brew install openocd
What is brew?
Это менеджер пакетов для macOS. Примерно то же самое что и операция apt-get в Ubuntu. Подробнее про то, что это и как это установить тут.
Toolchain
Это набор инструментария для работы с целевым (target) устройством. Включает в себя компиляторы, линковщики, библиотеки и прочее. Загрузить можно с сайта ARM. На момент написания статьи последняя версия, доступная к загрузке, gcc-arm-none-eabi-10.3-2021.07. Для macOS есть два варианта установки: простой архив, и .pkg файл, который установит все сам. Стоит отметить, что начиная с macOS Catalina нужно нехило так повоевать с системой чтобы установить что-то от стороннего разработчика. Помимо этого надо будет вручную добавить путь до компилятора в переменную $PATH, именно там CLion и будет искать путь до компиляторов. Если не хочется тратить время на это, то можно скачать свежую, но не самую последнюю версию так:
brew install --cask gcc-arm-embedded
На момент написания статьи последняя версия в репозиториях brew — 10.2.
Начинаем!
В первую очередь стоит отметить, что на macOS нормально работает только OpenOCD, в то время как инструменты встроенные в CLion корректно работать отказываются.
Итак, если у нас не установлен brew, скачиваем и устанавливаем его с официального сайта. Инструкция по установке находится там же. После установки открываем терминал и пишем:
brew install openocd
А затем, после установки OpenOCD
brew install --cask gcc-arm-embedded
На этом работа с терминалом окончена. Теперь скачиваем и устанавливаем, если еще не сделали этого CLion. Открываем.

Выбираем «New Project». Также можно открыть уже существующий проект, либо взять проект с Git или иной системы контроля версий.

Выбираем рабочую папку проекта и поддерживаемый стандарт языка.
После создания проекта CLion либо сам попросит вас указать путь до компилятора, либо это нужно будет сделать вручную.

Settings->Preferences->Build, Execution, Deployment->Toolchains. В появившейся вкладке слева список, над ним иконка «+», выбираем System. Далее нам предложат ввести имя конфигурации, пути до make и компиляторов. Если вы использовали brew для установки тулчейна, то пути у вас будут выглядеть вот так:

После нажатия «Ok» или «Apply» в правой нижней части нас ожидает ошибка примерно такого рода:
CMake Error at /Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.20/Modules/CMakeTestCCompiler.cmake:66 (message): The C compiler "/usr/local/bin/arm-none-eabi-gcc" is not able to compile a simple test program.
Ничего страшного в этом нет, просто CMake пытается собрать свой внутренний тест для хостовой машины (компьютер на котором мы собираем проект) с использованием указанных компиляторов.
Чтобы избавиться от ошибки и в целом как-то повлиять на процесс компиляции, открываем файл CMakeLists.txt в папке проекта и начинаем редачить. Ниже приведен пример уже сконфигурированного CMakeLists.txt файла, вам необходимо лишь выставить параметры в соответствии со своим проектом.
#Имя системы под которую осуществляется сборка и ее версия set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_VERSION 1) #Минимальная вресия CMake необходимая для компиляции проекта cmake_minimum_required(VERSION 3.20) #Ниже указаны имена компиляторов и утилит тулчейна #CXX - компиялтор C++ set(CMAKE_C_COMPILER arm-none-eabi-gcc) set(CMAKE_CXX_COMPILER arm-none-eabi-g++) set(CMAKE_ASM_COMPILER arm-none-eabi-gcc) set(CMAKE_AR arm-none-eabi-ar) set(CMAKE_OBJCOPY arm-none-eabi-objcopy) set(CMAKE_OBJDUMP arm-none-eabi-objdump) set(SIZE arm-none-eabi-size) #Из-за того, что мы собираем проект под микроконтроллер, а не под хост #нужно сообщить об этом CMAKE set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) #Имя проекта и используемые языки project(test_stm32f0 C CXX ASM) #Имя ядра микроконтроллера set(CMAKE_SYSTEM_PROCESSOR cortex-m0) #Расширение скомпилированного файла set(CMAKE_EXECUTABLE_SUFFIX ".elf") #Стандарты C++ и C максимально поддерживаемые в этом проекте set(CMAKE_CXX_STANDARD 20) set(CMAKE_C_STANDARD 11) #Имя файла линкера под ваш МК set(LINKER_SCRIPT_NAME STM32F072RBTX_FLASH) #А так же путь до него. В моем случе скрипт лежит в папке startup которая находится в корне проекта set(LINKER_SCRIPT $/startup/$.ld) # Далее идут флаги компиляции для каждого компилятора (Си, Си++ и Ассемблер) # Так как для своих нужд я переносил проект с STM32CubeIDE, все флаги перешли оттуда же # Опции компиляции можно посмотреть на офф сайте https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html # Рассмотрим некоторые флаги: # -mcpu - ядро МК # -g - степень оптимизации # -std - стандарт языка, gcc для C, g++ (или c++) для C++ # -O - степень (или тип) оптимизации. -O0 - без оптимзации, # -O1, -O2, -O3 оптимизации от наименьшей к наибольшей, чем выше цифра, тем сильнее оптимизация # стоит учитывать что чем выше степень оптимизации, тем сложнее работать в режиме дебага # -Os - оптимизация по размеру, пытается скомпилировать минимальный размер # -Ofast - оптимизация по скорости испольнения кода # -Og - оптимизация для дебага set(CMAKE_CXX_FLAGS "$ -mcpu=$ -g3 -std=gnu++$ -Os -ffunction-sections -fdata-sections -fno-strict-aliasing -fno-exceptions -fno-rtti -fno-threadsafe-statics -fno-use-cxa-atexit -Wall -std=gnu++2a -fstack-usage --specs=nano.specs -mfloat-abi=soft -mthumb") set(CMAKE_C_FLAGS "$ -mcpu=$ -std=gnu$ -g3 -Os -ffunction-sections -fdata-sections -fno-strict-aliasing -Wall -fstack-usage --specs=nano.specs -mfloat-abi=soft -mthumb") set(CMAKE_EXE_LINKER_FLAGS "-mcpu=$ -g3 -T $ --specs=nosys.specs -Wl,-Map=$.map -Wl,--gc-sections -static --specs=nano.specs -mfloat-abi=soft -mthumb -Wl,--start-group -lc -lm -lstdc++ -lsupc++ -Wl,--end-group") set(CMAKE_ASM_FLAGS "-mcpu=$ -g3 -c -x assembler-with-cpp --specs=nano.specs -mfloat-abi=soft -mthumb") #Говорим применить такой то компилятор с таким-то линковщиком и т.д. set(CMAKE_C_LINK_EXECUTABLE " -o ") set(CMAKE_CXX_LINK_EXECUTABLE " -o ") #Имя и путь к стартап файлу set(STARTUP_FILE_NAME startup_stm32f072rbtx) set(STARTUP_LOCATION "$/startup/$.s") #Пути по которым лежат инклуды, '.' означает корень проекта include_directories(.) include_directories(cmsis) #Глобальный дефайн, нужен для CMSIS add_definitions(-DSTM32F072xB) #имена .cpp, .c и .s файлов set(SOURCE_FILES main.cpp syscalls.c cmsis/system_stm32f0xx.c) #имена хедеров set(INCLUDE_FILES cmsis/cmsis_compiler.h cmsis/cmsis_gcc.h cmsis/cmsis_version.h cmsis/core_cm0.h cmsis/stm32f072xb.h cmsis/stm32f0xx.h cmsis/system_stm32f0xx.h) #На этом моменте происходит компиляция и линковка проекта в .elf add_executable($ $ $ $) #Превращаем .elf в .hex add_custom_command(TARGET $ POST_BUILD COMMAND $ ARGS -Oihex $.elf $.hex) #Превращаем .elf в .bin add_custom_command(TARGET $ POST_BUILD COMMAND $ ARGS -Obinary $.elf $.bin) #Вывод в консоль данных о размере секций .bss, .data и т.д., а так же всего проекта add_custom_command(TARGET $ POST_BUILD COMMAND $ ARGS --format=berkeley $.elf)
Чтобы адаптировать этот файл под свой проект, необходимо изменить строчки
#Имя ядра микроконтроллера set(CMAKE_SYSTEM_PROCESSOR cortex-m0) #Имя файла линкера под ваш МК set(LINKER_SCRIPT_NAME STM32F072RBTX_FLASH) #А так же путь до него. В моем случе скрипт лежит в папке startup которая находится в корне проекта set(LINKER_SCRIPT $/startup/$.ld) #Имя и путь к стартап файлу set(STARTUP_FILE_NAME startup_stm32f072rbtx) set(STARTUP_LOCATION "$/startup/$.s") #Глобальный дефайн, нужен для CMSIS add_definitions(-DSTM32F072xB)
И опциональные. По желанию.
set(CMAKE_CXX_STANDARD 20) set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_FLAGS "$ -mcpu=$ -g3 -std=gnu++$ -Os -ffunction-sections -fdata-sections -fno-strict-aliasing -fno-exceptions -fno-rtti -fno-threadsafe-statics -fno-use-cxa-atexit -Wall -std=gnu++2a -fstack-usage --specs=nano.specs -mfloat-abi=soft -mthumb") set(CMAKE_C_FLAGS "$ -mcpu=$ -std=gnu$ -g3 -Os -ffunction-sections -fdata-sections -fno-strict-aliasing -Wall -fstack-usage --specs=nano.specs -mfloat-abi=soft -mthumb") set(CMAKE_EXE_LINKER_FLAGS "-mcpu=$ -g3 -T $ --specs=nosys.specs -Wl,-Map=$.map -Wl,--gc-sections -static --specs=nano.specs -mfloat-abi=soft -mthumb -Wl,--start-group -lc -lm -lstdc++ -lsupc++ -Wl,--end-group") set(CMAKE_ASM_FLAGS "-mcpu=$ -g3 -c -x assembler-with-cpp --specs=nano.specs -mfloat-abi=soft -mthumb") include_directories(.) include_directories(cmsis)
Ух, много получилось, но самое сложное позади! Осталось добавить конфигурацию для компиляции и отладки.


Добавляется все точно так же, как и в случае с путями для компиляторов.
Собственно это все. На этом проект должен компилироваться и запускаться, однако осталась одна мелочь, очень важная. При отладке хотелось бы иметь возможность смотреть в регистры МК. Для этого при первой сессии отладки нужно указать .svd файл. Их под множество платформ можно взять тут.
Заключение
Надеюсь я ничего не забыл, и у вас тоже получится успешно собрать проект в CLion. Статью я старался писать с упором на новичков и, надеюсь, я им хоть немного помог. Полный проект, рассматриваемый в статье, доступен тут. Там же добавленна библиотека CMSIS и пример моргания светодиодом. Если что, плата NUCLEO-F072RB.
Парочку вопросов к остальным
Отдельно хочется задать вопрос к другим пользователям:
- Как перекрасить цвет вывода OpenOCD в консоль? Она выводится зловещим красным цветом, и кажется что это какая-то ошибка, хотя все нормально.
- Есть ли какой-то плагин по типу того, который есть в STM32CubeIDE, отображающий текущее оставшееся место в RAM и ROM (в графическом представлении)?
Обзор платформы для разработчиков ST Nucleo на примере Nucleo-F401RE

Это открытая, недорогая и легко расширяемая отладочная платформа для разработки с широким выбором специальных плат расширения, для всей линейки 32-х битных микроконтроллеров STM32 архитектуры ARM Cortex-M3 и Cortex-M4.


Платы «ST Nucleo» дают возможность выбирать из различных сочетаний производительность, энергопотребление, и архитектурные особенности микроконтроллера. Платформа позволяет быстро, удобно и легко изучить особенности архитектуры и программирования микроконтроллера, опробовать свои идеи, создать прототипы с любым микроконтроллером семейства STM32.
Плата платформы разделена на две части, программатор и оценочная плата. При желании пользователь может распилить плату что никак не повлияет на функциональность платформы.
Программатор STlink-v2.1 имеет SWD разъём на пинах CN4 (см. рисунок выше) что позволяет использовать программатор независимо от оценочной платы для всех МК STM32, для этого достаточно отключить плату микроконтроллером от программатора сняв джамперы с пина CN2 а для того чтобы их не потерять, их можно надеть на пины GND CN11 и GND CN12, пины заземления, на которые в свою очередь с обратной стороны платы уже надеты запасные джамперы. Стоить отметить что на платформе реализован STLink версии 2.1 который как и в версии 2.0 помимо порта программирования отладки SWD(CN4), виртуального COM -> Usart (CN3) имеет особенность работы определяться по умолчанию как сменный Flash носитель, что является весьма полезной опцией для новичков, которые могут программировать микроконтроллер, отправляя на этот носитель бинарный файл прошивки (в данной версии прошивки, не более 20Kb) сгенерированный, например в онлайн среде разработки такой как Mbed. Так же программатор имеет незаслуженно пропущенный из вида общественности отдельно выведенный разъем Usart (разъем CN3 пины RX и TX) реализующий обмен данными с ПК через виртуальный COM что позволяет сэкономить деньги на отдельном устройстве таком как CP2102 который отдельно стоит около 300руб, как раз эти деньги окупают стоимость доставки оценочной платформы Nucleo.

Линейка оценочных плат Nucleo поддерживает подключения к «Arduino» и «ST Morpho» разъемам, которые позволяют легко расширять функциональные возможности платформы. Разъемы обеспечивают подключение к периферийным устройствам и шилдов от широко распространенной экосистемы Arduino, позволяя разработчикам удобно и легко добавлять специальные функции и масштабировать свой проект. Также Компания ST предлагает специализированные платы X-NUCLEO-IDB04A1, X-NUCLEO-IHM01A1, X-NUCLEO-IKP01A, X-NUCLEO-NFC01A1 и другие платы расширения — шилды собственной разработки, которые поддерживают функции, такие как Bluetooth® LE или Wi-Fi®, GPS, усиление записи звуковых сигналов, MEMS-микрофоны, датчики приближения и беспроводное управление.
На первых фотографиях, оценочные платы имели кварцы X2 и X3 нужные для переопределения частоты работы шины данных, микропроцессора и периферийных интерфейсов, при покупки плат Nuleo пользователи разочаровались в их отсутствии.
В официальном заявлении в ответ на недовольные отзывы пользователей по поводу отсутствия их на конечном продукте, представитель ST заявил:
Фотографии были сделаны с прототипов, и предполагается что внутреннего RTC генератора будет достаточно для решения большинства задач, при желании пользователь может самостоятельно установить внешние кварцы
(ага, например X2 — smd. ).
На этой ноте хотелось бы обратить внимание что платы Nucleo хоть и представляют все семейство микроконтроллеров STM32, но только младшие модели, в корпусе с 64 ногами МК. Данное решение немного противоречит желанию обывателя иметь больше и лучше, но с другой стороны, стоит понимать что продукт Nucleo ориентирован быть именно доступной и простой оценочной платформой разработчиков и разработан специально для поддержки mbed-enabled что дает достойный перевес отсутствию такой начинки как на платах Discovery, предполагается что целевой аудитории не нужно столько периферии и аппаратной начинки микроконтроллера как на платах Discovery. Где то в чем то они правы, а в чем то упускают Российский рынок, и не контролируют цены на свой продукт у официальных поставщиков, которые сильно завысили цену (предполагалось что платформа будет стоить 11$ но в России ее можно приобрести только от 750 рублей + стоимость доставки, что в два раза выше рекомендуемой цены).
Линейка Nucleo входит в состав популярного в Европе и динамично развивающегося проекта ARM mbed™ — онлайн инструментария для быстрого и легкого создания продукта на базе ARM.

Благодаря поддержке mbed-enabled, разработчики могут использовать платформу Mbed с открытым программным кодом, онлайн средства разработки и инфраструктуру с сайта mbed.org. Стоит отметить удобство и простоту использования этого ресурса, точнее я бы сказал это не просто ресурс, это социальные сети разработчика, где пользователи делиться своими библиотеками, примеры кода и проектами. На ресурсе есть все необходимое для быстрого старта и работы с оценочной платой, форум где пользователи делятся своим накопленным опытом и помогают друг другу решать задачи по отладке кода, большой выбор библиотек для работы с почти что всей периферией микроконтроллера и плат расширения, раздел FAQ и возможность задать вопрос, как пользователям, так и представителю завода изготовителя, общаться между пользователями и многое другое.

Онлайн компилятор https://mbed.org/compiler, неотъемлемая часть этого ресурса, который снимет головную боль многих начинающих разработчиков с настройкой среды разработки и компилятора, давая возможность не вникать во все подробности архитектуры STM32.
Директор подразделения IoT platforms компании ARM Саймон Форд (Simon Ford) заявил:
“Аппаратное обеспечение mbed-enabled платы STM32 Nucleo предоставляет пользователям компании ST доступ к расширенной mbed-экосистеме программного обеспечения, программным средствам разработки и сообществу, которые поддерживают разработку новой волны интеллектуальных электронных продуктов”.
Какую плату выбрать себе, трудно ответить так как у каждого свои потребности, кто то планирует разработать определенное устройство или использовать определенное семейство микроконтроллеров (например дешевые или мало потребляющие), я же не имея опыта, для обучения взял самую производительную из доступных на момент приобретения плату Nucleo-F401RE на базе STM32F401RE, многие пользователи поступили так-же, кто брал сразу несколько версий с разными по назначению микроконтроллерами, кто то купил все доступные модели.
На сегодняшний день линейка представлена 9 моделями, старшая из которых STM32 Nucleo-F411RE отличается от широко распространенной в Европе и просто доступной у нас в России STM Nucleo-F401RE большим объемом ОЗУ памяти (128 Kb против 96Kb) большей частотой процессора (100MHz против 84MHz ), большим количеством аппаратно поддерживаемом интерфейсов.
| МК | CPU FPU | Flash | RAM | 12bit ADC | timers | I2C | USARTs | SPIs | SDIO | I2S |
| F401 | 84MHz | 512Kb | 96Kb | 10ch. | 10 | 3 | 3 | 4 | + | N/A |
| F411 | 100MHz | 512Kb | 128Kb | 16ch. | 10 | 3 | 3 | 5 | + | 5 |
Платы STM32 Nucleo-F030R8, STM32 Nucleo-F103RB, STM32 Nucleo-F401RE и STM32 Nucleo-L152RE уже доступны для заказа в России, STM32 Nucleo-F072RB, STM32 Nucleo-F302R8, STM32 Nucleo-F334R8, STM32 Nucleo-F411RE и STM32 Nucleo-L053R8 доступны для заказа из за рубежа, по цене от 10.32 $ за единицу.
Быстрый старт ST Nucleo-F401 + краткое руководство

В предыдущем своем посте я попытался коротко ознакомить вас с платформой Nucleo от ST.
В этом посте я хочу рассказать вам на живом примере некоторые сильные стороны этой платформы, которая имеет все шансы потеснить приевшиеся всем Arduino, и показать что все примеры кода и шилды от Arduino, прекрасно подходят для платформы Nucleo.
Почему Nuleo-F401?
Платформа Nuleo Представляет собой гибрид платформ DISCOVERY и Arduino, позволяя пользователям, без проблем использовать почти все расширения и все примеры кода для
Arduino. В Этой платформе реализована поддержка MBED.ORG, благодаря чему снимается головная боль многих новичков в установке, настройке и использовании компиляторов для ARM. В mbed.org импортированы почти что все существующие расширения для Arduino. В отличии от уже широко распространенной и полюбившихся многим платформы DISCOVERY, платформа на своем борту не имеет никакой периферии, такой как например акселерометр, компас и т.д. Зато платформа Nucleo призвана сделать работу на ней столь же простой как и на платформах от Arduino. Так же платформа имеет гибкую схему питания(3.3В-5В-7В-12В), встроенный обновленный программатор ST-LINK/V2.1 для программирования любых STM32, встроенный виртуальный COM порт (подключенный по умолчанию к USART), упрощенную процедуру программирования микроконтроллера благодаря эмуляции сменного носителя давая доступ к флеш памяти микроконтроллера.
Особенности микроконтроллера STM32F401RE вы можете изучить и самостоятельно, я выбрал ST Nucleo-F401, по причине того что на момент покупки это была старшая из доступных моделей, отличающаяся от остальных, своей большей производительностью и большим объемом памяти.
Начало Работы!
Для Начала нам потребуется зарегистрироваться на Mbed.org и добавить нужную нам платформу в список своих устройств.
Инструкция для чайников, нажми чтобы увидеть
Регистрация на Mbed.org
Для этого следуем по ссылке mbed.org/account/signup и следуя инструкциям, заполняем регистрационную форму.

Выбираем «No, I haven’t created an account before» (Нет, я не создавал ранее учетную запись)

Заполняем регистрационную форму и жмем «SignUp» (Зарегистрироваться)

Должно появиться сообщение «Welcome to mbed! To register a board, please plug the board in and click on MBED.HTM»

После это вверху слева нажимаем «Platform» и открываем список всех поддерживаемых проектом платформ, и в списке переходим к нашей платформе(в нашем случае это Nucleo-F401RE).

Открыв описание платформы мы находим слева кнопку «Add to your mbed Compiler» нажимая ее мы добавляем выбранную платформу в список своих платформ.

Теперь давайте нажмем на свой ник (вверху справа) и перейдем на главную страницу своего профиля, здесь справа внизу мы можем увидеть только что добавленную платформу.

Собственно все мы зарегистрировались и добавили свою платформу.
Установка драйверов.
- сначала нужно установить USB драйвер ST-LINK/V2-1 для программатора, для Windows Vista, 7 и 8 STSW-LINK008 или STSW-LINK009 для Windows XP
- Произвести Обновление прошивки подключенного по USB программатора ST-LINK/V2-1 STSW-LINK007
Инструкция для чайников, нажми чтобы увидеть
Начнем по порядку, скачиваем актуальный Драйвер и обновление прошивки на этой странице КЛАЦ
нам предположительно нужны два фала один «ST-LINK/V2-1 firmware upgrade» второй допустим «ST-LINK/V2-1 USB driver on Windows Vista, 7 and 8»

Распаковываем скачаные нами архивы, и приступаем.
Запускаем установку драйверов: в распакованном архиве STSW-LINK008 или STSW-LINK009 запускаем файл под именем stlink_winusb_install для нашей платы (плата еще не подключена по USB).

Запускаем этот файл, который сам определит разрядность системы и тип установки. Соглашаемся со всем, и жмем да, далее и т.д.
Теперь можем подключить по USB нашу плату и увидеть что светодиоды загорелись и у вас определился новый сменный носитель.
Запускаем обновление прошивки программатора нашей платформы:
Для этого подключаем нашу отладочную платформу к компьютеру, переходим в папку с распакованным архивом обновления программатора «STSW-LINK007» и запускаем файл «ST-LinkUpgrade»

В появившемся окошке жмем «Device Connect» (Подключение устройства), после обноружения устройства и подключению к нему жмем «Yes >>>» программка сама все сделает и в конце отключиться от устройства, после этого можете закрыть ее.
Все на этом установка свежих драйверов и обновление прошивки окончено.
Подключение платформы:
Для любопытных я постараюсь разъяснить некоторые режимы работы поподробнее:
Сведения для любопытных, нажми чтобы увидеть. ОСТОРОЖНО!
Краткие технические сведения из руководства
Режимы работы светодиодов.
- «Медленно мигающий красный» / «Выкл» — при включении питания до установки подключения по USB
- «Быстро мигает красный» / «Выкл» — после первого правильного обмена данными между ПК и STLINK/V2-1 (процесс подключения)
- «Красный светодиод включен» — если подключение между ПК и ST-LINK/V2-1 установлено
- «Зеленый включен: подключение выполнено успешно или операция завершена коректно
- „Мигающий красный“ / „зеленый“ — во время передачи данных.(Сам процесс прошивки)
- „Оранжевый включен“: Сбой связи.
- Когда значение ввода/вывода(I/O) высокого значения, светодиод включен.
- Когда значение ввода/вывода(I/O) низкого значения, светодиод выключен.
LD3 PWR: красный светодиод указывает, что часть с микроконтроллером питается и +5 В питание подается.
Кнопки
В1 USER: кнопка пользователя подключена к ввод/вывод PC13 (вывод 2) микроконтроллера STM32.
В2 RESET: эта кнопка подключается к NRST, и используется для сброса микроконтроллера STM32.
Примечание: Синие и черные пластиковые колпачки на кнопках могут быть удалены в случае необходимости, например, когда шилд или плата расширения подключается сверху Nucleo. Это позволит избежать давления на кнопки и следовательно возможного постоянного случайного нажатия
Перемычка JP6 (IDD)
- Перемычка Включена: STM32 микроконтроллер питается (по умолчанию).
- Перемычка ВЫКЛ: амперметр должен быть подключен для измерения тока микроконтроллера STM32. Если нет амперметра, STM32 микроконтроллер не питается.
Встроенный ST-LINK/V2-1
- Драйвера USB перенумерованы
- Интерфейс виртуального порта COM по USB
- Интерфейс Устройства хранения данных по USB
- USB менеджер питаниея
- SWIM интерфейс.(нужно для программирования STM8)
- Минимальное поддерживаемое напряжение приложений ограниченно до 3 В
| Состояние перемычек | Значение |
|---|---|
| обе CN2 перемычки одеты | ST-LINK/V2-1 работает программируя микроконтроллер на плате (по умолчанию) |
| обе CN2 перемычки сняты | ST-LINK/V2-1 работает программируя микроконтроллер по внешнему разъему CN4 (поддерживается SWD) |
Распиновка разъема SWD:
| Pin | CN4 | Значение |
|---|---|---|
| 1 | VDD_TARGET | VDD для устройства |
| 2 | SWCLK | SWD такт |
| 3 | GND | Земля |
| 4 | SWDIO | SWD ввод/вывод данных |
| 5 | NRST | сброс программируемого МК |
| 6 | SWO | Не используется |
Разделение печатной платы
STM32 Nucleo печатная плата платформы делится на две части: ST-LINK часть и целевая MCU часть, которые можно разделить, чтобы уменьшить размер платы. В этом случае оставшиеся целевая MCU часть может питаться только по VIN, E5V и 3,3V на разъеме ST Morpho CN7 или VIN и 3,3 на Arduino CN6. При этом все еще можно использовать ST-LINK часть чтобы программировать главный микроконтроллер с помощью проводов между CN4 SWD и разъемах на ST Morpho (SWCLK CN7 пин-15 и SWDIO CN7 пин-13).
Режимы питания платы.
Источник питания осуществляется либо от компьютера через кабель USB или от внешнего источника: VIN (7В-12В), E5V (5 В) или +3V3 выводы питания на CN6 или CN7.
ST-LINK/V2-1 поддерживает питание платформы по USB, сам программатор при этом потребляет ток до 100 мА.
Вся плата STM32 Nucleo включая платы расширения может питаться от ST-LINK USB при условии что суммарный ток потребления не будет превышать 300мА (Включая потребление ST-LINK 100 мА) при выполнении этих условий красный светодиод LD3 включен и микро контролер работает. Если ток потребления выше, то необходимо использовать внешний источник питания для всего проекта или только для плат расширения (не забывая про общую землю).
Когда плата будет питаться от USB (U5V) перемычка должна быть подключена между контактами 1 и 2 JP5 в положение U5V. JP1 перемычка может быть установлена только в случае когда плата питается от USB и максимальное потребление тока на U5V не должно превышать 100 мА (в том числе всевозможные платы расширений или Arduino Shield).
VIN (7В-12В) или E5V (5В-5,5В) может использоваться в качестве внешнего источника питания в случае, когда ток потребления Nucleo и платами расширений превышает допустимый ток для USB. В этом состоянии все еще можно использовать подключение по USB, для программирования или отладки, но сначала обязательно подключите плату к источнику питания используя VIN или E5V, после чего подключите кабель USB к ПК.
- Подключите перемычку между контактами 2 и 3 JP5.
- Убедитесь, что JP1 удалена.
- Подключите внешний источник питания к VIN или E5V.
- Напряжение на внешнем источнике питания 7 V
- Убедитесь, что LD3 включен.
- Подключите ПК к разъему USB CN1.
- Перемычка на JP5 между pin 2 и pin 3.
- Перемычка удалена на JP1.
| Вход питания | Контакты Разъемов | Напряжение | Ток | Ограничение |
|---|---|---|---|---|
| VIN | CN6 pin 8, CN7 pin 24 | от 7V до 12V | 800 mA | 800 mA если Vin=7 V, 450 mA если 7 V |
| E5V | CN7 pin 6 | от 4.75V до 5.25V | 500 mA |

(Собственно микро манул окончен. Можно выдохнуть и продолжить)
Для остальных достаточно запомнить что на плате есть перемычка JP5 и у нее есть два положения, питание микроконтроллера от USB (положение U5V не более 300mA) или от внешнего источника (E5V) питания например от 5 Вольт подключенных к CN7 (самые Левый разьем, контакты пин-6 E5V и пин-8 GND). Схема разъемов
И так мы подключились и увидели что в нашем компьютере определился сменный носитель, это признак того что все сделано правильно и все работает. Проверить корректно ли работает сам микроконтроллер можно понажимав пользовательскую кнопку, при кликании по ней, частота мерцания пользовательского светодиода должна изменяться. Наигравшись со светодиодом идем дальше.
Теперь самое время создать нашу первую программу в Embed и прошить ею наш контролер.
Подобные подразделы я буду убирать под сполер, чтобы экономить место.
Первая программа и первое программирование
Первая программа и первое программирование
Создание проекта программы в Mbed
На странице своего профиля в Mbed открываем страницу с нашей платформой, дальше используя картинки как помощь, делаем следующие:
(1) Открываем онлайн компилятор
(2-3) Создаем проект под названием „Blinky LED test for the ST Nucleo boards“ и нажимаем „OK“
(4 — 5) Открываем и компилируем бинарный файл (5).
После чего нам будет предложено сохранить это бинарник (процедура зависит от вашего браузера). Полученный бинарник мы просто копируем или перемещаем на сменный носитель Nucleo, причем если сразу после копирования обновить содержание сменного носителя то вы его уже не сможете увидеть, что свидетельствует что микро контроллер пере-прошит! (во время прошивки вы увидите как весело мигает светодиод LED_COM)
Пост писался всю ночь и вскоре будет дополнен примерами, хочу отметить что любые расширения от Arduino с легкостью подходят и под Nucleo, со скетчами тоже не возникает проблем.
3.3. Подключение Nucleo к ПК

После того, как мы скомпилировали наш тестовый проект, вы можете подключить плату Nucleo к вашему компьютеру с помощью USB-кабеля, подключенного к порту micro-USB (называемому VCP на рисунке 12). Через несколько секунд вы должны увидеть, что как минимум два светодиода загорятся.
Первым является светодиод LD1, который на рисунке 12 называется ST-LINK LED. Это красный/зеленый светодиод, который используется для индикации активности ST-LINK: когда плата подключена к компьютеру, этот светодиод горит зеленым светом; во время сеанса отладки или при загрузке микропрограммы на микроконтроллер он попеременно мигает зеленым и красным.
Другим светодиодом, который включается при подключении платы к компьютеру, является светодиод LD3, который на рисунке 12 называется POWER LED. Это красный светодиод, который включается, когда порт USB заканчивает перечисление (enumeration), то есть интерфейс ST-LINK правильно распознается ОС компьютера как периферийное устройство USB. Целевой микроконтроллер на плате получает питание только тогда, когда данный светодиод включен (это означает, что интерфейс ST-LINK еще и управляет питанием целевого микроконтроллера).
Наконец, если вы до сих пор не загружали на свою плату пользовательскую микропрограмму, вы увидите, что светодиод LD2 – зеленый светодиод с меткой USER LED на рисунке 12, также мигает: это происходит потому, что ST предварительно загружает на плату встроенное ПО, которое заставляет светодиод LD2 мигать. Чтобы изменить частоту мигания, вы можете нажать кнопку USER BUTTON (синюю).
Теперь мы собираемся заменить встроенную микропрограмму на ту, которая была сделана нами ранее.
3.4. Перепрограммирование Nucleo с
Недавно компания ST представила новый довольно практичный инструмент для загрузки микропрограммы на целевую плату: STM32CubeProgrammer. Его цель – заменить старый инструмент ST-LINK Utility, и хорошая новость заключается в том, что он, наконец, мультиплатформенный. Инструмент еще не совсем стабилен, но я уверен, что в следующих выпусках будут исправлены его ранние ошибки. На рисунке 13 показан основной интерфейс STM32CubeProgrammer.
Рисунок 13: Интерфейс STM32CubeProgrammer после подключения к плате
Мы установили STM32CubeProgrammer в Главе 2 , и теперь мы собираемся воспользоваться им. Запустите программу и подключите Nucleo к ПК с помощью USB-кабеля. Как только STM32CubeProgrammer определит плату, ее серийный номер появится в поле с выпадающим списком Serial number, как показано на рисунке 14.
Рисунок 14: Серийный номер ST-LINK, показанный инструментом STM32CubeProgrammer
Если вместо серийного номера ST-LINK появляется метка «Old ST-LINK Firmware», вам необходимо обновить микропрограммное обеспечение ST-LINK до последней версии. Нажмите кнопку Firmware upgrade в нижней части панели ST-LINK Configuration и следуйте инструкциям. В качестве альтернативы, следуйте инструкциям по обновлению, приведенным в Главе 2 .
После определения платы ST-LINK нажмите кнопку Connect. Через некоторое время вы увидите содержимое Flash-памяти, как показано на рисунке 13 (убедитесь, что все параметры подключения совпадают с параметрами, указанными на рисунке 13).
Хорошо, давайте загрузим пример микропрограммы на плату. Нажмите на значок Erase & programming (второй зеленый значок слева). Затем нажмите кнопку Browse в
разделе File programming и выберите файл C:\STM32Toolchain\projects\hello-nu-
cleo\Debug\hello-nucleo.hex в Windows или /STM32Toolchain/projects/hello- nucleo/Debug/hello-nucleo.hex в Linux и Mac OS. Проверьте флаги Verify programming и
Run after programming и нажмите кнопку Start Programming, чтобы начать перепро-
граммирование. В конце процедуры перепрограммирования зеленый светодиод Nucleo начнет мигать. Поздравляю: добро пожаловать в мир STM32 😉
3.5. Изучение сгенерированного кода
Теперь, когда мы воплотили в жизнь мертвое железо, мы можем сначала взглянуть на код, сгенерированный плагином GNU MCU. Открыв файл main.c , мы можем увидеть содержимое функции main() – точки входа 9 нашего приложения.
Имя файла : src/main.c
// Удержание светодиода включенным в течение 2/3 секунды.
49 int main ( int argc, char * argv[])
51 trace_puts( «Hello ARM World!» );
52 trace_printf( «System clock: %u Hz \n » , SystemCoreClock);
uint32_t seconds = 0 ;
60 // Бесконечный цикл
64 timer_sleep(seconds == 0 ? TIMER_FREQUENCY_HZ : BLINK_ON_TICKS);
71 trace_printf( «Second %u \n » , seconds);
9 Опытные программисты STM32 знают, что неправильно говорить, что функция main() является точкой входа в приложение STM32. Выполнение микропрограммы начинается намного раньше, с вызова некоторых важных процедур конфигурации, которые создают среду выполнения для микропрограммы. Однако с точки зрения приложения его запуск находится внутри функции main() . Глава 22 подробно покажет процесс начальной загрузки микроконтроллера STM32.
Команды в строках 51, 52 и 71 относятся к отладке 10 , и мы подробно рассмотрим их в Главе 5 . Функция timer_start(); инициализирует таймер SysTick , так что он запускает прерывание каждые 1 мс. Он используется для вычисления задержек, и мы изучим его работу в Главе 7 . Функция blink_led_init(); инициализирует вывод GPIO PA5 в качестве выхода. Наконец, бесконечный цикл включает и выключает светодиод LD2, оставляя его включенным в течение 2/3 секунды и выключенным в течение 1/3 секунды.
Единственный способ научиться чему-либо в данной области – это испачкать руки написанием кода и множеством ошибок. Итак, если вы новичок в платформе STM32, неплохо бы начать разбор кода, сгенерированного плагином GNU MCU, и попытаться изменить его.
Например, хорошим упражнением является изменение кода таким образом, чтобы светодиод начинал мигать при нажатии пользовательской кнопки (синей). Намек? Пользовательская кнопка подключена к выводу PC13.
Eclipse позволяет нам легко перемещаться по исходному коду, не переходя между файлами с исходным кодом вручную, в поиске места, где определена функция. Например, предположим, что мы хотим увидеть, как кодируется функция timer_start(). Чтобы перейти к ее определению, выделите вызов функции, щелкните правой кнопкой мыши и выберите Open declaration, как показано на следующем рисунке.
Иногда случается, что Eclipse вносит беспорядок в свои индексные файлы, и невозможно перемещаться внутри исходного кода. Чтобы решить данную проблему, вы можете заставить Eclipse пересоздать свой индекс, перейдя в меню Project → C/C++ Index
Еще одна интересная особенность Eclipse – возможность расширять сложные макросы. Например, щелкните правой кнопкой мыши на макросе BLINK_OFF_TICKS в строке 71 и выберите пункт Explore macro expansion. Появится следующее контекстное окно.
10 Для полноты картины они представляют собой функции трассировки, использующие полухостинг ARM (ARM semihosting) – функцию, позволяющую выполнять код на хост-ПК, вызывая его из микроконтроллера, – своего рода удаленный вызов процедуры.