- 2. STM32. Программирование. IDE для STM32
- Установим IDE CooCox CoIDE на Windows
- Первая программа
- Некоторые настройки IDE и параметры компилятора
- Repository
- Конфигурация проекта
- Закладка Compile
- Закладка Link
- Закладка Output
- Закладка User
- Закладка Debugger
- Закладка Download
- Дебаггер
- Простые бесплатные программные средства разработки ПО для STM32
- Аппаратные средства разработки
- Обзор бесплатных программных средств от STMicroelectronics
- ST MCU Finder – простой инструмент подбора оптимального микроконтроллера
- STM32CubeMX – графический генератор кода для микроконтроллеров STM32
- Создание простейшей программы с помощью STM32CubeMX
- Миграция проектов с помощью STM32CubeMX
- AC6 System Workbench – бесплатная IDE для STM32
- STMStudio – простой способ отладки приложений на STM32
- Реализация терминального вывода printf() через USART
2. STM32. Программирование. IDE для STM32
Для того, чтобы разрабатывать свои программы нам понадобится среда разработки, желательно с дебаггером, и компилятор C.
Я остановился на CooCox CoIDE и GCC. Во-первых этот софт не стоит денег, во-вторых — с ним не возникло никаких вопросов. Установил и начал работать. Правда, CooCox сделан только под Windows. Это не совсем хорошо. И хотя на Ubuntu CooCox работает под wine и даже компиляция проходит успешно, с дебаггером проблема. И работа через wine — это не true way.
UPD: Я выложил версию CoIDE 1.7.8 на Яндексдиск. В дальнейшем будем использовать и другие IDE (читай как установить и настроить Keil uVision5 – IDE для STM32, IAR Workbench – IDE для STM32).
Также следует обратить внимание на IDE для STM32 System Workbench for STM32 Лично я перешел на System Workbench for STM32 |
Установим IDE CooCox CoIDE на Windows
- Качаем и устанавливаем программу CooCox (CoIDE-1.7.8.exe) На момент написания статьи была доступна версия 2.0 Бета. Но бета-версиям я стараюсь не пользоваться, поэтому в примерах будет фигурировать версия 1.7.8.
- Качаем и устанавливаем GCC (gcc-arm-none-eabi-5_3-2016q1-20160330-win32.exe)
Далее имеется в виду, что Вы имеете базовые знания С.
Первая программа
Выполняем пункт меню Project -> New
Указываем имя проекта:
В репозитории выбираем какие именно модули мы будем использовать:
Открываем main.c і набираем следующий код программы:
Компилируем (Project->Build)
При первой компиляции IDE может запросить указать местонахождение компилятора.
Надо корректно указать место, куда был установлен GCC.
После удачной компиляции заливаем программу в микроконтроллер. Эта программа будет мигать светодиодом на плате. Как залить программу в микроконтроллер мы рассматривали в предыдущей статье.
Если Вы будете заливать прошивку через UART с помощью UART-USB переходника, файл для заливки найдете в директории: C:\CooCox\CoIDE\workspace\Example_GPIO\Example_GPIO\Debug\bin\Example_GPIO.bin
Если у Вас есть установленный ST-Link программатор, программу в микроконтроллер можно залить прямо с IDE (Flash -> Program Download).
Если при этом возникла ошибка «Error: Flash driver function execute error» Рекомендуется:
- Запустить STM32 ST-LINK Utility и выполнить Frimware update.
- Скопировать файл STLinkUSBDriver.dll из папки C:\Program Files\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility в папку C:\CooCox\CoIDE\bin после чего перезапустить CooCox IDE
Некоторые настройки IDE и параметры компилятора
Repository
Здесь мы выбираем библиотеки, которые необходимы для нашего проекта. При этом IDE копирует в папку stm_lib вашего проекта нужные файлы.
Конфигурация проекта
Закладка Compile
в этой закладке устанавливаются ключи компилятора. Мы сюда еще будем возвращаться, а пока обратим внимание на поле Optimization. Это поле задает параметр оптимизации для компилятора. Об оптимизации будет отдельный разговор, пока Вам нужно усвоить, что оптимизация Optimizate Size (-Os) максимально уменьшает объем скомпилированных программ. Но при этом компилятор может выбросить (оптимизировать) некоторые операции, и программа может работать не так, как Вам бы хотелось. Поэтому, на первых этапах, я не рекомендую использовать этот метод оптимизации. Установите Optimizate (-O1).
Закладка Link
В этой закладке пока нас интересует только поле Library и Linked Libraries. Если Вы будете использовать стандартные библиотеки С, например библиотеку математических функций math Вам нужно будет выбрать «Use base C Library«. Если этого не сделать, то компилятор выдаст ошибку.
Закладка Output
Здесь указываются куда складывать скомпилированные файлы и в каких форматах.
Закладка User
Пока в ней мы ничего делать не будем.
Закладка Debugger
В этой закладке устанавливаются параметры дебаггера. Поскольку мы будем использовать ST-Link, здесь ничего менять не придется.
Закладка Download
Здесь устанавливаются параметры загрузки программы в микроконтроллер. Здесь нам тоже ничего менять не надо.
Дебаггер
У Вас есть следующие кнопки для управления дебаггером.
Поэкспериментируйте с ними, чтобы понять как они работают.
В закладке Variables можете наблюдать за значением переменных.
Также можно подвести курсор к переменной и наблюдать в всплывающей подсказке ее значение
Если установить Breackpoint (меню Debug -> Todggle Breackpoint) на нужные строки в коде, во время выполнения программы дебаггер будет останавливаться на установленных Breackpoint-ах.
Теперь, после первого знакомства с IDE, можно перейти непосредственно к изучению микроконтроллера STM32F103 и написания своих программ.
Простые бесплатные программные средства разработки ПО для STM32
13 февраля 2017
Одна из причин популярности микроконтроллеров STM32 производства STMicroelectronics – разнообразие инструментов разработки и отладки. Это касается как аппаратных, так и программных средств. Существует возможность создания и отладки резидентного ПО для STM32 без материальных затрат с помощью набора бесплатных программ. В статье дан обзор наиболее значимых бесплатных программных инструментов разработки: ST MCU Finder, STM32CubeMX, SW4STM32, STM32 Studio.
Компания STMicroelectronics (ST) является крупнейшим производителем микроконтроллеров в мире, при этом большая часть приходится на семейства STM32. При разработке новых линеек контроллеров STMicroelectronics преследует несколько стратегических целей:
- повышение производительности;
- повышение уровня интеграции: рост объема памяти, расширение перечня периферии;
- снижение потребления;
- снижение стоимости.
Для любого инженера очевидно, что эти цели очень часто оказываются взаимоисключающими. По этой причине STMicroelectronics выпускает семейства и линейки микроконтроллеров с акцентом на то или иное из приведенных выше свойств. В настоящее время номенклатура STM32 включает десять семейств, каждое из которых имеет свои достоинства и занимает определенную нишу на рынке (рисунок 1).
Рис. 1. Портфолио микроконтроллеров STM32 от ST
Дадим краткую характеристику семействам микроконтроллеров STM32 от ST.
Малопотребляющие микроконтроллеры семейств STM32L. Данная группа объединяет семейства, ориентированные, в первую очередь, на достижение минимального уровня потребления. Для этого используются различные методы: динамическое управление напряжением питания, гибкая система тактирования, специализированная периферия (LP-Timer, LP-UART), развитая система режимов пониженного потребления и так далее.
STM32L0 – семейство, построенное на базе ядра Cortex®-M0+ с рабочей частотой до 32 МГц и объемом Flash 8…192 кбайт. Представители семейства являются прямыми конкурентами 16-битным контроллерам и в большинстве случаев превосходят их как по производительности, так и по минимальному уровню потребления.
STM32L1 – семейство с ядром Cortex®-M3 с рабочей частотой до 32 МГц и объемом Flash 32…521 кбайт. При равной рабочей частоте данное семейство по уровню производительности мало уступает традиционным линейкам STM32F с тем же ядром, но отличается более малым потреблением.
STM32L4 – микроконтроллеры со сверхпроизводительным ядром Cortex®-M4 и объемом Flash 128 кбайт…1 Мбайт. Производительность этого семейства достигает 177 ULPMark/273 CoreMark, что превосходит даже производительность контроллеров из базовых семейств STM32F.
Базовые семейства STM32F0, STM32F1, STM32F3. Данная группа включает семейства со сбалансированными характеристиками и компромиссным значением производительности/потребления/цены.
STM32F0 – наиболее маломощное с точки зрения производительности семейство. Оно построено на базе ядра Cortex®-M0 с рабочей частотой всего 48 МГц и имеет объем Flash-памяти 16…256 кбайт. Основное назначение этих микроконтроллеров – вытеснение 8- и 16-битных систем из традиционных бюджетных приложений. Стоимость отдельных представителей STM32F0 составляет всего 0,5$.
STM32F1 – исторически первая линейка 32-битных микроконтроллеров от ST. Именно семейство STM32F1, построенное на ядре Cortex-M3 с рабочей частотой до 72 МГц, подтолкнуло многих разработчиков уйти от 8-битных ядер. В настоящий момент семейство объединяет представителей с объемом Flash 16 кбайт…1 Мбайт.
STM32F3 – семейство микроконтроллеров для работы с аналоговыми сигналами. Для этого к услугам разработчиков – ядро Cortex®-M4 с рабочей частотой до 72 МГц, блоком вычислений с плавающей запятой и поддержкой DSP-инструкций. Кроме того, STM32F3 обладают наиболее богатой аналоговой периферией, в том числе – 16-битными ΣΔ-АЦП, сверхбыстродействующими АЦП последовательного приближения со скоростью преобразования до 5 миллионов выборок в секунду.
Высокопроизводительные семейства STM32F2, STM32F4, STM32F7, STM32H7 ориентированы на достижение максимального быстродействия. Впрочем, стоит отметить, что существуют и отдельные линейки внутри указанных семейств, которые были нацелены на снижение динамического потребления, например, STM32F401.
STM32F2 построено на базе «разогнанного» до 120 МГц ядра Cortex®-M3. По характеристикам и набору периферии STM32F2 представляет собой дальнейшее развитие STM32F1. Объем памяти для представителей семейства составляет 128 кбайт…1 Мбайт.
STM32F4 – чрезвычайно богатое семейство, построенное на ядре Cortex®-M4 и объединяющее почти полторы сотни микроконтроллеров. Представители семейства объединены в несколько линеек, оптимизированных по различным параметрам: уровню интеграции, уровню потребления, производительности. Сейчас к услугам разработчиков предоставлены модели с рабочими частотами 168…180 МГц и объемом памяти до 2 Мбайт. Перечень периферии очень сильно отличается от линейки к линейке. Самые скромные микроконтроллеры имеют на борту только самое нужное: коммуникационные интерфейсы, таймеры, порты ввода/вывода. Самые продвинутые модели могут похвастаться графическим ускорителем, контроллером TFT, развитой аудиосистемой, продвинутым контроллером внешней памяти и тому подобным.
STM32F7 – сверхпроизводительное семейство на базе ядра Cortex®-M7 с рабочей частотой до 216 МГц и объемом Flash до 2 МБайт. Перечень периферии данного семейства поражает своим многообразием: USB, Ethernet, CAN, HDMI, DFSDM, ЕАЕ-контроллер, графический ускоритель, контроллер внешней памяти FMC и так далее. Семейство STM32F7 оставалось наиболее мощным в номенклатуре STMicroelectronics до появления STM32H7.
STM32H7 – флагманское семейство производства компании STMicroelectronics. Микроконтроллеры этой серии выполняются по топологическим нормам 40 нм, что позволило повысить быстродействие и снизить потребление. Так, например, производительность STM32H743 имеет рекордное значение 856 DMIPS.
Ключевыми нововведениями STM32H7 по сравнению с STM32F7 являются:
- повышение рабочей частоты до 400 МГц;
- увеличение объема ОЗУ до 1 Мбайт;
- появление новой периферии, в частности высокоточного таймера HR с максимальной рабочей частотой 400 МГц и разрешением 2,5 нс. Данный таймер ориентирован на сверхпрецизионные ШИМ-приложения, в том числе – резонансные преобразователи;
- расширение коммуникационных возможностей. Например, CAN-контроллер теперь поддерживает не только традиционные протоколы ISO 11898-1 (CAN 2.0 A, B), но и CAN FD 1.0 и TTCAN (ISO 11898-4). CAN FD – версия протокола, призванная увеличить скорость передачи данных: в реальных условиях удается получить до 12 Мбит/с. Протокол TTCAN (time triggered CAN) необходим для увеличения детерминированности при передаче данных, так как классический CAN работает с жесткой системой приоритетов, что не позволяет работать в реальном времени при большом объеме траффика. При использовании TTCAN на шине присутствует мастер, который контролирует «глобальное» время и выполняет арбитраж, при котором каждое устройство гарантированно сможет получить доступ к шине.
Компания STMicroelectronics использует пять различных модификаций ARM Cortex:
- Cortex®-M3 – исторически первое появившееся ядро, имеет сбалансированные характеристики производительности/потребления;
- Cortex®-M4 – развитие версии Cortex®-M3 в сторону повышения производительности. Основным функциональными нововведениями стали блок вычислений с плавающей точкой и поддержка DSP-команд цифровой обработки данных;
- Cortex®-M7 – на настоящий момент самое производительное ядро с максимальной рабочей частотой до 400 МГц;
- Cortex®-M0 – развитие ядра Cortex®-M3 в сторону упрощения и удешевления с целью получения конкурентоспособных бюджетных 32-битных контроллеров, способных заменить 8- и 16-битные процессоры;
- Cortex®-M0+ – данное ядро создавалось с целью оптимизации уровня потребления ядра ARM Cortex-M0. При выполнении тестов по методике Dhrystone статическая потребляемая мощность для Cortex-M0+ и Cortex-M0 оказалась примерно одинаковой: 0,95 мкВ и 0,96 мкВ соответственно. Однако динамическая потребляемая мощность сократилась примерно на 30% и составила 11,21 мкВ/МГц для Cortex-M0+, в то время как для Cortex-M0 была 16,36 мкВ/МГц.
Популярность платформы STM32 во многом определяется огромным выбором моделей. В настоящий момент в номенклатуре STM32 насчитывается более семи сотен представителей, и каждый инженер сможет подобрать оптимальный микроконтроллер практически для каждого приложения, исходя из предъявляемых требований к производительности/уровню интеграции/потреблению/стоимости. Однако у микроконтроллеров STM32 есть еще как минимум четыре преимущества, которые делают их очень привлекательными для разработчиков:
- Недавно компания STMicroelectronics объявила о 10-летней гарантии выпуска микроконтроллеров всех семейств STM32. Это важно в первую очередь для автомобильных и промышленных приложений. Если жизненный цикл коммерческой электроники составляет не более пяти лет, то для промышленных приложений он составляет не менее десяти, а то и двадцати лет. И все это время требуется выпуск дополнительных модулей и запасных частей. Если идти на поводу у рынка коммерческих приложений и прекращать выпуск элементной базы через 5 лет, то промышленные устройства (ЧПУ, привода, модули связи и так далее) попросту не будут успевать окупаться, так как через 5 лет их нельзя будет починить или найти им замену.
- ST предлагает огромное количество отладочных наборов: платы Discovery, Nucleo, Evaluation Boards. Они отличаются минимальной стоимостью и глубокой интеграцией с поставляемым ПО от ST. Не стоит забывать и об отладочных комплектах от сторонних разработчиков (Olimex, Keil, IAR и других).
- Сверхбогатый выбор программных средств разработки. К ним относятся как бесплатные продукты от ST, так и коммерческие программы сторонних разработчиков. Все большую силу набирают также открытые платформы и наработки отдельных разработчиков, доступные в сети.
- Широчайшая информационная поддержка со стороны компании (документация, руководства по применению, референсные решения и так далее). Большой объем полезных идей можно подчерпнуть из профильных форумов и пабликов.
Рассмотрим бесплатные программные средства разработки и отладки для STM32: ST MCU Finder, STM32CubeMX, SW4STM32, STM32 Studio. Отдельное внимание уделим краткому обзору отладочных плат производства компании STMicroelectronics. Именно с них и стоит начать данный обзор.
Аппаратные средства разработки
Наличие широкого выбора отладочных наборов – одна из главных причин популярности STM32. Число произведенных отладочных комплектов для STM32 и STM8 перешагнуло отметку в 1 миллион экземпляров. Стоит отметить, что эти платы не являются разобщенным набором, а входят в состав открытой программно-аппаратной платформы STM32 Open Development Environment (ODE), которая значительно упрощает освоение и использование не только микроконтроллеров STM32, но и других продуктов компании.
В настоящий момент к услугам разработчиков предлагается почти сто различных фирменных отладочных наборов трех групп: Discovery, Nucleo и Evaluation Boards. Дадим краткую характеристику каждой из групп.
Платы Discovery. STMicroelectronics предлагает 18 различных плат Discovery для микроконтроллеров практически всех семейств (кроме STM32F2 и STM32H7). Название “Discovery” говорит само за себя – «открытие». То есть эти платы необходимы в первую очередь для того чтобы разработчик мог ознакомиться с особенностями того или иного микроконтроллера с минимальными затратами времени. По этой причине они выполнены в виде законченных устройств со встроенным отладчиком ST-LINK, кнопками сброса, штыревыми колодками и прочим. Каждый из наборов имеет свои уникальные особенности. Если набор Discovery для микроконтроллеров STM32F0 включает минимальный набор дополнительных элементов (всего пара дополнительных кнопок), то Discovery для STM32F7 имеет огромный выбор периферии (цветной TFT-дисплей, USB, Ethernet и так далее) и впечатляющий внешний вид (рисунок 2).
Рис. 2. Примеры наборов Discovery производства ST
Платы Nucleo. Сейчас к услугам разработчиков предлагается 30 различных плат Nucleo трех основных типов: Nucleo-32, Nucleo-64, Nucleo-144, внешний вид которых представлен на рисунке 3 [1, 2, 3]. Название Nucleo, опять же, выбрано не случайно («ядро»), они предназначены не для автономной работы, а для совместного использования с различными платами расширения в популярных стеках. При этом Nucleo выступают в качестве вычислительного ядра и основы стеков. Например, Nucleo-32 совместимы со стеком Arduino™ nano, Nucleo-64 работает с Arduino™ Uno V3, Nucleo-144 также совместим с Arduino™ Uno V3. Функционал плат Nucleo может отличаться. Если Nucleo-32 и Nucleo-64 включают только отладчик ST-LINK и базовый набор элементов (кнопки сброса, пользовательская кнопка, светодиоды), то Nucleo-144 имеет расширенные коммуникационные возможности (Ethernet, USB).
Рис. 3. Наборы Nucleo
Дополнительный функционал платам Nucleo добавляют платы расширения. Это могут быть как платы производства STMicroelectronics, так и платы с поддержкой Arduino от сторонних разработчиков. В качестве примера можно упомянуть программно-аппаратный комплекс на базе программного пакета BLUEMICROSYSTEM1, который работает со стеком из системных плат STM32 Nucleo-64 (NUCLEO-F401RE или NUCLEO-L476RG), платами расширения МЭМС-датчиков X-NUCLEO-IKS01A1 и платами Bluetooth X-NUCLEO-IDB04A1 или X-NUCLEO-IDB05A1 (рисунок 4).
Рис. 4. Пример реализации стека на базе STM32 Nucleo-64
Отладочные платы Evaluation Boards. Данный тип плат предназначен для максимально полного ознакомления с особенностями различных микроконтроллеров STM32. Если на платах Discovery размещали минимальный набор дополнительных компонентов, то на Evaluation Boards стараются вместить все, что только возможно: отладчик ST-LINK, дисплеи, приемопередатчики (CAN, USB, Ethernet и прочее), разъемы, светодиоды, датчики и так далее (рисунок 5). Сейчас к услугам разработчиков предлагается 27 различных наборов для представителей всех семейств STM32 (за исключением STM32H7). Как и платы Discovery, наборы Evaluation Boards могут использоваться автономно.
Рис. 5. Пример отладочных плат производства STMicroelectronics
Используя отладочные платы и наборы производства компании STMicroelectronics, разработчики получают не только готовую аппаратную реализацию, но и существенную информационную поддержку:
- принципиальную схему, Gerber-файлы и спецификации на платы;
- документацию (руководства по применению, примеры использования);
- бесплатные программные средства от ST (утилиты, драйвера, среды разработки);
- огромный объем информации, доступный в различных сообществах, форумах и пабликах.
При разработке резидентного ПО большим плюсом становится наличие бесплатных средств разработки. Это не удивительно, так как коммерческая лицензия на использование популярных сред (ARM Keil, IAR и другие) стоит не менее нескольких тысяч долларов. Другими словами, чтобы создать простейший датчик стоимостью 500 рублей, нужно вложить как минимум 200…300 тысяч рублей в среду разработки. В этом смысле компания STMicroelectronics и ее партнеры просто спасают небольшие независимые компании со скромным бюджетом, предлагающие полноценный набор бесплатного ПО для разработки программного обеспечения встроенных систем.
Обзор бесплатных программных средств от STMicroelectronics
В настоящий момент вниманию разработчиков встраиваемого ПО для STM32 предлагается богатый выбор программных инструментов, в том числе такие мощные среды как ARM Keil ил IAR. Они имеют широчайший функционал, позволяют создавать проекты и использовать огромное число готовых программных модулей (операционные системы, файловые системы, стеки популярных протоколов). Однако у них есть один большой недостаток – цена. Хочешь полноценно использовать ARM Keil ил IAR – будь готов выложить круглую сумму.
В случае небольших и средних компаний стоимость программных средств разработки является жизненно важным и определяющим фактором при выборе типа микроконтроллеров. Используя контроллеры STM32 и бесплатные программные инструменты производства STMicroelectronics и партнеров компании, можно существенно снизить затраты.
Процесс разработки ПО состоит из четырех основных ступеней. В первую очередь выбирается микроконтроллер, оптимальный для данного конкретного приложения. На втором этапе происходит создание ПО нижнего уровня: создаются драйвера и библиотеки, происходит написание функций инициализации (настройка тактирования, системной и общей периферий). Далее происходит написание ПО среднего и верхнего уровней. На заключительном этапе происходит отладка созданного кода.
Компания STMicroelectronics позволяет пройти этот путь, не потратив ни единого рубля. Для этого к услугам разработчиков предлагается четыре инструмента:
- ST MCU Finder – приложение для смартфонов, позволяющее на первом этапе выбрать оптимальный контроллер или отладочный набор.
- STM32CubeMX – графический редактор для конфигурирования микроконтроллеров STM32, позволяющий автоматически генерировать конфигурационный С-код и «скелет» прикладной программы с помощью набора визуальных утилит. Благодаря STM32CubeMX этап создания функций инициализации происходит очень быстро. При этом от программиста не требуется написание ни единой строчки кода, хотя, конечно, алгоритмическую и смысловую части программы по-прежнему нужно создавать вручную.
- SW4STM32 – интегрированная среда разработки встраиваемого ПО компании AC6 для микроконтроллеров STM32, позволяющая писать программы, загружать и отлаживать их.
- STM Studio – фирменная утилита от STMicroelectronics, которая помогает отслеживать значения пользовательских переменных при выполнении кода в реальном времени.
Рассмотрим перечисленные программные инструменты более подробно.
ST MCU Finder – простой инструмент подбора оптимального микроконтроллера
Компания STMicroelectronics выпускает более семи сотен микроконтроллеров STM32. Такое многообразие неизбежно влечет путаницу при выборе оптимальной модели. Чтобы упростить жизнь разработчикам, предлагается три простых способа поиска подходящего контроллера: через параметрический поиск на сайте компании, с помощью утилиты ST MCU Finder или с помощью STM32CubeMX:
- ST MCU Finder – простая мультиплатформенная утилита, позволяющая находить оптимальный контроллер или отладочную плату по заданным критериям. Программа работает на всех популярных ОС: Android, iOS, и Windows Phone.
- ST MCU Finder предлагает два метода поиска: по параметрам (объем памяти, семейство, необходимая периферия и так далее) и по наименованию (рисунок 6). На вкладке Part Number Guide доступен выбор контроллера с расшифровкой наименования модели.
- Для поиска оптимального контроллера или отладочной платы также можно использовать программу STM32CubeMX.
Рис. 6. Главный экран мобильного приложения
ST MCU Finder
STM32CubeMX – графический генератор кода для микроконтроллеров STM32
Графические генераторы кода позволяют уйти от рутинного написания программ. Вместо самостоятельного создания текстовых файлов разработчик использует графические утилиты, которые автоматически формируют программный код. Примером такого подхода является кросплатформенный графический редактор STM32CubeMX (рисунок 7), работающий на всех популярных ОС: Windows®, Linux и OS X®.
Рис. 7. Состав и возможности STM32CubeMX
STM32CubeMX позволяет [4]:
- создавать и редактировать проекты для микроконтроллеров STM32 с последующей генерацией С-кода для конкретных интегрированных сред: IAR™ EWARM, Keil™MDK-ARM, Atollic® TrueSTUDIO и AC6 System Workbench (SW4STM32);
- выполнять поиск оптимального микроконтроллера или отладочной платы с учетом особенностей конкретного приложения. Фильтрация производится по различным полям, как и в случае с ST MCU Finder;
- производить визуализированную настройку выводов микроконтроллера с помощью утилиты Pin Wizard с возможностью формирования табличного файла csv для трассировщиков печатных плат;
- производить визуализированную настройку дерева тактирования с помощью утилиты Clock Wizard, в том числе – глобальных тактовых сигналов и тактовых сигналов периферийных устройств;
- производить визуализированную настройку периферийных блоков и ПО промежуточного уровня, файловой системы, стеков протоколов, операционной системы и так далее с помощью утилиты Perepherial and middleware Wizard (вкладка Configuration). При этом для генерации С-кода могут использоваться различные библиотеки от ST: HAL или LL;
- производить оценку уровня потребления и срока службы аккумулятора при заданных настройках микроконтроллера с помощью утилиты Power consumption Wizard;
- выполнять автоматическое обновление как самой среды STM32CubeMX, так и используемых ею программных библиотек STM32Cube для различных семейств STM32;
- автоматизировать процесс миграции проектов при переходе от одной модели микроконтроллера к другой.
STM32CubeMX является частью платформы STMCube™. Кроме STM32CubeMX, в состав STMCube™ входят отдельные фирменные наборы библиотек (рисунок 8). Так, например, набор библиотек STM32CubeF2 предназначен для работы с микроконтроллерами семейства STM32F2, а набор STM32CubeF4 объединяет библиотеки для STM32F4.
Рис. 8. Структура программной платформы STM32Cube
В свою очередь отдельные пакеты STMCube включают:
- аппаратно независимые библиотеки HAL для работы с аппаратными средствами микроконтроллеров;
- библиотеки промежуточного уровня. Например, в состав самого развитого пакета ПО STM32CubeF7 входят следующие библиотеки и стеки: CMSIS-RTOS на базе FreeRTOS, стек TCP/IP на базе LwIP, файловая система FAT на базе FatFs с поддержкой NAND Flash, StemWin – графический стек на базе SEGGER emWin, полный стек USB (Host и Device). Для ряда семейств доступна библиотека Touch Library для сенсорных приложений;
- примеры и шаблоны проектов для различных сред и отладочных наборов (Discovery, Nucleo, Evaluation Boards).
Чтобы понять, как происходит взаимодействие между составляющими программной платформы STM32Cube, следует обратиться к примеру, представленному на рисунке 9. В этом примере пользователь конфигурирует микроконтроллер STM32F429ZIT с помощью STM32CubeMX. После окончания визуальной настройки (выводов, тактирования и прочего) STM32CubeMX генерирует С-код, для этого используются библиотеки из программного пакета STM32CubeF4. В результате пользователь получает завершенный С-проект, сформированный для конкретной интегрированной среды разработки: IAR™ EWARM, Keil™MDK-ARM, Atollic® TrueSTUDIO и AC6 System Workbench (SW4STM32). В этот проект уже включены все необходимые библиотеки и файлы.
Рис. 9. Взаимодействие компонентов программной платформы STM32Cube
Программа STM32CubeMX значительно упрощает работу программистов, однако ее возможности не безграничны. Прежде чем двигаться дальше, стоит отметить существующие ограничения [4]:
- генерируемый С-код охватывает только настройку блоков и периферии микроконтроллера. Это значит, что алгоритмическую часть программы автоматически сгенерировать нельзя, ее нужно будет дописать вручную;
- STM32CubeMX поможет создать только стартовую конфигурацию. Иногда в процессе работы пользователю требуется изменить частоту работы периферийного блока или изменить конфигурацию вывода. Все это придется прописывать самостоятельно;
- для генерации кода используются стандартные, разработанные ST, библиотеки нижнего уровня (HAL и LL) и промежуточного уровня, например, StemWin или STM32_USB_Device_Library;
- в процессе генерации С-файл выстраивается таким образом, что для пользователя выделяются специальные секции, в которые он может помещать свой код. Если пользовательский код окажется вне этих рамок – он будет затерт при следующих генерациях;
- существуют и другие ограничения для отдельных блоков, для более подробного ознакомления с которыми следует обратиться к руководству по STM32CubeMX.
Теперь, когда состав, принцип действия и ограничения STM32CubeMX описаны, можно привести пример работы с данной программой, создать «скелет» простейшего проекта и продемонстрировать работу отдельных утилит.
Создание простейшей программы с помощью STM32CubeMX
Рассмотрим подробнее создание скелета проекта в среде STM32CubeMX [5]. Для начала требуется скачать саму среду STM32CubeMX. Это можно сделать абсолютно бесплатно с сайта ST. После установки на диске пользователя будут размещены как сам STM32CubeMX, так и папки с библиотеками STM32Cube.
Процесс создания скелета проекта выполняется по шагам.
Шаг первый. Скачивание актуальных версий библиотек с помощью специальной утилиты. Для этого вначале нужно настроить параметры сети (Help → Updater Settings) и далее запустить автоматическое обновление (Help → Check for Updates). Если ПК не подключен к сети – обновлять библиотеки придется вручную.
Шаг второй. После запуска STM32CubeMX на стартовом экране или в меню “File” необходимо создать новый проект, нажав “New Project”. Далее STM32CubeMX предложит выбрать целевую платформу: контроллер с заданными параметрами или отладочную плату. На рисунке 10 в качестве примера демонстрируется, как встроенный поиск подобрал список контроллеров по параметрам: семейство STM32F4, корпус TQFP100, объем Flash не менее 592 кбайт, ОЗУ более 214 кбайт.
Рис. 10. Процесс выбора оптимального микроконтроллера в STM32CubeMX
Шаг третий. На третьем этапе разработчику предстоит определить назначение выводов с помощью Pin Wizard (рисунок 11). Данная утилита помогает создавать требуемую конфигурацию и проверять ее на ошибки. Стоит отметить и удобную систему подсветки, например, системные выводы закрашиваются бледно-желтым цветом.
Рис. 11. Работа с утилитой Pin Wizard
Шаг четвертый. Настройка системы тактирования производится с помощью вкладки Clock Configuration (утилита Clock Wizard). При этом пользователь работает с визуализированным деревом тактирования (рисунок 12). С помощью Clock Wizard удается за нескольких щелчков мыши выбрать источник системного тактового сигнала, значения определителей и умножителей, а также источники тактирования периферийных блоков. При написании кода вручную для этого потребовалось бы приложить много усилий.
Рис. 12. Работа с деревом тактирования в Clock Wizard
Шаг пятый. Создание С-кода начинается с выбора целевой интегрированной среды в настройках проекта (Project → Settings). В настоящий момент к услугам пользователя предлагаются: IAR™ EWARM, Keil™MDK-ARM, Atollic® TrueSTUDIO и AC6 System Workbench (SW4STM32) (рисунок 13). Далее на вкладке Code Generator следует определиться с составом копируемых в директорию проекта библиотек, настройками обработки пользовательского кода при регенерации (например, сохранять или удалять), настройками использования HAL (рисунок 13).
Рис. 13. Выбор целевой среды разработки и базовые настройки С-генератора
Для более детальной настройки генератора следует перейти на вкладку Advanced Settings (рисунок 14). Главной особенностью С-генератора в STM32CubeMX является возможность использования как HAL-, так и LL-драйверов. На этом моменте следует остановиться подробнее.
Рис. 14. Расширенные настройки С-генератора
HAL – набор абстрактных драйверов, обеспечивающих максимальную кроссплатформенность среди контроллеров STM32. При этом некоторые драйверы являются абсолютно универсальными (подходят ко всем контроллерам STM32), а часть применима только к отдельным линейкам с соответствующими периферийными блоками (например, блоками шифрования). Главными достоинствами HAL являются [6]:
- максимальная кроссплатформенность;
- функциональная ориентированность. Эти драйверы ориентированы не на работу с отдельными блоками контроллера, а на выполнение конкретных задач. Это дает возможность работать не с регистрами, а с осмысленными функциями;
- не требуется глубокого знания архитектуры микроконтроллера.
Вместе с тем, у HAL есть и недостатки: значительный объем кода, недостаточная оптимизация выполнения задач, сравнительно малое быстродействие. Если эти недостатки являются критичными, то следует использовать LL-драйверы.
Low Layer APIs (LL) – аппаратно зависимые драйверы, позволяющие напрямую работать с периферией контроллера, в том числе – использовать inline-функции и выполнять атомарный доступ к регистрам [6]. Такой подход не требует значительных затрат памяти, функции получаются максимально короткими и эффективными по скорости. Очевидными недостатками LL-драйверов являются снижение совместимости кода при переходе от одного контроллера к другому и необходимость глубокого знания особенностей архитектуры контроллера.
В рамках одно и того же проекта на STM32CubeMX можно одновременно использовать как HAL так и LL, но для разных периферийных блоков. Например, на рисунке 15 показаны настройки С-генератора, при которых для UART/TIM/RTC используются LL-драйверы, а для остальных блоков – HAL.
Рис. 15. Пример неустранимой несовместимости при миграции
Шаг шестой. После настройки проекта следует выполнить генерацию кода, зайдя в меню Project → Generate Code. В результате этого в указанной директории проекта будет сгенерирован скелет проекта для заданной среды разработки.
Иногда возникает необходимость миграции проекта с одной платформы на другую. С помощью STM32CubeMX это можно сделать с минимальными затратами времени.
Миграция проектов с помощью STM32CubeMX
Для миграции проекта с одной платформы на другую используется дополнительная утилита File → Import Project (рисунок 15). В ней требуется указать тип нового микроконтроллера и режим миграции. После этого программа автоматически генерирует новый код либо, при наличии неполной совместимости ядер, указывает на возникшие сложности, предлагая пользователю их устранить.
Несовместимость, обнаруживаемая при миграции, может быть устранимой и неустранимой. Неустранимый случай возникает, когда состав периферии контроллеров значительно отличается. Например, ранее использовался модуль Ethernet, который отсутствует на новом МК (рисунок 15). Очевидно, что в таком случае миграция невозможна.
Но зачастую несовместимость имеет локальный характер, когда, например, необходимо всего лишь перенастроить параметры дерева тактирования, чтобы согласовать рабочие частоты, либо изменить номер канала АЦП или DMA и так далее (рисунок 16). В таких случаях STM32CubeMX предложит выполнить миграцию в ручном режиме с устранением появившихся сложностей с помощью редактирования проекта в рассмотренных выше утилитах. При этом STM32CubeMX будет сигнализировать пользователю о наличии проблем до их устранения.
Рис. 16. Пример устранимой несовместимости при миграции от STM32L053R8T6 к STM32L476RGT6
После получения итогового скелета проекта останется добавить пользовательскую алгоритмическую часть кода, провести компиляцию и выполнить отладку. Для этого используются специализированные среды. Среда SW4STM32 для STM32 производства компании AC6 позволяет делать это абсолютно бесплатно.
AC6 System Workbench – бесплатная IDE для STM32
Для редактирования, компиляции и отладки программ предназначены специальные интегрированные среды IDE. Большая часть из них является коммерческими продуктами (IAR™ EWARM, Keil™MDK-ARM, Atollic® TrueSTUDIO и другие), но есть и бесплатные инструменты, например, System Workbench производства компании AC6. В рамках системы названий STMicroelectronics данная IDE носит название SW4STM32.
Интегрированная среда SW4STM32 предназначена для работы с микроконтроллерами STM32. Она основана на базе платформы Eclipse и является бесплатной и кроссплатформенной. Основными ее достоинствами являются [6]:
- поддержка работы с микроконтроллерами STM32, аппаратными отладочными наборами (STM32 Nucleo, Discovery и Evaluation boards), с программными библиотеками (Standard Peripheral library и STM32Cube HAL);
- отсутствие ограничений на объем программного кода;
- бесплатный компилятор GCC C/C++;
- свободный отладчик GDB (проект GNU);
- открытая платформа Eclipse IDE с поддержкой групповой разработки встраиваемого ПО с системой контроля версий SVN/GIT;
- совместимость с плагинами Eclipse;
- поддержка ST-LINK;
- мультиплатформенность и совместимость с Windows®, Linux и OS X®.
С помощью SW4STM32 можно редактировать, компилировать и отлаживать программы для STM32. Для этого удобно использовать скелеты программ, создаваемые в STM32CubeMX. Для их импорта следует выполнить простейшие операции: выбрать меню File -> Import, назначить тип импорта «Existing Projects into Workspace», указать директорию проекта, выбрать сам проект и нажать Finish.
При работе с проектами, созданными в STM32CubeMX, следует размещать пользовательский код в специальных секциях:
/*USER CODE BEGIN…*/
Это необходимо делать, чтобы при повторной генерации кода в STM32CubeMX не произошло затирание рукописной части программы. Повторная генерация необходима в двух случаях:
- при перенастройке используемого МК;
- при миграции с одного МК на другой.
Таким образом, при работе в связке STM32CubeMX + SW4STM32 пользователь может в любой момент перенастроить контроллер и произвести миграцию с сохранением пользовательского кода при минимальных затратах времени.
При отладке программ в SW4STM32 доступна возможность широкого мониторинга состояния памяти, регистров, переменных. Также среда имеет поддержку точек останова (рисунок 17). Для запуска процесса отладки требуется нажать значок “Debug” (в виде жука), выбрать тип проекта “Ac6 STM32 C/C++ Application”, определить тип отладчика и интерфейс, нажать кнопку “OK”.
Рис. 17. Интерфейс среды разработки SW4STM32
SW4STM32 имеет поддержку систем контроля версий SVN/GIT. Это важно для больших проектов, над которыми работает несколько разработчиков. Система контроля версий позволяет: регистрировать все изменения, производимые в проекте; сравнивать версии проектов; восстанавливать предыдущие версии; разрешать конфликты при работе нескольких программистов над одним файлом; вести параллельно несколько версий и так далее.
В рамках данной статьи не имеет смысла углубляться в разбор тонкостей и различий между SVN и GIT. Скажем лишь, что GIT, являясь распределенной системой, позволяет программистам работать локально, имея на рабочей машине полный репозиторий проекта. При этом GIT сохраняет метаданные изменений, что упрощает слияние версий и переключение между версиями. SVN требует наличия сетевого соединения между разработчиками и сохраняет файлы целиком. SW4STM32 обеспечивает поддержку как SVN, так и GIT.
Рассмотрим последовательность действий при подключении проекта к SVN (рисунок 18).
- в открытом проекте щелкнуть по его названию на панели директорий правой кнопкой мыши и пройти Team → Share Project(s) (рисунок 18а);
- выбрать тип системы SVN/GIT и нажать “Next” (рисунок 18б);
- выбрать директорию для SVN и нажать “Next” (рисунок 18в);
- выбрать директорию хранения проекта в SVN нажать “Finish” (рисунок 18г);
- на вкладке “General” (рисунок 18д) выбрать URL-адрес SVN, метку для репозитория, имя пользователя, пароль, нажать “Next”;
- ввести комментарий для проекта, выбрать файл, помещаемый под контроль SVN, нажать “OK” (рисунок 18е).
Рис. 18. Подключение SVN в SW4STM32
В дальнейшем для синхронизации файла или всего проекта необходимо щелкнуть по его названию на панели директорий правой кнопкой мыши и выбрать Team → Commit. В открывшемся окне следует написать пояснение к изменениям и нажать “OK”.
Для отключения SVN следует использовать команду Team → Disconnect.
Для импорта проекта из SVN применяется команда меню Import → SVN → Project from SVN. Далее требуется выполнить ряд настроек по импорту во всплывающих диалоговых окнах.
SW4STM32 имеет очень широкие возможности, но у среды есть и недостатки, достаточно характерные для бесплатных сред:
- отсутствие встроенного симулятора;
- компилятор GCC проигрывает своим коммерческим собратьям по объему кода и быстродействию;
- поддержка SW4STM32 со стороны разработчиков не будет столь оперативной, как в случае с платными средами.
Впрочем, стоит отметить, что данные недостатки могут оказаться не такими критичными, особенно для простых проектов.
Отладка кода может производиться не только в SW4STM32, но с помощью дополнительных средств. Рассмотрим некоторые из них.
STMStudio – простой способ отладки приложений на STM32
STM Studio – фирменная утилита производства компании STMicroelectronics, которая помогает проводить отладку программы и позволяет отслеживать значения пользовательских переменных при выполнении кода в реальном времени. Данная программа запускается под ОС Windows и использует отладчик ST-LINK для связи с микроконтроллером.
STM Studio имеет следующие возможности [7]:
- чтение переменных из ОЗУ «на лету», без влияния на работу пользовательской программы;
- использование исполнительных файлов .elf, .out, .axf для импорта переменных;
- вывод значений переменных в табличной и графической форме;
- графический вывод в виде графиков или диаграмм;
- возможность вывода зависимостей переменных, когда одна из переменных откладывается по оси Х, а вторая – по оси Y;
- логирование данных в файл для последующего просмотра.
Окно STM Studio состоит из нескольких панелей (рисунок 19).
Рис. 19. Окно программы STM Studio
Работа с STM Studio начинается с импорта переменных. Для этого в программу необходимо загрузить тот же исполнительный файл, что находится в самом микроконтроллере. Для этого подойдут следующие форматы, которые генерируются при компиляции: .elf, .out, .axf. Далее необходимо выполнить команду File → Import variables. В диалоговом окне при выборе пункта “Expand table elements” пользователь сможет вручную выбрать из предлагаемой таблицы любые глобальные переменные. Для запуска отладки необходимо выполнить команду “Run”.
Как говорилось выше, STM Studio позволяет отображать переменные в трех формах: в виде текста, диаграммы и графика (рисунок 20). Настройка типа отображения может быть изменена в любое время. Кроме того, все данные дополнительно записываются в лог-файл для дальнейшего анализа. Интересной особенностью STM Studio является возможность отображения зависимостей одних переменных от других, а также построения выражений из переменных.
Рис. 20. Пример отображения переменных в STM Studio
Популярным средством передачи отладочной информации является использование консоли и функции вывода printf().
Реализация терминального вывода printf() через USART
Использование стандартной функции printf() – один из наиболее популярных методов вывода отладочной информации. С помощью данной функции вывода пользователь может передавать любые данные на консоль среды разработки или терминал. Большинство интегрированных сред поддерживает эту возможность. При использовании STM32 есть два способа реализации этого метода: традиционный, с помощью UART, и дополнительный, через SWO-интерфейс с помощью отладчика ST-LINK. Реализация каждого из них максимально упрощается при использовании STM32CubeMX и SW4STM32.
Рассмотрим вначале первый вариант реализации – через UART. Для этого придется выполнить следующую последовательность действий:
- обеспечить аппаратное подключение к ПК;
- выполнить настройку UART в среде STM32CubeMX;
- реализовать саму функцию printf() в среде SW4STM32.
Подключение к ПК можно выполнить тремя путями: через COM-порт и микросхему приемопередатчика RS-232; через USB-порт и микросхему конвертера UART-USB (например, FT232); с помощью USB-интерфейса отладчика ST-LINK. Вне зависимости от того, какой способ выбран, далее необходимо сконфигурировать аппаратный UART.
C помощью STM32CubeMX настройка UART выполняется в несколько кликов (рисунок 21). Сначала на вкладке Pin Wizard соответствующие выводы контроллера переводятся в режим работы UART. Далее во вкладке “Configuration” настраиваются параметры UART: тип обмена, скорость, наличие стоп-битов и так далее. После этого генерируется С-код.
Рис. 21. Настройка USART в STM32CubeMX для работы с printf()
В среде SW4STM32 необходимо подключить стандартную библиотеку и определить функции _io_putchar() и _write(), например, так: