Как всем известно, в настоящее время одним из популярных микроконтроллеров у любителей электроники, являются микроконтроллеры семейства STM32. Оно и не удивительно: богатая периферия, обилие различных статей о программировании в среде STMCube завлекают все больше и больше хоббийных разработчиков.  Когда автор начал знакомиться с микроконтроллерами STM32 после долгой работы с семейством Atmega/Attiny, он так же как и все начинающие, использовал IDE (это был неторопливый Eclipse) и пользовался CMSIS + SPL/HAL. И эта связка была работоспособна. Но душа моя, почему-то испытывала дискомфорт от рабочего окружения. Eclipse на ноутбке не радовал отзывчивостью, изучение исходников стандартных библиотек не всегда гладко ложилось в моей голове с содержимым даташита на микроконтроллер. Но все это было терпимо. Но вот я замахнулся на самый сложный и полезный интерфейс - USB. С первого взгляда все было просто - куча примеров кода для HAL, как сделать USB микрофон или CDC устройство. Но стоило лишь поставить цель реализовать композитный девайс сочетающий в себе аудиоустройство и CDC) как ты вступал в темный лес.  Структура STMовской USB библиотеки была нелогична, и опять же, очень плохо совмещалась с официальной спецификацией USB. Я штурмовал этот «USB пик» несколько лет, периодически забрасывая, пока не наткнулся на упоминание о том, что прошивка микроконтроллера что отвечает за работу с  USB в SDR трансивере HackRF написана с помощью некой библиотеки libopencm3. Изучение документации, приятно порадовало мой глаз. Изучение исходников - радовало максимальной близостью к регистрам. И я решился сменить HAL/SPL на libopencm3.  Единственная проблема в том, что в сети ГОРАЗДО меньше статей и руководств для начинающих, как подготовить среду разработкию. 90% информации ты находишь сам, копаясь в образцах чужого когда на GitHub, и вчитываясь в официальную документацию не забывая заглядывать в даташит. Данный путь закаляет характер, но совсем не то, что хочется для быстрого старта и быстрого результата. Поэтому своми статьями о libopencm3, я хочу ликвидировать информационный вакуум о использовании данной библиотеки, и дать краткое руководство для «опытных новичков». Под термином "опытный новичок", я подразумеваю что читатель уже знаком с программированием микроконтроллеров и понимает, чем отличается SPI от I2C, для чего нужна подтяжка ножки микроконтроллера, и что такое "порт настроен на выход". Это будет своеобразный "быстрый старт" по легковесной разработке под семейство STM32.  Среда для разработки будет разворачиваться на примере Linux. В качестве целевых платформ я буду использовать микроконтроллеры двух популярных серий: F10x и F4xx. Выбор обусловлен тем, что именно эти серии используются в двух отладочных платах штампуемых в Китае и окрестностях: BluePill (STM32F103) и BlackPill (STM32F411). В процессе изучения libopencm3 я буду использовать, и рекомендовать к использованию читателю следующее оборудование: Непосредственно отладочную плату с микроконтроллером. Рекомендую иметь их в количестве 2 штук, поскольку вторую плату мы можем превратить в самодельный программатор. Программатор STLink V2. USB to Serial адаптер.Любой на ваш вкус.  Логический анализатор Saleae Logic.Разработка под микроконтроллеры просто немыслима без возможности поглядеть, что и как просходит на ножках контроллера. Оборудование, с которым будет взаимодействовать микроконтроллер.Я рассмотрю работу с драйвером семисегментного индикатора MAX7219, расширителем GPIO PCF8574 (модуль I2C для LCD 1602), и работу с модулем китайского энкодера. Приступим к установке. Разворачиваение будет проводится в свежеустановленой Xubuntu 22.04 LTS. Установим GIT На GitHub создадим репозиторий для наших примеров, под названием stm_dev. Далее на своей машине создадим каталог, инициализируем репозиторий и запушим его на GitHub Добавляем репозиторий libopencm3 как суб-модуль в наш личный репозиторий Из репозитория libopencm3/libopencm3-examples одолжим два файла сборки проекта: Makefile и rules.mk Следующий шаг - построить структуру каталогов для наших будущих проектов. Я не стал придумывать что-то оригинальное и сделал её аналогичной libopencm3-examples: [серия микроконтроллера] / [модель отладочной платы ] / [ имя проекта ]. Так же из libopencm3-examples были взяты специфичные для серий/моделей make-файлы Поправим ld файлы, поскольку в репозитории libopencm3-examples нет подходящих для BluePill файлов линкера, а для BlackPill по размеру RAM и ROM подходит файл от nucleo-f411re. Так же для BluePill создадим дополнительный файл линкера, для случаев когда в плату уже будет зашит стороний программный загрузчик, и часть флеш-памяти уже будет занята им. Вносим небольшие правки в make-файлы связанные с путями, поскольку наша структура директорий чуть короче. Makefile.include rules.mk Для удобства инициализации dummy проекта, я помещаю в каталоги плат иницализирующие shell-скрипты. make_project.sh в каталоге bluepill make_project.sh в каталоге blackpill Скачиваем свежую версию отсюда. Я буду использовать 12.2.MPACBTI-Rel1. Загружаем и распаковываем в каталог рядом с stm_dev Добавим в PATH каталог с утилитами тулчейна А так же установим требуемые тулчейну библиотеки и утилиты Проблема тулчейна под Linux - он собран с поддержкой устаревшего Python3.8. И что бы тулчейн начал работать, нам придется обойти это препятствие. Установим требуемую версию из PPA по этой инструкции  Далее проверим работоспособность тулчейна:  Запустим отладчик GDB c консольным интерфейсом  Если GDB запустился без ошибок, то значит тулчейн готов к работе.  Собираем LibOpenCM3. Переходим в каталог субмодуля и выполняем make clean && make  Микроконтроллеры STM32 поддерживают прошивку через различные штатные интерфейсы (USART, CAN, USB, I2C, SPI) За подробностями загрузки прошивок через них, рекомендую обратиться AN2606 "STM32 microcontroller system memory boot mode". Мы же обратим взор на три основных метода загрузки прошивок: Прошивка через последовательный порт. Прошивка через USB DFU интерфейс.  Прошивка через SWD, с использованием отдельного устройства-программатора. Давайте рассмотрим каждый метод подробно. В качестве тестовой прошивки в данных примерах, я буду использовать файлы test_blink_blackpill.bin, test_blink_blackpill.hex, test_blink_bluepill_bootloader.bin и test_blink_bluepill.bin которые вы можете найти в репозитории здесь и здесь. Отличие test_blink_bluepill_bootloader.bin от test_blink_bluepill.bin в использованном при сборке прошивки скрипта линковки. Как можно понять по исходя из пояснения из предыдущего раздела,  test_blink_bluepill_bootloader.bin собран с учетом уже имеющегося программного бутлоадера. Тестовая прошивка заставляет моргать светодиод на плате с частотой 2 герца. В качестве утилиты загрузки я использую stm32flash. Она имеется в репозитории, выполним ее установку Нам нужно будет взаимодействовать с последовательным портом в системе, и для этого нам потребуются права на символьные устройства последовательных портов. Добавим нашего текущего пользователя "stm32" в группу "dialout" Релогинимся или перезагружаемся для применения прав. Для прошивки нам потребуется любой доступный USB-Serial конвертер. Переставляем джампер на конвертере, задающий напряжение питания подключенного девайса, на значение 3.3В Подключаем линии GND и VCC, и линии данных: линию TX конвертера на ножку A10, a линию RX на ножку A9. Далее указываем микроконтроллеру что прошивка будет производиться через последовательный порт. У отладочных плат BluePill и BlackPill эта процедура немного отличается. STM32F1 На этих платах имеются джамперы BOOT1 и BOOT0. Нужно переставить джампер BOOT0 на значение «1». Затем нажмите кнопку "Reset"  и микроконтроллер будет готов к загрузке прошивки через UART После загрузки возвращаем джампер BOOT0 обратно, и нажмем Reset. На плате должен начать моргать светодиод. STM32F4 Данные отладочные платы не имеют джамперов, а лишь кнопку BOOT0. Подключив плату к USB-Serial конвертеру, и запитав её, нужно зажать кнопку BOOT0, и удерживая ее затем нажать кнопку RESET. Микроконтроллер перезагрузится, обнаружит прижатый к земле пин BOOT0, и войдет в режим прошивки через последовательный порт. После этого кнопку BOOT0 можно отпустить. Установка ПО для прошивки Для загрузки через DFU нужна утилита dfu-util. Устанавливаем её. Создадим  udev правила, которые разрешат непривилегированному пользователю взаимодействовать с USB DFU устройствами. STM32F1 К сожалению, аппаратная поддержка DFU в микроконтроллерах  STM32F103 отсутсвует. Но ее можно организовать и программно. Для этого нам понадобится прошивка «DapBoot». Файл бутлоадера с поддержкой DFU: dapboot-v1.20-bluepill.bin Скачиваем, и прошиваем её через USART, как было описано выше Отключаем плату от USB-to-Serial конвертера, и переставляем джампер BOOT1 в положение «1», а джампер BOOT0 в положение "0".  Подключаем плату через USB к компьютеру, и в подключенных  устройствах должно должен появиться девайс 1209:db42 Generic Devan Lai dapboot DFU bootloader Плата доступна для прошивки через dfu-utl. Обратите внимание, что в данном случае я исползую прошивку, которая была собрана с учетом того, что первые 8 Кб флеша уже заняты DFU бутлоадером. После прошивки выставляем джамперы в обычное положение (BOOT0 "0", BOOT1 "0"), нажимаем Reset на плате, и видим моргающий светодиод. STM32F4 Для входа в режим DFU, подключаем плату к USB, зажимаем кнопку RESET, затем BOOT0. Далее отпускаем RESET и кнопку BOOT0. Микроконтроллер должен войти в режим прошивки через DFU. Это можно проверить, отобразив список подключенных USB устройств: Далее прошиваем (обратите внимание что для аппаратного DFU нам надо указать "Altsetting of the DFU Interface" и "target address"): Нажимаем RESET, и видим моргающий диод. Один из самых продвинутых методов. При взаимодействии с микроконтроллером через SWD можно не только выполнять прошивку, но и отладку вашей программы на микроконтроллере. Для взаимодействия с отладочной платой через SWD, нам соответственно потребуется SWD программатор. Для решения этой проблемы есть два пути: Приобретается китайский клон программатора ST-Link V2. Внимание! Проверяйте распиновку программатора. Бывали случаи, когда нарисованная на корпусе распиновка не совпадала с платой. Достать из ящика стола еще одну ненужную плату BluePill/BlackPill, и прошить в нее софт под названием BlackMagicProbe, превращающий её в продвинутый программатор с поддержкой аппаратного GDB-сервера для отладки. Клон ST-Link V2 Начнем с более простого: покупного ST-Link V2 Установим ПО для работы с этим программатором: Подключаем программатор к пинам SWD платы (я возьму BlackPill), и выполняем прошивку: Готово! Black Magic Probe (BMP) Для начала скачиваем архив blackmagic-firmware.zip отсюда  , содержащий бинарные прошивки всех устройств, в которые может быть залит BMP, распаковываем его. Превращение BluePill в BlackMagicProbe Из архива извлекаем файл blackmagic_allinone-bluepill.bin, и прошиваем его в BluePill через последовательный порт, как было описано выше (не забыв поставиить перемычку BOOT0 в «1»). После прошивки, возвращаем перемычки на место, и подключим плату с BlackMagicProbe через USB. Мы должны увидеть новое устройство «OpenMoko, Inc. Black Magic Debug Probe (Application)», и два устройства ttyACM После удачной прошивки, вывод B14 платы станет ножкой SWDIO программатора, a вывод A4 - ножкой SWCLK Превращение STM32F4 BlackPill в BlackMagicProbe Войдем в режим программирования DFU, как было описано выше, и зальем в плату из архива бинарный файл blackmagic-blackpillv2.bin После прошивки переподключаем плату к USB, и убеждаемся что она теперь опознается как программатор Black Magic Probe В отличии от BluePill, BlackPill плата с прошитым BPM, в качестве ножек SWDIO и SWCLK программатора позволяет использовать SWD пины DIO и SCK. Т.е. вы можете просто соединить SWD порты BMP платы, и прошиваемого устройства. Прошивка через BMP выполняется с помощью GDB. Запустим ранее установленный GDB, и выполним подключние к аппаратному серверу, который должен находится на порту /dev/ttyACM0. Так же обратите внимание что прошивка для заливки находтся в формате Intel HEX. Дабы не набирать все это каждый раз в консоли GDB, можно воспользоваться пакетным вызовом команд: Данный этап – финальная точка в процедуре установки среды разработки. На данном этапе, в случае успешного выполнения всех инструкций, у вас имеются все 3 базовых элемента для разработки под микроконтороллеры STM32: компилятор + библиотека libopencm3, инструменты загрузки прошивки в микроконтроллер, инструменты отладки. Мы можем начать непосредственно разработку под libopencm3, которая будет описана в следующей статье.