Stm32 в какой среде программировать. Готовим «взрослую» среду разработки под STM32 в Linux. Atolic TrueStudio - новая бесплатная среда для STM32

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

Итак, для начала разберемся, что же нужно знать и уметь, чтобы начать изучать ARM’ы. А, в принципе, ничего супер сложного и фееричного 😉 Конечно, на контроллеры ARM люди обычно переходят, уже наигравшись с PIC’ами и AVR’ками, то есть в большинстве своем опытные разработчики. Но я постараюсь максимально подробно и понятно описывать все то, что мы будем разбирать, чтобы те, кто впервые решил попробовать себя в программировании микроконтроллеров, могли легко разобраться в материале. Кстати, если будут возникать какие-нибудь вопросы, или просто что-то будет работать не так, как задумывалось, пишите в комментарии, постараюсь разобраться и помочь.

Теперь перейдем к техническим вопросам) Несколько раз я уже упомянул название «Учебный курс ARM», но, по большому счету, это не совсем верно. Микроконтроллера ARM как такового не существует. Есть контроллер с ядром(!) ARM, а это, согласитесь, все-таки не одно и то же. Так вот, такие девайсы выпускает ряд фирм, среди которых особо выделяются, STMicroelectronics и NXP Semiconductors. Соответственно выпускают они контроллеры STM и LPC. Я остановил свой выбор на STM32, они мне просто больше понравились =) У STM очень подкупает, что разобравшись с любым МК из линейки STM32F10x, не возникнет никаких проблем и с любым другим. Одна линейка – один даташит. Кстати есть огромное количество как дорогих, так и не очень, отладочных плат с контроллерами STM32, что очень радует, хотя первое время будем отлаживать наши программы в симуляторе, чтобы оценить возможности контроллера, прежде чем покупать железо. Вот, на всякий случай, официальный сайт STMicroelectronics – .

Как то плавно выехали на тему компилятора, так что скажу пару слов об этом. Я, недолго думая, выбрал Keil, не в последнюю очередь из-за мощного встроенного симулятора. Можно и на UART там посмотреть, и на любой регистр, и даже логический анализатор имеется в наличии. Словом, у меня Keil оставил в основном только приятные впечатления, хотя есть и минусы, конечно, но не катастрофические. Так что можете смело качать Keil uvision4 с офф. сайта (). Правда есть одно НО – IDE платная, но доступен демо-режим с ограничением кода в 32кБ, которых нам пока с лихвой хватит. Кому этого мало есть огромное количество кряков для Keil’а 😉 Устанавливается все без проблем – пару раз тыкаем далее и все отлично ставится и работает без дополнительных танцев с бубном.

Собственно, вот и все, что я хотел тут рассказать, пора переходить от слов к делу, но это уже в следующей статье. Будем изучать программирование микроконтроллеров STM32 с нуля!

Совсем недавно компания STMicroelectronics приобрела компанию Atolic , которая занималась разработкой интегрированной среды TrueStudio . Через некоторое время было объявлено, что новые версии TrueStudio будут переориентированы исключительно на STM32 и станут бесплатными . В данной статье кратко описываются основные возможности новой среды, а также рассматривается экосистема микроконтроллеров STM32 в целом.

Около десяти лет назад микроконтроллеры семейства STM32 произвели настоящую революцию в отрасли. Эти быстрые, надежные и, главное, недорогие 32-битные контроллеры стали чрезвычайно популярными среди разработчиков. При этом компания STMicroelectronics не остановилась на достигнутом и продолжает расширять модельный ряд.

Высокий интерес к STM32 также объяснялся наличием грамотно выстроенной экосистемы: каждая новая линейка микроконтроллеров сопровождалась выпуском различных отладочных плат, бесплатных библиотек и различных фирменных утилит от ST.

Однако, если с аппаратной частью, библиотеками и утилитами у STM32 все было в полном порядке, то ситуация с интегрированными средами разработки (IDE) оставалась менее радужной. Конечно, поддержка STM32 присутствовала во всех основных IDE: Keil , IAR , TrueStudio и др., но у них был один общий недостаток - все они были платными. То есть для написания самых простых программ на С/С++ требовалось заплатить несколько тысяч долларов за лицензионный ключ. Впрочем, в STMicroelectronics старались всячески переломить ситуацию.

Первым шагом в этом направлении стало сотрудничество STMicroelectronics с Keil (ARM) . В результате этого пользователи бюджетных микроконтроллеров серии STM32F0 получили бесплатный доступ к полноценной версии среды - правда, с ограничением по объему кода. Впрочем, 32 кбайт хватает для подавляющего большинства приложений.

Далее STMicroelectronics оказала поддержку французскому проекту AC6 . Это привело к тому, что у пользователей STM32 наконец-то появилась своя собственная интегрированная среда разработки AC6 System Workbench (SW4STM32). По мнению экспертов, этот инструмент уступал своим более мощным коммерческим собратьям, однако он позволял создавать бюджетные устройства с минимальными затратами.

Совсем недавно STMicroelectronics объявила о покупке небольшой шведской компании Atolic, которая занималась разработкой достаточно популярной среды TrueStudio. Оглашение дальнейшей дорожной карты развития TrueStudio стало настоящим праздником для любителей STM32: новые релизы среды будут работать исключительно с STM32, при этом пользователи получат в свое распоряжение всю мощь TrueStudio, которая ранее предоставлялась только с лицензионной версией TrueStudio Pro.

В статье кратко рассматривается модельный ряд и экосистема микроконтроллеров STM32, описываются основные возможности и особенности Atolic TrueStudio, а в дополнительном видео приводится пример взаимодействия TrueStudio и STM32Cube.

Обзор семейств микроконтроллеров STM32

В настоящий момент компания STMicroelectronics выпускает более 800 моделей микроконтроллеров STM32, объединённых в 11 семейств. С учетом производительности, уровня потребления и наличия специализированной периферии все семейства можно разделить на четыре целевые ниши (рисунок 1):

  • Производительные семейства: STM32F2, STM32F4, STM32F7, STM32H7;
  • Базовые семейства общего назначения: STM32F0, STM32F1, STM32F3;
  • Малопотребляющие семейства: STM32L0, STM32L1, STM32L4;
  • Беспроводные микроконтроллеры семейства

Рис. 1. Портфолио микроконтроллеров STM32 от ST

Аппаратные средства разработки

На заре появления микроконтроллеров STM32 отладочные платы поставлялись преимущественно сторонними компаниями (IAR, Olimex и др.), однако позже STMicroelectronics перехватила инициативу и стала самостоятельно выпускать стартовые и ознакомительные наборы. Это позволило ускорить процесс продвижения новых микроконтроллеров на рынке. Сейчас общее число произведенных фирменных отладочных наборов для STM32 и STM8 превысило миллион экземпляров.

В настоящий момент для STM32 выпускается почти сто разновидностей фирменных отладочных плат, которые делятся на четыре функциональные группы: платы Discovery, платы Nucleo, платы расширения для Nucleo, отладочные платы Evaluation Boards.

Оценочные платы Discovery . Эти оценочные платы содержат целевой микроконтроллер, встроенный отладчик ST-LINK v2 и дополнительную внешнюю периферию: акселерометры, ЖК-дисплеи, кодеки и т.д. Состав периферии зависит от наименования платы. Сейчас к услугам разработчиков - 25 различных плат Discovery для микроконтроллеров практически всех семейств (рисунок 2).

Рис. 2. Примеры наборов Discovery

Платы Nucleo . Эти стековые палаты в первую очередь предназначены не для автономной работы, а для совместного использования с различными платами расширения в популярных стеках. Платы Nucleo-32 совместимы со стеком Arduino™ nano, платы Nucleo-64 и Nucleo-144 работают с Arduino™ Uno V3. Все платы имеют встроенный отладчик ST-LINK (рисунок 3).

Рис. 3. Наборы Nucleo

Платы расширения для Nucleo . Эти платы не относятся напрямую к микроконтроллерам STM32, однако именно они расширяют функционал плат Nucleo. В качестве примера можно упомянуть программно-аппаратный комплекс на базе программного пакета 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 в конкретных приложениях (управление двигателем, мультимедийные системы и т.д.). На Evaluation Boards всегда присутствует богатый набор специализированной периферии: дисплеи, приемопередатчики, МЭМС-датчики, кодеки, память, драйверы и т.д. (рисунок 5).

Рис. 5. Пример отладочных плат от STMicroelectronics

Обзор бесплатных программных средств от STMicroelectronics

Экосистема STM32 предоставляет широкий выбор программных библиотек и средств разработки как от STMicroelectronics, так и от сторонних компаний. При этом фирменное ПО от ST обладает огромным преимуществом - оно бесплатное.

В настоящий момент STMicroelectronics и партнеры компании предлагают несколько бесплатных инструментов, которые значительно облегчают создание встраиваемого ПО для STM32: библиотеки нижнего и среднего уровня, различные специализированные утилиты, кодогенератор с графическим интерфейсом STM32CubeMX, интегрированные среды AC6 System Workbench (SW4STM32) и Atolic TrueStudio.

Библиотеки нижнего уровня . Для каждого семейства микроконтроллеров STM32 компания STMicroelectronics выпускает библиотеку HAL-драйверов. При их использовании разработчику приходится общаться не с отдельными регистрами и полями регистров, а с законченными функциями. Таким образом, отпадает необходимость в доскональном изучении архитектуры контроллера. Это с одной стороны сокращает время написания кода, а с другой стороны делает его более понятным.

Библиотеки среднего уровня . Кроме низкоуровневых драйверов STMicroelectronics предлагает использовать различные специализированные библиотеки, например, для создания файловой системы, для реализации операционных систем, для работы с USB и т.д.

Специализированные утилиты . STMicroelectronics создает небольшие программы, которые повышают комфорт работы с STM32. Например, утилита ST MCU Finder значительно упрощает выбор оптимального контроллера или отладочного набора.

STM32CubeMX - кодогенератор с графическим интерфейсом, который максимально упрощает настройку микроконтроллеров STM32. Этот инструмент имеет широкий функционал. STM32CubeMX позволяет (рисунок 6):

Рис. 6. Структура программной платформы STM32Cube

  • Создавать и редактировать проекты для микроконтроллеров STM32 с последующей генерацией С-кода для конкретных IDE (IAR™ EWARM, Keil™MDK-ARM, Atollic® TrueSTUDIO и AC6 System Workbench (SW4STM32));
  • Выбирать оптимальный микроконтроллер или отладочную плату с учетом особенностей конкретного приложения. Фильтрация производится по различным полям (серия, корпус, объем памяти и т.д.);
  • Конфигурировать выводы микроконтроллера с помощью утилиты Pin Wizard с возможностью формирования табличного файла csv для трассировщиков печатных плат;
  • Настраивать частоты глобальных тактовых сигналов и тактовых сигналов периферийных устройств с помощью утилиты Clock Wizard;
  • Настраивать параметры ПО промежуточного уровня (файловая система, стеки протоколов, операционные системы и т.д.) и периферийные блоки с помощью утилиты Perepherial and middleware Wizard (вкладка Configuration). При этом для генерации С-кода могут использоваться различные библиотеки от ST (HAL или LL);
  • Оценивать уровень потребления и срока службы аккумулятора при заданных настройках микроконтроллера с помощью утилиты Power consumption Wizard.

AC6 System Workbench (SW4STM32) - бесплатная интегрированная среда, используемая для разработки встраиваемого ПО для микроконтроллеров STM32. Она позволяет писать программы на С/С++, компилировать, загружать и отлаживать их. Основными достоинствами данной среды являются:

  • Поддержка всех семейств микроконтроллеров STM32;
  • поддержка фирменных отладочных наборов (STM32 Nucleo, Discovery и Evaluation boards);
  • Отсутствие ограничений на объем программного кода;
  • Бесплатный компилятор GCC C/C++;
  • Свободный отладчик GDB (проект GNU);
  • Возможность упрощенного портирования проектов между контроллерами STM32;
  • Поддержка групповой разработки встраиваемого ПО с системой контроля версий SVN/GIT.

При работе с SW4STM32 удобно использовать «скелеты» программ, создаваемые в STM32CubeMX (рисунок 7).

Рис. 7. Интерфейс AC6 System Workbench (SW4STM32)

Новым пополнением в ряду бесплатных программных средств для STM32 стала интегрированная среда Atolic TrueStudio. Зачем нужна еще одна среда разработки, какие изменения ждут пользователей TrueStudio, и что может предложить новая IDE пользователям?

Atolic TrueStudio - новая бесплатная среда для STM32

Ранее компания ST уже оказала широкую поддержку компании AC6 и разрабатываемой ею бесплатной среде System Workbench. После этого ST продолжила двигаться в схожем направлении и приобрела компанию Atolic, которая занималась разработкой среды TrueStudio.

С первого взгляда это кажется не вполне логичным, однако, понять этот шаг можно. Дело в том, что AC6 System Workbench изначально была некоммерческим проектом, и ее функционал, видимо, не до конца устраивал ST. Теперь у компании появился серьезный и в то же время «карманный» проект, в котором в первую очередь будут учитываться интересы STM32.

Совсем недавно ST объявила о своих планах развития TrueStudio. Для пользователей наиболее значимыми будут следующие изменения:

  • В новых версиях TrueStudio останется возможность работы только с STM32;
  • Поддержка старых лицензионных версий TrueStudioPro продолжится в течение 1 года;
  • Новые версии TrueStudio станут бесплатными и будут обладать неограниченным функционалом TrueStudioPro.

Где скачивать и как устанавливать

Уже сейчас новая бесплатная версия TrueStudio доступна для скачивания с официального сайта разработчика: https://atollic.com/ . Инструкция по скачиванию представлена в видеоролике, дополняющем данную статью.

Процесс установки TrueStudio максимально прост. Все необходимые блоки и модули входят в состав установщика. От пользователя потребуется минимум усилий при инсталляции. Краткая инструкция по установке также представлена в видеоролике.

Основные возможности TrueStudio

Программная платформа . TrueStudio является полноценной интегрированной средой разработки встраиваемого ПО для микроконтроллеров STM32 (рисунок 8). Внешне TrueStudio чрезвычайно похожа на AC6 System Workbench. Это не удивительно, так как обе среды используют платформу Eclipse. Сходство на этом не заканчивается. В основе TrueStudio лежат те же открытые проекты компилятора GCC и отладчика GDB.

Рис. 8. Интерфейс TrueStudio

Поддерживаемые микроконтроллеры. TrueStudio работает только с STM32 и поддерживает все микроконтроллеры семейства. Кроме того, в TrueStudio есть поддержка большинства плат от STMicroelectronics. Пользователь может открыть готовые демонстрационные проекты без скачивания каких-либо дополнительных файлов.

Работа с проектами . TrueStudio позволяет создавать и редактировать проекты, написанные на С/С++. Существует возможность создания дерева проектов, что весьма удобно при параллельной работе с несколькими приложениями.

Работа с файлами . TrueStudio предлагает к услугам пользователей стандартный набор инструментов для работы с С/С++-файлами: поиск, интерактивный поиск, контекстную подсветку, шаблоны, дерево функций и т.д.

Компиляция и построение проекта . Как было сказано выше, TrueStudio использует GCC для компиляции проекта. При этом возможна оптимизация кода в процессе компиляции.

TrueStudio дает пользователям возможность ручного размещения кода и данных в памяти микроконтроллера.

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

Отладка . TrueStudio поддерживает работу с использованием всех популярных отладчиков, в том числе, ST-Link, SEGGER, P&E micro и др.

Среда имеет поддержку точек останова и пошагового выполнения. В процессе отладки программист получает доступ ко всем регистрам и памяти. Кроме того к услугам пользователя также предлагаются различные анализаторы (памяти, стека, ошибок).

Стоит отметить, что процесс отладки в TrueStudio мало чем отличается от работы с другими аналогичными средами.

Поддержка систем контроля версий . TrueStudio обеспечивает одновременную работу нескольких пользователей над проектом за счет поддержки систем контроля версий: CVS, SVN, Git.

Взаимодействие с STM32Cube . Как было сказано выше, применение STM32Cube значительно упрощает работу программистов на этапе инициализации микроконтроллеров. Поэтому возможность совместной работы с STM32Cube является очень большим плюсом для TrueStudio.

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

Небольшой проект, демонстрирующий взаимодействие STM32Cube и TrueStudio, представлен в видеоролике, дополняющем данную статью. В этом проекте STM32Cube используется для настройки таймера TIM4, выходные каналы которого управляют яркостью светодиода с помощью ШИМ. Отладка выполняется с помощью TrueStudio и платы STM32F4DISCOVERY .

Заключение

В конце 2017 года компания STMicroelectronics объявила о покупке фирмы Atolic, выполнявшей разработку интегрированной среды TrueStudio. Теперь с помощью TrueStudio пользователи STM32 могут совершенно бесплатно создавать приложения любой сложности. Большим плюсом TrueStudio является прямая поддержка STM32Cube.

Нам понадобятся следующие пакеты, часть из которых уже упоминалась в предыдущем посте:

yaourt -S arm-none-eabi-gcc arm-none-eabi-gdb \
arm-none-eabi-newlib stlink stm32cubemx openocd

Здесь приведены названия пакетов для Arch Linux , но я довольно уверен, что в других дистрибутивах Linux они называются так же, или как-то похоже. Если вам не удастся найти готовый пакет с STM32CubeMX, программу можно скачать отсюда (потребуется регистрация). Для работы приложению требуется виртуальная машина Java . Несмотря на то, что программа имеет расширение.exe, она превосходно запускается в Linux через java -jar file.exe .

Опционально вы также можете загрузить программу STLinkUpgrade, доступную для скачивания (также потребуется регистрация). Эта программа предназначена для обновления прошивки программаторов STLink, что нередко приводит к исправлению багов, ну или как минимум к лучшим сообщениям об ошибках. Как и STM32CubeMX, эта программа написана на Java.

Необходимое железо

Помимо профессионального софта нам также понадобится профессиональное железо. Плата Blue Pill, рассмотренная в прошлом посте, в целом неплоха, но пользоваться ею несколько неудобно. В частности, к ней приходится подсоединять внешний программатор с его лишними проводами. Плюс STM32CubeMX про эту плату ничего не знает, что также вносит свою долю неудобства. Наконец, если у вас этой платы еще нет, вам придется ждать ее доставки с AliExpress.

Компания STMicroelectronics производит собственные отладочные платы серий Discovery и Nucleo. Последние являются более новыми, поэтому сосредоточим свое внимание на них. Платы STM32 Nucleo имеют встроенный отладчик STLink v2.1, что избавляет нас от лишних проводов. Они до определенной степени совместимы с Arduino-шилдами, что может пригодиться. Цены на платы Nucleo в России начинаются от 19$ за плату Nucleo-F030R8 , притом купить ее можно в любом Чип-и-Дипе хоть сегодня.

Лично я взял плату помощнее — Nucleo-F411RE , на вырост, так сказать:

На двух других вкладках с названиями Clock Configuration и Configuration в этот раз нам ничего менять не придется. На вкладке Power Consumtion Calculator можно оценить энергопотребление микроконтроллера и время его работы в зависимости от выбранного аккумулятора и рабочего напряжения. Надо сказать, довольно любопытная и полезная возможность.

На этом с настройкой покончено. Говорим Project → Generate Code. Во вкладке Project вводим имя проекта (Project Name), выбираем родительский каталог для этого проекта (Prоject Location), в выпадающем списке Toolchain / IDE выбираем вариант «Makefile». Во вкладке Code Generator стоит выбрать опцию «Add necessary library files as reference in the toolchain project configuration file». Иначе в ваш проект будут скопированы все библиотечные файлы, а это более 160 Мб. Затем жмем ОК. Проект STM32CubeMX автоматически сохранится в каталоге с исходным кодом (файл с расширением.ioc), поэтому отдельно сохранять его не требуется.

Makefile в получившемся проекте нужно немного подправить. Во-первых, нужно исправить значение переменных BINPATH и PREFIX :

BINPATH =/ usr/ bin
PREFIX =arm-none-eabi-

В противном случае не будут найдены исполняемые файлы компилятора.

Во-вторых, стоит найти переменную OPT и дописать в нее флаг -Wall :

OPT = -Og -Wall

Иначе компилятор не будет ругаться на код, который скорее всего содержит ошибки — например, выражение if (arr[ i] = 1 ) , на месте которого почти наверняка должно быть if (arr[ i] == 1 ) .

В-третьих, если после этого шага сказать make , вы можете получить ошибки вроде следующих:

На момент написания этих строк в STM32CubeMX был баг, заключавшийся в том, что он несколько раз включал одни и те же файлы в список C_SOURCES . Нужно найти этот список в Makefile и убрать из него все повторы.

В-четвертых, Makefile умеет компилировать проект, но не содержит таргетов для прошивания платы, ее очистки, а также подключения по UART. Стоит дописать:

# проверьте, что для отступа используется табуляция, а не пробелы!
flash: all
st-flash --reset write build/ $(TARGET) .bin 0x8000000
erase:
st-flash --reset erase
uart:
screen / dev/ ttyACM0

Наконец, из соображений скорее перфекционизма, чем острой надобности, я бы заменил все абсолютные пути на относительные, введя переменную вроде:

FIRMWARE = $(HOME) / STM32Cube/ Repository/ STM32Cube_FW_F4_V1.18.0

… а также прогнал бы Makefile через утилиту dos2unix.

На этом подготовку шаблона/каркаса можно считать завершенной! Чтобы не проделывать описанные выше шаги при создании каждого нового проекта, шаблон стоит сохранить где-нибудь в надежном месте. Дабы не приходилось при повторном использовании этого шаблона редактировать имя проекта, стоит также отредактировать значение переменной TARGET на какое-нибудь абстрактное main .

Пишем код!

Если вы откроете файл Src/main.c, то найдете в нем множество отметок вроде:

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

По задумке, код нужно вписывать между этими комментариями, чтобы при обновлении проекта в STM32CubeMX пользовательский код не был затерт. Лично я добавил вызов процедур init() и loop() в окрестностях основного цикла программы:

/* Infinite loop */
/* USER CODE BEGIN WHILE */
init() ;
while (1 )
{
loop() ;
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

… а сами процедуры объявил перед процедурой main() :

/* USER CODE BEGIN 0 */

void init(void ) {
/* do nothing, yet */
}

void loop(void ) {
/*
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_Delay(500);
*/

if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET) {
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5) ;
}

HAL_Delay(100 ) ;
}

/* USER CODE END 0 */

Управление микроконтроллером осуществляется через библиотеку под названием HAL, Hardware Abstraction Layer. Как видите, что касается обычного чтения кнопок и мигания светодиодами, здесь все не намного сложнее, чем в случае с той же Arduino.

Подключаем плату и говорим make flash . Если все было сделано правильно, нажатие синей кнопки на плате будет приводить к переключению зеленого светодиода. Также можно оставить в процедуре loop() только код, который в приведенном выше отрывке я закомментировал, и тогда программа превратиться в обычный Blink.

Важно! Иногда микроконтроллер не запускается с новой прошивкой без нажатия черной кнопки Reset. По идее, обновление прошивки программатора с помощью утилиты STLinkUpgrade и использование утилиты st-flash с флагом --reset , как в нашем Makefile, исправляет эту проблему. Но так как она воспроизводится нерегулярно, полной уверенности нет.

Заключение

Как видите, все не так уж и сложно. Полученных знаний уже вполне достаточно, например, для того, чтобы написать программу, выводящую что-то на ЖК-экранчик или декодирующую сигнал от джойстика Sega . Можно даже пообщаться с какими-то сторонними модулями по SPI или I2C, хотя и не слишком эффективно, если вспомнить о наличии в микроконтроллере аппаратной поддержки этих протоколов. Однако эти темы, ровно как и ШИМ, чтение аналогового сигнала, работа с прерываниями или отладка кода, увы, выходят за рамки этой и без того уже довольно длинной статьи.

Полную версию исходников к этому посту, как обычно, вы найдете на GitHub .

А как вы разрабатываете под STM32?

Дополнение: Если вам понравилась эта заметка, вас могут заинтересовать статьи об обмене данными по UART , SPI , I2C и I2S в контексте микроконтроллеров STM32. Также обратите внимание на посты

Еще в студенческие годы мне пришлось весьма тесно обобщатся с микроконтроллерами, тогда это были 8-битные 8051 и AVR. Сейчас, захотев вернутся этому занятию, перевел свой взгляд на весьма широкое семейство контроллеров STM32. О них немало написано на просторах Сети, тем не менее я изъявил желание написать небольшой цикл статей о работе с STMками. Знакомство с ними я хотел бы начать, как говорят, с полного 0. Для экспериментов мною была приобретена простая и дешевая (3$) отладочная плата Maple Mini. Используемый в ней контроллер STM32F103CB обладает весьма внушительным букетом возможностей. (особенно в сравнении с решениями в своей ценовой категории). Подробно можно почитать в сети, и конечно же, в . Родная Ардуиноподобная среда разработки мне сразу не пришлаcь по вкусу (на вкус и цвет, как говорят...). Из всего изобилия разнообразных сред разработки я остановил свой взгляд на mikroC for ARM компании mikroelektronika. Когда-то я сталкивался с их компиляторами(для 8081), мне весьма понравилось. Хоть и не без косяков, но решил попробовать.


Плата имеет такой вид, все очень просто и лаконично:



Принципиальная схема платы тоже проста, но все самое необходимое здесь есть:



Программатором выбран китайский клон ST-LINK2 (3$), тем не менее он отлично работает с mikroС



Ссылка на демо-версию mikroC . Ограничение демо-версии: максимум 4KB бинарного кода. Не много, но для ознакомления вполне достаточно. С установкой приложения проблем возникнуть не должно, единственное нужно драйвера на ST-LINK2 поставить перед запуском инсталлятора mikroC.


После запуска и создания проекта нас приветствует окно приложения:



Первым делом после выбора типа используемого микроконтроллера необходимо настроить свойства нашего проекта. Конфигурация проекта mikroC вызывается сочетанием клавиш Shift-Ctrl-E (Project - Edit Project). Именно в этом окне настраиваются все прелести, связанные с непростой внутренней организацией системы тактирования STM32 микроконтроллеров. Вообще я советую хотя бы вкратце ознакомится с на данное семейство микроконтроллеров. К нему мы будем неоднократно возвращаться.



Блок-схема системы тактирования из даташита STM32F103


В данном окне задается конфигурация регистров RCC_CR и RCC_CFGR

  • Internal high-speed clock enable - Включение или отключение встроенного генератора 8МГц(HSI) (oscillator OFF)
  • External high-speed clock enable - Включение или отключение встроенного генератора 8МГц(HSE) (oscillator ON)
  • External high-speed clock enable - Возможность подключения к входу OSC генератора тактовых импульсов вместо кварца. Мы настраиваем на использование кварца (HSE oscillator not bypassed)
  • Clock seсurity system enable - Включение встроенной в контроллер систем защиты от пропадания синхросигнала; пока не используем (Clock detector OFF)
  • PLL Enable - Включение/отключение модуля умножения частоты (PLL ON)
  • System clock switch - Выбор тактового сигала SYSCLOCK: PLL, внешний или внутренний генератор. Мы используем PLL. Именно на частоте HSE умноженного на коэффициент PLL и работает ядро нашего контроллера (PLL selected as system clock)
  • Set and cleared by software to control the division factor of the AHB clock - Установка предделителя SYSCLOCK для шины AHB, которая обслуживает периферийные модули МК; пока отключаем предделитель *(SYSCLOCK not divided)
  • APB low-speed prescaller APB1 - делитель частоты для низкоскоростной периферии МК, например шины I2C, максимальная частота работы:36 МГц (HCLK divided by 2)
  • APB high speed prescaller APB 2- делитель частоты для высокоскоростной периферии МК, например портов ввода-вывода, таймеров и т.д. (HCLK not devided)
  • ADC prescaller - предделитель для модуля АЦП относительно APB 2 (PCLK2 divided by 2)
  • PLL entry clock source - источник тактового сигнала на вход PLL, на выбор либо 1/2 встроенного RC генератора либо внешний генератор, прошедший через PREDIV1; именно его и используем (Clock from PREDIV1 selected as the PLL input clock)
  • HSE divider for PLL entry - настройка этого самого PREDIV1; пока не используем (HSE clock not divided)
  • PLL multiplication factor - коэффициент умножения PLL. На входе у нас частота кварца 8 МГц, при коэффициенте 9 имеем частоту 72 МГц для SYSCLOCK (PLL input clock х 9)
  • USB prescaller - частота шины USB. USB по спецификации работает на частоте 48 МГц, выбираем предделитель 1,5 (PLL clock divided by 1.5)

MSU clock frequency выбираем частоту SYSCLOCK - 72МГц (72.000000)




Для установки выходов GPIO порта на выход в microC есть функция


GPIO_Digital_Output(&GPIOх_BASE, _GPIO_PINMASK_ALL);// Настройка порта на выход

она включает тактирование блока GPIOх и прописывает значения в конфиграционный регистр. Данные которые записываем в порт заносим в регистр GPIOх_ODR .


GPIOх_ODR = ; // Региcтр записи в порт

Компилятор позволяет получить доступ к конкретному биту регистра или переменной. Для этого номер бита (начиная с 0) пишем после названия регистра через точку


REGx.by; // Доступ к отдельному (y) биту регистра (х)

Для формирования задержек используем встроенную функцию Delay_ms() (или Delay_us() ) компилятора. Вот наша первая программа:


void main() { GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_1); //Делаем PB1 выходом GPIOb_ODR.b1 = 0; //Записываем в регистр GPIOb_ODR в 15 бит = 0 while(1) // Бесконечный цикл { GPIOb_ODR.b1=~GPIOb_ODR.b1; //Инверсия 15 бита Delay_ms(500); //Задержка 500 мс } }

Чтобы одна команда инициализации применялось сразу к нескольким ножкам порта пишем _GPIO_PINMASKn через оператор "или", например:


GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_1 | _GPIO_PINMASK_7); //PB1 и PB7 настроены на выход GPIO_Digital_Output(&GPIOa_BASE, _GPIO_PINMASK_ALL); //Все ноги PA настроены на выход

Теперь попробуем вывести меандр на один из выводов МК, переключая состояние вывода порта PB15 с интервалом 5 мс. :


void main() { GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_15); GPIOb_ODR.b15 = 0; while(1) { GPIOb_ODR.b15=~GPIOb_ODR.b15; Delay_ms(5); // Задержка 5 мс.(Импульс 10 мс, частота 100 Гц) } }

На выводе PB15 имеем такой сигнал:



Если нам необходимо считать состояние порта, то используем регистр GPIOх_IDR , предварительно настроив порт на вход при помощи функции GPIO_Digital_Input (*port, pin_mask). На нашей плате есть кнопка, подключенная к выводу порта PB8. Следующая программа зажигает мигающий светодиод на выводе PB1 при нажатой кнопке.


void main() { GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_1); GPIO_Digital_Input(&GPIOb_BASE, _GPIO_PINMASK_8); // Настраиваем вывод PB8 на вход GPIOb_ODR.b1 = 0; while(1) { if (GPIOb_IDR.b8) //Если кнопка нажата бит 8 регистра GPIOb_IDR равен 1 { GPIOb_ODR.b1=~GPIOb_ODR.b1; Delay_ms(500); //Задержка 500 мс } else { GPIOb_ODR.b1 = 0; //Если кнопку отпустили, погасить светодиод } } }

На этом 1 часть подошла к концу. Во второй части я постараюсь Вас познакомить с реализацией ШИМ модуляции, работой с таймерами и функцией подавления дребезга контактов на кнопке.

Теги: Добавить метки

Опубліковано 10.08.2016

Для того, чтобы разрабатывать свои программы нам понадобится среда разработки, желательно с дебаггером, и компилятор C.

Я остановился на CooCox CoIDE и GCC . Во-первых этот софт не стоит денег, во-вторых – с ним не возникло никаких вопросов. Установил и начал работать. Правда, CooCox сделан только под Windows. Это не совсем хорошо. И хотя на Ubuntu CooCox работает под wine и даже компиляция проходит успешно, с дебаггером проблема. И работа через wine – это не true way.

Установим 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)

Первая программа

Запускаем CooCox .

Выполняем пункт меню Project -> New

Указываем имя проекта:

Выбираем Чип:


В репозитории выбираем какие именно модули мы будем использовать:


Открываем main.c і набираем следующий код программы:

#include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" int main(void) { int i; /* Initialize Leds mounted on STM32 board */ GPIO_InitTypeDef GPIO_InitStructure; /* Initialize LED which connected to PC13, Enable the Clock*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /* Configure the GPIO_LED pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); while (1) { /* Toggle LED which connected to PC13*/ GPIOC->ODR ^= GPIO_Pin_13; /* delay */ for(i=0;i

Компилируем (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 ” Рекомендуется:

  1. Запустить STM32 ST-LINK Utility и выполнить Frimware update .
  2. Скопировать файл STLinkUSBDriver.dll из папки
    C:\Program Files\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility
    в папку
    C:\CooCox\CoIDE\bin
    после чего перезапустить CooCox IDE

Некоторые настройки IDE и параметры компилятора

Repository

Выполняем пункт меню View -> 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

Здесь устанавливаются параметры загрузки программы в микроконтроллер. Здесь нам тоже ничего менять не надо.

Дебаггер

Конечно, можно просто заливать программу в микроконтроллер и смотреть как она работает. Но иногда, возникают проблемы, и этого не достаточно. Хотелось бы разобраться как работает написаная программа. CooCox CoIDE имеет встроенный дебаггер, что очень полезно на этапе изучения микроконтроллера. Также дебаггер поможет найти ошибки в сложных проектах. CooCox CoIDE уже настроена на работу с ST-Link и никаких дополнительных настроек делать не нужно. Достаточно запустить дебаггер Меню (Debug -> Debug). При этом программатор должен быть подключен к компьютеру, а микроконтроллер к программатору. При запуске дебаггера выполняется компиляция проекта, заливка программы в микроконтроллер и ее пошаговое выполнение.

У Вас есть следующие кнопки для управления дебаггером.

Поэкспериментируйте с ними, чтобы понять как они работают.

В закладке Variables можете наблюдать за значением переменных.

Также можно подвести курсор к переменной и наблюдать в всплывающей подсказке ее значение

Если установить Breackpoint (меню Debug -> Todggle Breackpoint ) на нужные строки в коде, во время выполнения программы дебаггер будет останавливаться на установленных Breackpoint-ах.


Теперь, после первого знакомства с IDE, можно перейти непосредственно к изучению микроконтроллера STM32F103 и написания своих программ.