STM32 fast start. Часть 1 ПО, материалы, Cube MX

  • Tutorial
В последнее время все чаще сталкиваюсь с холиварами на тему Cube MX и HAL, применительно к контроллерам STM32.

С одной стороны — стоят защитники, которым нравится удобство конфигурирования и читаемость кода.

С другой — приверженцы писать все руками, которым важна скорость работы и бережное использование ресурсов.

Для того, чтобы расставить все точки над i — попробуем написать «Hello world» тремя наиболее часто используемыми путями CMSIS, LL, HAL. Оценим затраты (ресурсы контроллера, объем исполняемого файла, и конечно же время работы разработчика).

Статья будет состоять из нескольких частей:

STM32 fast start. Часть 1 ПО, материалы, Cube MX.
STM32 fast start. Часть 2 Hello World на HAL, настройка отладки в Atollic TrueSTUDIO
STM32 fast start. Часть 3 Hello World на LL
STM32 fast start. Часть 4 Hello World на CMSIS
STM32 fast start. Часть 5 Подведение итогов, сравнение HAL, LL, CMSIS.

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

Идеальным вариантом будет бюджетная плата на STM32F103C8T6 микроконтроллере.

image

Данную плату можно найти на всем известном сайте по цене от 100 российских рублей.

Искать по ключевым словам: STM32F103C8T6 ARM STM32 Minimum

https://ru.aliexpress.com/af/STM32F103C8T6-ARM-STM32-Minimum.html?SearchText=STM32F103C8T6+ARM+STM32+Minimum

Для того, чтобы залить прошивку и поиграть с отладкой — так же потребуется программатор
Для начала, да и для дальнейшего использования идеально подойдет китайский клон программатора ST-LINK V2.

Купить можно на том же сайте по цене от 120 российских рублей.

image

Искать по ключевым словам ST LINK Stlink ST 252dLink V2 Mini STM8 STM32:

https://ru.aliexpress.com/af/ST-LINK-Stlink-ST%25252dLink-V2-Mini-STM8-STM32.html?SearchText=ST+LINK+Stlink+ST%252dLink+V2+Mini+STM8+STM32

Для разработки ПО под STM32 можно использовать различные IDE.

Самые популярные — IAR, Keil, Coocox (Eclipse).

Мы же пойдем по пути, который с недавних пор абсолютно бесплатно и в полном объеме предоставляет сама ST.

Будем использовать Atollic TrueSTUDIO for STM32 или в простонародии «Толик».

Какие плюсы у данного ПО: абсолютно бесплатно, нет ограничения по размеру кода, есть неплохой отладчик, простая установка и настройка.

Минусы: нет авто дополнения кода.

Доступны версии под windows и linux.

Качаем здесь https://atollic.com/resources/download/
С установкой данного ПО проблем возникнуть не должно, все интуитивно понятно, выбираем куда ставить и жмем все время «далее».

После установки можно не запускать, так как помимо самой IDE нужно еще кое что.

Если все таки запустили — просто закрываем.

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

Для этого применяется программа генератор кода Cube MX или в простонародии «Калокуб».
Данное ПО является первым камнем преткновения в холиварах на чем же писать под STM: на регистрах и CMSIS или на HAL.

Защитники первой идеологии приводят такие аргументы: Cube MX генерирует огромный, ненужный объем кода, который к тому же замедляет работу МК.

Защитники второй — заявляют, что автоматически сгенерированный код сокращает время разработки, позволяя разработчику быстрее переключится к сутевой части устройства (к основной логике), отдав рутинную настройку периферии на откуп специализированному ПО (Cube MX).

Как ни странно — обе эти идеологии правдивы и применимы на практике, но только каждая в своих условиях.

Давайте рассмотрим пару примеров:

Пример №1: Требуется разработать устройство, максимально дешевое, так как планируется производство партиями по 100500 шт ежегодно. Естественно, каждый лишний рубль цены устройства — выльется в сотни тысяч рублей затрат на финальном устройстве. При этом в планируемой разработке есть пара тяжелых расчетов и работа с периферией (ADC, SPI, UART) на максимальных скоростях.

Устройство является полностью автономным продуктом, в дальнейшем планируется минимальные изменения за весь срок производства данного оборудования. Срок разработки до получения готового образца — 1-2 года.

Пример №2: Требуется прототип устройства, который возможно заинтересует заказчика и он закажет 100 шт аналогичных устройств для переоборудования своего объекта. Первая планируемая партия должна быть отгружена заказчику через 2 месяца. Размер первой тестовой партии 10 шт.

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

В первом примере идеальным вариантом будет выбор максимально дешевого контроллера и написание аппаратно зависимого, но оптимального кода, где работа с периферией будет организована через обращение к соответствующим регистрам (CMSIS). Разработчик, который занимается данным проектом — должен обладать хорошими или отличными знаниями периферии конкретного семейства МК. В идеале — при попытке разбудить его ночью — должен сразу же назвать адрес требуемого вектора из таблицы векторов прерываний.

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

В таком случае выбирается контроллер, который можно быстро поставить в производство в текущем регионе, на нем делается инициализация с помощью Cube MX, пишется прикладная логика на HAL и прототип передается заказчику для тестирования. Такой проект может вести любой средний разработчик, который постиг навыки работы с целевым языком программирования. Вникание в тонкости работы периферии — практически не требуются.

Как бы это не печально звучало — в реалиях современной разработки устройств в России — пример №1 встречается все реже, передавая эстафету примеру №2.

К обсуждению примеров №1 и №2 вернемся в самом конце цикла статей, а сейчас продолжим с подготовкой рабочего пространства.

На данном этапе сделаем небольшую паузу, зайдем на сайт my.st.com и зарегистрируем на нем учетную запись, так как политика компании ST не позволяет скачивать необходимые материалы без регистрации.

После того, как у нас появился доступ к сайту — скачиваем STM32 Cube MX.

В самом низу страницы есть кнопка выбора версии, нам нужна версия 5.0.0

image

Попутно, пока мы не ушли отсюда, качаем еще две вещи, которые пригодятся в дальнейшем
https://www.st.com/en/development-tools/stsw-link008.html

Драйвер ST-LINK V2

image

и https://www.st.com/en/development-tools/stm32cubeprog.html
Программа прошивальщик.

image

Установка драйвера, прошивальщика и самого Cub’a не вызывают затруднений, просто соглашаемся со всем и жмем далее.

После полной установки необходимого ПО — можем приступать к созданию проекта.
Для этого запустим Cube MX.

В появившемся окне нажмем на кнопку «ACCESS TO MCU SELECTOR».

image

На нашей целевой плате установлен микроконтроллер STM32F103C8T6.

Введем его название в строке поиска и двойным щелчком выберем единственный найденный вариант.

В этой же таблице видно основную начинку нашего МК (64 килобайт флеша, 20 килобайт оперативы и пр).

image

Перед нами появился схематически изображенный корпус контроллера с разведенными в разные стороны ножками.

На данном этапе необходимо обязательно выбрать способ подключения отладчика.

Для этого на вкладке Pinout & Configuration в левом меню выбираем пункт SYS а в нем в выпадающем списке под названием «Debug» устанавливаем значение Serial Wire.

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

image

Еще раз вспоминаем, что мы хотим помигать светодиодом на нашей плате.

Для этого необходимо сначала узнать, к какой именно ножке он подключен.

В этом нам поможет схема электрическая принципиальная:

image

или более красочная и простая для понимания распиновка платы

image

Искомый светодиод находится на ножке PC13.

Соответственно, необходимо настроить данный вывод для работы в режиме выхода.

Для этого:

  1. Находим вывод на мнемосхеме
  2. Нажимаем на него правой кнопкой мыши, из выпадающего меню выбираем пункт «GPIO_Output»
  3. Переходим в меню GPIO,
  4. В списке выбираем PC13
  5. Заполняем таблицу PC13-TAMPER-RTC Configuration в соответствии со скриншотом, особенно нас интересуют параметры GPIO mode и User Label

image

Продолжаем настройку проекта, переходим к вкладке Clock Configuration.

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

image

Переходим к вкладке Project Manager, под вкладка Project.

Обязательно заполняем следующие параметры:

  1. Имя проекта (лучше использовать только латинские буквы)
  2. Директорию, в которой будет создан проект (так же лучше использовать только латиницу)
  3. IDE, в которой планируется работа над проектом (мы планируем использовать TrueSTUDIO)

image

Спускаемся ниже, под вкладка Code Generator.

Здесь обязательно отмечаем опцию Generate peripheral initialization as pair…

Таким образом получим более структурированный проект, в котором для каждого типа периферии имеется своя пара C и H файлов.

image

Остался последний шаг. Подвкладка Advanced Settings.

  1. Выбираем тип библиотеки HAL для всех периферийных модулей
  2. Собираем проект с текущими настройками

image

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

Даем свое согласие на скачивание файлов:

image

Идем греть чайник или готовить кофе:

image

После окончания работы кодо-генератора — сразу же открываем его:

image

Выбираем любую папку, где Atollic будет хранить рабочее пространство:

image

При успешном открытии — перед нами предстанет главное окно Atollic TrueSTUDIO for STM.

Общая информация нас мало интересует, поэтому сразу перейдем к дереву файлов.

image

Найдем там файл main.c и функцию int main(void):

image

Для самопроверки — попробуем собрать пустой проект

  1. В меню Project -> Rebuild Project
  2. Внизу выбрать вкладку Console
  3. При успешной сборке — должны получить надпись Build Finished

image

Продолжение — в следующей части.

P.S.: Ранее статью публиковал в своем личном блоге .
Support the author
Share post

Similar posts

Comments 42

    0
    Минусы: нет авто дополнения кода.

    Поясните, что вы имеете в виду под термином «авто дополнение»? Если классическое дополнению текста по введённой его части, то оно есть. Вводите часть слова, нажимаете Ctrl+пробел, выбираете вариант.
      0
      Я, честно говоря, не помню что там с автодополнением слов, но вот чего там нет, так это выпадающих списков полей, после того как написал имя структуры (а вот при работе с регистрами оно _очень_ помогает), а также прочих «go to definition».
      Пару лет назад писал конвертор makefile-ов которые генерит Cube в CMake-овские, а потом открывал их взрослой VisualStudio.

      Но сравнительно недавно была на хабре статейка про использование VSCode для STM32. Там вроде уже все это есть без плясок с бубнами.
        0
        Поискал чуть. Оказывается не я один такой конвертор писал. Вот тут уже есть инструкция:
        habr.com/ru/post/310742/#comment_9828166
          0
          И список полей выводит. Причем Эклипс умеет это делать с дремучих времен. Это в свое время заставило меня перейти с IAR на Эклипс.
        0
        Большое спасибо за годный туториал!

        Как на счёт С++? Хотелось бы знать насколько он вообще применим для STM32 в условиях отсутствия кучи. Можно ли использовать размещающий оператор new, деструкторы, stl?
          0
          Есть там heap (даже в AVR есть).
          С++11 IAR ARM, насколько я помню, поддерживает. STL, new и т.д. — все работает.
          Просто, если используете динамическую память, то теоретически она станет со временем фрагментированной, вы не сможете выделить большой кусок памяти, и программа упадет. С этим можно жить во многих случаях, ведь любая программа на самом деле может зависнуть и её перезагрузит Watchdog. Уменьшить фрагментацию можно, если использовать аллокацию и деаллокацию памяти только в вызовах функций. Чтобы, когда функция завершилась, все выделенные участки памяти, все объекты были удалены. Например, пришла вам строка из UART. Вы в функции ParseString её разбираете с помощью std::string, std::vector и т.д. А возвращаете результат в главный цикл в виде объекта фиксированного размера, размещенного на стеке.
            0
            Можно, но на стандартных библиотеках GCC оно отжирает просто фантастические объёмы RAM и ROM под свои нужды. Поэтому — лучше статическое определение классов и их методов.
            Вот, как пример такого использования (пока ещё очень сырой вариант, не допиленный до полной инкапсуляции констант и прочего в классы) — github.com/andreili/STM32FX_FM/blob/master/Examples/STM32F4DISCOVERY/src/main.cpp
              0
              С С++ все очень хорошо. Выше уже написали про динамическую память. Я же добавлю, что семантика перемещений (С++11) позволяет создавать классы, описывающие регистры, прерывания, и прочее железо с очень читабельным и удобным синтаксисом. Посмотрите, например, github.com/den-makarov/stm32asyn
              Это достаточно мощная С++11 библиотека (на базе HAL), которая в первую очередь предназначена для реализации фонового (через DMA) асинхронного ввода-вывода. Есть SPI, USART, ADC, SDIO. Единственное ограничение — она отлажена пока только на STM32F4. За счёт того, что все железо описывается и инициализируется в одном месте, поддерживается динамическая смена тактовой частоты контроллера. Есть очередь событий, которые генерируются по прерываниям. То есть асинхронные операции через DMA генерируют прерывания, они, в свою очередь, события, а основной поток уже занимается обработкой и диспетчеризацией событий. И все это на С++. Присоединяйтесь!
            0
            Что мне не нравиться в Cube (прошу прощения за эмоции):
            1. Если мне нужна только LL библиотека, всё равно получу смесь HAL и LL, даже если выбирал только LL.
            2. Нет возможности выбрать только FreeRTOS без CMSIS RTOS API. (в CMSIS RTOS нет например streaming buffer)
            3. При включении прерывания по UART, включаеться только NVIC, а для UART нужно вллючать вручную.
            4. Нет возможности отказаться от Timebase Source. Если у меня RTOS и я получаю тик от SysTimer, ну нахрена мне в системе два таймера с прерыванием 1ms (от Timebase Source и SysTimer)
            5. Cube генерирует Debug код с оптимизацией по размеру.

            Знаю, что можно потом удалить ненужное.
              0
              А про libopencm3 что скажете?
                0
                На мой взгляд лучшая С++ библиотека-обёртка для контроллеров Cortex-M.
                  0
                  У меня самые хорошие впечатления от libopencm3, один из хобби-проектов (stm32-BASIC микрокопьютер) делал именно на этой библиотеке. Сейчас задумался о переносе st32-BASIC под Atollic
                  0
                  А мне в Кубе не нравится новый дизайн, особенно когда приходится работать на ноутбуке. Первый вариант был логичнее и удобнее.
                    0
                    С этим трудно не согласится.

                    Для тех кто не знает с чего начать, можно заглянуть сюда.
                    0
                    STM32 fast start. Часть 3 Hello World на LL

                    А что под LL тут имеется ввиду?
                      0
                      А что под LL тут имеется ввиду?

                      Low-Layer API. Ниже уровнем чем HAL, но выше CMSIS (но неточно).
                      0
                      «Программа прошивальщик (она же пригодится для полного стирания запоротого контроллера, подробнее о процедуре можно почитать ЗДЕСЬ).»
                      А куда это «ЗДЕСЬ» ведет — не рассказано.
                        0
                        Да, извините, выпало из данной части.
                          0
                          судя по этому документу они вровень идут.
                          Я правильно понимаю что этот LL теперь только из куба вытаскивать?
                            0
                            ошибся веткой, это комментарий сюда
                        0
                        Не знаю пока, как именно вы собираетесь реализовывать Hello World, но ИМХО обмен несколькими символами с юзером — не лучшее средство тестирования средств разработки для MK. Чтобы можно было их сравнивать, следовало бы задействовать, как минимум, прерывания, таймеры и пару-тройку интерфейсов, например, USB, SPI и I2C. Вот тут-то и вылезло бы, к примеру, что для LL обработчик прерывания нужно полностью писать самому, а для HAL достаточно написать callback (который, однако, будет вызываться громоздким HAL-обработчиком).
                          0
                          В мире микроконтроллеров «Hello World» – это изменение состояния GPIO(например мигание светодиодом).
                            –1
                            Неужели ещё один 32-битный моргунчик, в цикле из нескольких статей? Печально…
                          0
                          Получилось помигать светодиодом на «голубой таблетке». У меня вопрос-пожелание автору: можно ли в следующих статьях обсудить вопрос о том, как размещать файлы проекта в GIT репозитории? В том же «stm32_hello_world» проекте куча файлов, но все ли их надо размещать под GIT-контроль?
                            0
                            Статья начиналась обсуждением вопросов быстроты разработки, тяжеловесности проектов и проч.
                            Это было реально интересно. И согласен на все 100 с автором, что все спорщики по своему правы. Просто надо применять под свои требования свои принципы (библиотеки) разработки.
                            А две трети статьи — это реально нормальный туториал. Мне кажется в одной статье автор постарался вместить две и решить две проблематики. Я бы разбил на разные ветви.
                            Но в целом респек за непредвзятый взгляд!
                              0
                              Ну с такой скоростью выпуска остальных частей ST успеет заменить нас ИИ и курс станет не актуальным
                                0
                                было бы здорово
                                  0
                                  Ну а если без юмора, когда же продолжение?
                                    0
                                    Честно, пока нет на это времени. Будет чуть посвободнее с заказами — обязательно напишу. Вторая часть уже в 50% готовности. Есть все скриншоты, но некогда набить текст.
                                0
                                Ну когда же продолжение сериала!? Интересно же что будет дальше!

                                Кубик — это конечно хорошо, сам использовал для быстрого запуска макета. А потом обновил кубик и пересобрал проект т.к. изменил назначение выводов. И генератор на внешнем кварце перестал работать, только внутренний. И не работал до следующего обновления кубика. Это к тому что ошибки в генерируемом коде есть и искать их иногда очень затратно по времени т.к. надеешься что «уж там то все не раз проверили» и в первую очередь шерстишь свой код.
                                  0
                                  Мне статья очень помогла, спасибо!
                                    0
                                    Жду не дождусь ВТОРОЙ части!!!
                                    Очень доходчиво и главное интересно. В планах не было изучения STM32, после прочтения сразу заказал на алиэкспресс STM32F103C8T6, ST LINK V2 был куплен ранее.
                                    Очень бы хотелось в второй части прочесть «ликбез» о линейке STM32, в плане домашнего/хоббийного применения на что ещё в линейке стоит обратить внимание.
                                      0
                                      Очень много по STM32 и не только есть на сайте narodstream.ru
                                        0
                                        С такой скоростью выдачи автором продолжений, вам снова расхочется изучать STM32. Или как тут советуют на народстрим идти. Хотя там как то автор непоследователен весьма, прыгает то CMSIS, то HAL, то блюпил, то нуклео…
                                          0
                                          Попробуйте еще libopencm3. Тут написали очень полезный шелл-скрипт для быстрого старта:
                                          # Start a new libopencm3 based project for Blue Pill STM32F103C8 board.
                                          # Takes project name as a parameter.

                                            0
                                            Нашёл на хабре статью о этой библиотеке. (habr.com/ru/post/304924)
                                              0
                                              Спасибо за статью. Я с этой библиотекой поближе познакомился, когда делал BASIC-компьютер «голубой таблетке».
                                          0

                                          Автор, как мягко вы обошли систему тактирования и тот факт, что процессор запустился на частоте 8мгц, вместо положенных 72 и на внутреннем кварце, а не внешнем, распаянном на плате.
                                          В новой версии куба HSE почему-то не выбирается.

                                            0
                                            UPD: необходимо в разделе RCC сказать источник тактирования… Дебильнейший новый интерфейс куба сбивает с толку.
                                              0
                                              Считаю, что данная статья нацелена больше на показ как собрать первый проект. Про систему тактирования STM можно написать отдельную серию статей, особенно если расписывать в каком случае какой источник лучше применить.
                                                0
                                                Согласен с комментариями выше — статья про «blue pill», было бы разумно сразу включить в статью «правильную» конфигурацию тактирования — на 72 МГц с внешнего кварца 8 МГц.

                                            Only users with full accounts can post comments. Log in, please.