Stm32cubemx как работать
Перейти к содержимому

Stm32cubemx как работать

CubeMX и Workbench: создание проекта на базе STM32 с помощью бесплатного ПО

Визуальный графический редактор STM32CubeMX и среда разработки System Workbench for STM32 (краткое обозначение – SW4STM32) – лучший способ быстрой, наглядной, простой в освоении бесплатной разработки системы на базе микроконтроллеров семейства STM32.

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

Сегодня имеется достаточно большой выбор как отдельных инструментов в виде редакторов, компиляторов, отладчиков кода, так и интегрированных систем разработки (IDE). Можно воспользоваться платными пакетами ПО профессионального уровня, однако имеется и достаточный выбор свободно распространяемых средств. Последним принято приписывать ряд недостатков, обусловленных их бесплатностью и включающих ограниченный набор возможностей, недостаточно оперативную поддержку новых версий, избыточность конечного генерируемого кода.

Однако два новых продукта – STM32CubeMX и System Workbech for STM32 – предназначенных для работы с микроконтроллерами STMicroelectronics, выделяются целым рядом несомненных достоинств, призванных обеспечить дальнейшую популяризацию среди разработчиков семейства 32-разрядных микроконтроллеров STM32.

STM32CubeMX – конфигуратор для микроконтроллеров STMicroelectronics

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

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

Тем не менее, при всех отмеченных ограничениях имеющиеся достоинства позволяют с успехом во многих случаях использовать генераторы кода для инициализации МК.

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

Для опытных разработчиков STM32CubeMX (рисунок 1) станет удобной средой со всеми необходимыми для работы интегрированными инструментами. Пакет является частью фирменного программного обеспечения STMicroelectronics STM32CubeMX, призванного облегчить труд разработчиков, сократить длительность исполнения и стоимость проектов.

Рис. 1. Состав STMCubeMX

Рис. 1. Состав STMCubeMX

STM32CubeMX является расширением другого инструмента – MicroXplorer – и состоит из набора модулей многоуровневого встраиваемого ПО. Он обеспечивает удобное и наглядное отображение и конфигурацию внешних выводов и внутренних ресурсов микроконтроллера с созданием на выходе соответствующей программы инициализации на языке С/C++, которая пригодна для последующего дополнения управляющим кодом.

В состав STM32CubeMX входят также программные библиотеки для отдельных серий МК (такие как STM32CubeF7 для серии STM32F7), скачиваемые с сервера производителя при создании первого проекта. Они сохраняются в дисковом пространстве локального компьютера в специальном каталоге под названием репозиторий c возможностью дальнейшего их использования в разнообразных приложениях. Такие библиотеки включают STM32Cube HAL (уровень абстракции встроенного ПО, обеспечивающий максимальную взаимозаменяемость МК семейства STM32), а также согласованный набор компонентов библиотечного ПО MiddleWare (RTOS, USB, TCP/IP и графика). Все утилиты встроенного ПО имеют полноценный комплект примеров (рисунок 2).

Рис. 2. Алгоритм работы STMCubeMX

Рис. 2. Алгоритм работы STMCubeMX

При создании нового проекта STM32Cube предлагает сделать выбор из открывающегося в меню “New Project” перечня контроллеров и плат отладки. Первый шаг включает выбор микроконтроллера из обширного ассортимента компании STMicroelectronics, который бы соответствовал имеющимся требованиям по периферийным возможностям, производительности ядра, объему и типу встроенной памяти, набору периферии. Здесь же можно выбрать плату для отладки проекта.

Удобная система фильтрации моделей позволяет ограничивать отображаемые списки рамками определенных семейств или заданными параметрами, включая поддержку необходимого количества каналов ЦАП и АЦП, Ethernet, USB, CAN, объем массивов встроенной Flash-памяти, RAM, EEPROM и другие возможности.

STM32CubeMX обеспечивает интуитивно понятный, визуальный графический интерфейс с четырьмя закладки для настройки используемого в проекте контроллера: Pinout, Clock Configuration, Configuration и Power Consumption Calculator.

В процессе работы над своим проектом пользователь может конфигурировать и настраивать используемое встроенное ПО. Для этого предлагаются мастер распиновки (назначения выводов), мастер синхронизации (настройки схемы тактирования), калькулятор энергопотребления, утилита конфигурации периферийных модулей микроконтроллера (GPIO, USART и так далее) и набор библиотек (USB, TCP/IP и другие).

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

Конфигурация выводов (Pinout)

После выбора МК на вкладке “Pinout” (рисунок 3) в правом окне визуального интерфейса открывается схематическое изображение всех выводов микроконтроллера с их обозначениями, а в левом окне обозревателя будет доступна конфигурация поддерживаемых периферийных функций и библиотек MiddleWares.

Рис. 3. Рабочий экран STMCubeMX (вкладка Pinout)

Рис. 3. Рабочий экран STMCubeMX (вкладка Pinout)

Clock Configuration

В окне “Clock Configuration” представлено упрощенное схематическое изображение всей системы синхронизации контроллера с источниками сигналов, делителями и мультиплексорами.

На вкладке “Clock Configuratiuon” обеспечена автоматическая конфигурация системы тактирования и часов реального времени в зависимости от выбранных разработчиком источников и требуемой частоты выходного сигнала. Если нет особых требований, можно все оставить по умолчанию, с тактированием от имеющегося в микроконтроллере внутреннего RC-генератора на 16 МГц (HSI RC). Либо можно выбрать один из типов внешнего источника тактирования (HSE). Для этого нужно выполнить настройки во вкладке Peripherals, раздел RCC (reset clock control). А мастер конфигурации тактирования сам автоматически выполнит необходимые настройки в схеме синхронизации внутренних регистров и периферии микроконтроллера. При необходимости он использует встроенную систему PLL (ФАПЧ). Источники, используемые для тактирования и работы часов реального времени, обозначены на рисунке 4 в виде голубых блоков.

Рис. 4. Рабочий экран системы тактирования STMCubeMX

Рис. 4. Рабочий экран системы тактирования STMCubeMX

Configuration

В окне конфигурации STMCubeMX (рисунок 5) отображается конфигурация всех программных компонентов: порты ввода/вывода (GPIO), связь с периферией, межплатформенное ПО (MiddleWare).

Рис. 5. Рабочий экран Configuration

Рис. 5. Рабочий экран Configuration

Активируемые кнопки позволяют выбирать сгруппированные по разделам параметры инициализации компонентов проекта, которые будут включены в создаваемый код инициализации контроллера. Цветные метки на кнопке отражают состояние конфигурации. Зеленый цвет – корректная конфигурация. Желтый – неполная, но функционально действующая конфигурация. Красный – неверная конфигурация.

Все доступные в правой панели элементы сгруппированы по разделам: MiddleWares, Мультимедиа, Управление, Аналоговые функции, Интерфейсы, Система. Выделение отдельных позиций черным шрифтом соответствует их доступности, но не завершенной полностью при рабочем состоянии конфигурации.

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

Power Consumption Calculator

Снижение потребляемой энергии сегодня становится серьезной задачей при создании многих встраиваемых систем и автономных устройств. Чтобы помочь свести энергопотребление к минимуму, STMCubeMX предлагает имеющийся в составе программы калькулятор потребляемой мощности (рисунок 6).

Рис. 6. Рабочий экран калькулятора энергопотребления

Рис. 6. Рабочий экран калькулятора энергопотребления

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

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

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

После завершения настройки проекта (рисунок 7) разработчик генерирует на базе созданной конфигурации программный код на языке С. Он пригоден к использованию с рядом IDE, включая System Workbench for STM32 (SW4STM32) MDK-ARM, EWARM, TrueSTUDIO. Выбор среды IDE доступен через меню: Project → Settings, далее – в окне, раскрывающемся под строкой Toolchain/IDE. В этом же окне доступна для редактирования строка с названием вашего проекта (Project Name) и строка его расположения.

Рис. 7. Настройка генератора проекта в STM32CubeMX

Рис. 7. Настройка генератора проекта в STM32CubeMX

Исходное место расположения для копируемых в проект библиотек (так называемый репозиторий) по умолчанию после установки STMCubeMX находится на диске С в папке «Мои документы». Откуда его (папка “Repository”) при желании можно переместить в любое более удобное для вас место, не забыв при этом сделать соответствующие изменения в настройках программы STM32CubeMX через меню Help → Updater Settings.

Далее, в Project Settings меню “Project” необходимо перейти на вкладку “Code Generator” для того чтобы выбрать необходимые опции генерации. Здесь имеется трехпозиционный переключатель варианта использования библиотек встраиваемого ПО. Наиболее оптимален вариант по умолчанию – копирование необходимых библиотек в папку проекта. Ниже, в группе “Generated Files” следует отметить первую и вторую строки для генерации файлов инициализации МК в форматах “.c” и “.h”, а также для сохранения при повторной генерации прежних файлов в качестве резервных.

При доработке ранее выполненных проектов разработчику остается лишь сделать в нем необходимые дополнения, проверить корректность конфигурации и повторить генерацию финального кода проекта. Для этого нужно в меню “Project” выбрать пункт “Generate Code”, либо Ctrl+Shift+G, или просто нажать соответствующий символ в строке инструментов. Полученный код сохраняется на компьютере и может быть использован в других проектах.

Если все было выполнено без ошибок, проект должен корректно открыться для дальнейшего редактирования в соответствующей среде разработки прикладного ПО. Код инициализации для STM32, генерируемый на языке C, может быть использован с компиляторами IAR, Keil и GCC.

AC6 System Workbench for STM32 – среда для разработки ПО микроконтроллеров STM32

Свободно распространяемая интегрированная среда AC6 System Workbench for STM32, созданная компанией STMicroelectronics совместно с партнерами, предназначена для разработки прикладного программного обеспечения оборудования на основе микроконтроллеров STM32. Пакет базируется на Eclipse\GCC и полностью бесплатен. Сегодня лишь немногие производители микроконтроллеров создают собственные инструменты для разработки встраиваемого ПО, предоставляя эту деятельность сторонним разработчикам, которые, в основном, предлагают коммерческие версии своих продуктов. Хотя параллельно с коммерческими пакетами средств разработки ПО зачастую имеются и бесплатные варианты. Но они имеют скорее маркетинговое предназначение и, как правило, обладают серьезными ограничениями, зачастую мешающими нормальному процессу разработки. Созданная для микроконтроллеров STM32 бесплатная среда “System Workbench” лишена подобных недостатков и позволяет значительно упростить и ускорить разработку прикладного ПО для микроконтроллеров всего семейства STM32.

Важно и то, что весь пакет SW4STM32 может быть бесплатно загружен с веб-сайта www.openstm32.org, который также включает форумы, блоги и обучающие курсы для технической поддержки разработчиков. Все ресурсы сайта становятся полностью доступными сразу после регистрации пользователя. AC6 System Workbench for STM32 не имеет каких-либо ограничений и отличается удобным в настройке и работе визуальным интерфейсом.

Особенности Workbench for STM32:

  • всеобъемлющая поддержка микроконтроллеров STM32 и плат для разработки Nucleo, Discovery;
  • встроенное ПО для конфигурации STM32 (Standard Peripheral library или Cube HAL);
  • свободный компилятор GCC C/C++;
  • свободный отладчик GNU;
  • работа на платформе IDE Eclipse;
  • совместимость с плагинами для Eclipse;
  • поддержка ST-Link;
  • отсутствие ограничений по размеру исполняемого кода;
  • поддержка Windows, Linux, OSX.

Новый программный инструмент для STM32 имеет и другое, рабочее название – SW4STM32. Он выполнен на основе набора плагинов к популярной среде разработки Eclipse. SW4STM32 может поддерживать программирование многоядерных асимметричных однокристальных систем (SoC), например, Cortex-A и Cortex-M.

System Workbench for STM32 может устанавливаться для работы под Windows или Linux как в качестве дополнения к Eclipse, так и в виде отдельно устанавливаемого пакета. Оба варианта можно свободно скачать на сайте http://www.openstm32.org/ сразу после регистрации.

В среде SW4STM32 обеспечена всесторонняя поддержка микроконтроллеров STM32, оценочных плат и комплектов Nucleo и Discovery с набором периферии, а также библиотек ПО (Standard Peripheral library и Cube HAL). На рисунке 8 схематично представлен состав компонентов SW4STM32 и принцип их взаимодействия.

Рис. 8. Архитектура System Workbench for STM 32

Рис. 8. Архитектура System Workbench for STM 32

SW4STM32 включает в себя все инструменты, необходимые для успешной разработки, и может легко интегрироваться с плагинами для Eclipse. Для работы с периферийными задачами в состав SW4STM32 включены библиотеки SPL и HAL, могут использоваться пользовательские библиотеки, стек USB и RTOS. В составе SW4STM32 имеется встроенный отладчик.

При создании нового проекта вы определяете используемый МК и стандартную плату, с которой намерены работать, либо используете собственный разрабатываемый макет. После этого Workbench for STM32 автоматически извлекает и конфигурирует необходимое встроенное ПО, используя для работы с периферией библиотеки в прежнем формате StdPeriph или новом – HAL. Созданный код инициализации C или C++ готов для редактирования, компилирования и отладки.

Установка System Workbench for STM32

IDE System Workbench for STM32 может быть установлена на платформы: Linux и Microsoft Windows – Vista и более новые версии. При этом на компьютере уже должен быть установлен пакет Java SE JRE 7 или более новые варианты. Минимальные аппаратные требования к компьютеру: 1 Гбайт RAM и 2 Гбайт свободного дискового пространства.

Рассмотрим процесс установки подробнее. Как известно, при этом имеются два варианта. Первый – когда System Workbench for STM32 состоит из набора плагинов для интегрированной среды разработки Eclipse (Juno или Kepler), и ее можно установить поверх этой платформы.

Второй вариант предусматривает отдельную IDE – System Workbench for STM32. Причем вначале предлагается скачать программу-инсталлятор в виде исполняемого файла. Последнюю версию install_sw4stm32_win_64bits-latest.exe всегда можно получить на официальном сайте.

Также необходимо учесть установку драйвера для соединения и работы через интерфейс ST-Link при отладке проекта в составе платы с программатором.

Если после запуска скачанного файла появляется сообщение об отсутствии необходимой версии Java – необходимо нажать “Ok” для того, чтобы система вышла на сайт Oracle для загрузки последней версии Java. Дальнейший процесс установки – достаточно стандартный. В качестве места установки по умолчанию предлагается корневая директория: C:\Ac6\SystemWorkbench, что рекомендуется принять.

В процессе установки или работы с System Workbench for STM32 не требуется постоянный доступ в интернет. Однако соединение с интернетом понадобится для загрузки с сервера www.st.com библиотек STM32 для контроллеров и плат на первом этапе создания проекта, если вы работаете с этими моделями впервые.

После установки и первого запуска System Workbench for STM32 появляется экран приветствия, закрыв который, мы видим разбитый на несколько рабочих зон графический интерфейс пользователя (рисунок 9). В левой вертикальной панели обозревателя в виде отдельных папок размещаются все элементы создаваемых и открываемых проектов.

Рис. 9. Рабочий экран System Workbench for STM32

Рис. 9. Рабочий экран System Workbench for STM32

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

Впрочем, вид и назначение этой панели можно менять с помощью элементов меню в верхней части, вплоть до полного ее закрытия. Справа, в строке меню основных команд, есть кнопка “Open Percpective”, позволяющая, в дополнение к основному окну С/С++, добавить еще целый ряд вкладок, включая кнопку для переключения рабочего экрана создания проекта С/С++ в режим его отладки (рисунок 10).

Рис. 10. Рабочий экран System Workbench for STM32 в режиме отладки

Рис. 10. Рабочий экран System Workbench for STM32 в режиме отладки

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

Большая панель посредине – это основное поле редактора проекта, в котором создается и редактируется исполняемый код.

Далее рассмотрим практическое применение STM32CubeMX и System Workbench for STM32 в процессе создания простейшего проекта с использованием контроллера STM32, который будет способен управлять мерцанием светодиода, подключенного к одному из выходов МК.

Создание первого проекта

Для решения этой задачи используем МК STM32F746NGH6 в составе отладочной платы STM32F746G-DISCO.

Первым делом создаем проект в STM32CubeMX через меню: File → New Project. В открывающемся окне выбираем контроллер STM32F746NGH6.

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

В нашем простейшем примере мы можем оставить многие настройки по умолчанию, настроив лишь один из портов общего назначения для ввода-вывода (GPIO) во вкладке “Pinout”. Для решения нашей задачи выберем PI1.

Для того чтобы использовать светодиод, подключенный к выводу PI1, нам необходимо выбрать для этого порта режим работы GPIO_Out. Быстрее найти PI1 на обширном контактном поле можно, если ввести это обозначение вывода в окно “Find” (рисунок 11). После этого символизирующий вывод кружок на контактном поле МК начнет мерцать. После выбора вывода с помощью левой кнопки мыши раскрывается меню с доступными для него режимами использования. Выбираем необходимый нам GPIO_Output. В результате цвет вывода меняется на зеленый и на нем появляется изображение кнопки.

Рис. 11. Выбор в STM32CubeMХ используемого вывода микроконтроллера

Рис. 11. Выбор используемого вывода микроконтроллера в STM32CubeMХ

На вкладке Pinout нам также необходимо для последующей прошивки МК разрешить работу с программатором. Для этого в окне обозревателя раскрываем строку “SYS” в разделе “Pereripherals”. В раскрывшемся после этого списке, в окне строки “Debug”, выбираем интерфейс отладки “Serial Wire Debug (SWD)”.

На вкладке тактирования все можно оставить без изменений.

Во вкладке “Configuration” после выбора порта PI1 появляется раздел “GPIO”, где мы можем при необходимости выполнить детальную настройку режима работы порта по выходу и создать метку для этого вывода, например, LED.

Пользоваться калькулятором потребляемой мощности на вкладке “Power Consuption Calculator” в данном случае нет необходимости.

На финальном этапе осталось выбрать название и место размещения проекта на диске компьютера, а также уточнить настройки для процесса генерации кода проекта. Для этого заходим в соответствующий раздел меню: “Project → Settings”.

Здесь, во вкладке “Code Generator” нужно поставить недостающие метки в строках раздела “Generated files”, а также разрешить “Enable Full Assert” для HAL Settings и перевести неиспользуемые выводы в режим минимального энергопотребления.

Во вкладке “Project” нужно дать проекту название (например, ledtest), а также можно выбрать удобное место размещения проекта. Будет лучше, если этот каталог совпадет с рабочим каталогом для System Workbench for STM32.

В строке “Toolchain/IDE” необходимо выбрать следующий рабочий инструмент – SW4STM32. В завершение нажимаем “Ok”.

Все созданные настройки можно будет проконтролировать в отдельном файле, создаваемом после запуска команды: Project → Generate Report. А для генерации кода проекта запускаем финальную операцию: Project → Generate Code.

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

Импорт сгенерированного в STM32CubeMX проекта в System Workbench

Открываем “System Workbench for STM32”, с заданием при первом запуске в качестве рабочего пространства каталога, где сохранены рабочие файлы STM32CubeMX. Изменить рабочее пространство можно впоследствии через меню: File → Switch Workspace.

Импортировать созданный в CubeMX проект в окно “Project Explorer” можно через меню: File → Import. В появившемся окне “Import” нужно развернуть раздел “General”, где выбирается строка “Existing Project into Workspace”. После нажатия на кнопку “Next” появляется очередное окно, где в строке “Select root directory” нужно выбрать каталог рабочего файла. В нашем случае это будет C:\workspace\ledtest. После этого в поле “Proejcts:” появляется строка ledtest Configuration и активизируется кнопка “Finish”. После нажатия на нее в окне “Project Explorer” появляется файловая структура импортированного из CubeMX проекта в виде основной папки ledtest Configuration c вложениями (рисунок 12).

Рис. 12. Добавление проекта в SystemWorkbench for STM32

Рис. 12. Добавление проекта в SystemWorkbench for STM32

Настройка проекта для отладки

Теперь наш рабочий код для управления мерцанием светодиода необходимо добавить в файл “main.c”, расположенный в папке “ledtest Configuration\Application\User”.

При этом все дополнительные пользовательские командные строки в этом файле должны размещаться только в промежутке между строками “USER CODE BEGIN x” и “USER CODE END x”. В данном случае добавляем код в структуру оператора “while (1)”.

Для постоянного переключения выходного порта GPIO берем имеющуюся в нашей библиотеке функцию HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin). Найти ее можно через окно обозревателя проектов, открыв папки “Drivers\STM32F7xx_HAL_Driver\stm32f7xx_hal_gpio.c”. Открыв последнюю папку двойным щелчком мыши, мы одновременно раскрываем ее содержимое в центральном окне редактора кода. При этом в правой панели “Outline” появляется удобный перечень ее заголовков для поиска и навигации в центральном окне. Таким образом, мы можем быстро найти функцию HAL_GPIO_TogglePin с кратким описанием здесь же в комментариях. Скопировав отсюда название функции, мы возвращаемся во вкладку “main.c” и вставляем эту функцию в тело оператора “while (1)”, заменив общее описание параметров функции на заданный вывод (1) в составе порта I: (GPIOI,GPIO_PIN_1) (рисунок 13).

Рис. 13. Редактирование “main.c” в “System Workbench”

Рис. 13. Редактирование “main.c” в “System Workbench”

Теперь в процесс переключения нужно добавить задержку, что можно сделать с помощью функции HAL_Delay с аргументом в 500 мс.

На этом создание проектного кода в “System Workbench” завершается. Остается с помощью компилятора получить двоичный файл для отладки созданной программы непосредственно на МК. Не забыв сохранить выполненные изменения в проекте, запускаем компиляцию через Project → Built All (или Control + B). В случае успешного завершения этой операции в структуре папки проекта появляется дополнительная строка “Binaries”. Открыв ее, мы увидим выходной двоичный файл нашего проекта с расширением “.elf”.

Для запуска процесса отладки есть несколько вариантов, включая выделенную кнопку отладки в панели инструментов или F11. Но, для того чтобы любой из них сработал, необходимо в качестве конфигурации отладки указать “As6 STM32 Debugging”. Сделать это можно, в частности, через меню: Run → Debug Settings (рисунок 14), которое доступно через свойства проекта (“Properties”).

Рис. 14. Настройка Run\Debug Settings

Рис. 14. Настройка Run\Debug Settings

Нажимаем кнопку “New” и выбираем из предложенного списка “As6 STM32 Debugging”. Затем через “Ok” закрываем все открытые окна. Если проект к этому времени был скомпилирован, то соответствующий двоичный файл с кодом проекта подключается к конфигурации отладки.

По завершении настройки отладчика можно приступать непосредственно к самому процессу отладки. Но перед этим необходимо к порту USB компьютера подключить плату с контроллером через интерфейс ST-Link. Затем следует убедиться в появлении нашей платы среди подключенной к компьютеру периферии и после этого приступать к отладке.

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

Окно “Debug” позволяет управлять запуском и отладкой программы. В нем отображается фрейм стека для приостановленных потоков отлаживаемой программы. Каждый поток отображается как отдельный узел в общей структуре.

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

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

Заключение

Современные микроконтроллеры, включая предлагаемое компанией STMicroelectronics семейство STM32, обладают высочайшей производительностью и расширенными функциональными возможностями. Они позволяют создавать широкий спектр разнообразных устройств и встраиваемых систем. Однако их освоение порой вызывает определенные затруднения и требует для этого серьезных временных ресурсов. Ускорить и упростить эти процессы помогают новые программные инструменты, в числе которых – STM32CubeMX и System Workbench for STM32. Учитывая свободный доступ к этим инструментам и активную поддержку пользователей со стороны производителей, можно надеяться, что они займут достойное место средств разработки в арсенале специалистов, найдут широкое применение в повседневной практике любителей.

Литература

  1. http://www.openstm32.org/Importing+a+STCubeMX+generated+project?structure=Documentation
  2. http://www.compel.ru/wordpress/wp-content/uploads/2015/11/Webinar_final.pdf
  3. http://www.openstm32.org/System+Workbench+for+STM32?structure=Documentation
  4. http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00104712.pdf.

ST_STM32L4_NE_02_16

Компании Semtech и STMicroelectro­nics вместе развивают технологию LoRa® для «Интернета вещей» (IoT)

Semtech Corporation, ведущий поставщик полупроводников аналоговых и смешанных сигналов, и STMicroelectronics, мировой лидер полупроводниковой электроники, объявили о заключении соглашения по реализации беспроводной радиочастотной технологии дальнего действия Semtech LoRa®. ST намерен использовать эту технологию с ориентиром на операторов мобильной связи, которые заинтересованы в построении крупномасштабных частных сетей. ST присоединится к альянсу компаний LoRa (LoRa Alliance) и сделает опорную разработку решения LoRa на основе своего семейства микроконтроллеров STM32. В дальнейшем планируется разработка микроконтроллеров с интегрированной технологией LoRa, поддерживающей стандартный протокол LoRaWAN™. Semtech и ST будут сотрудничать в интеграции технологии LoRa на несколько платформ, ориентированных на приложения некоторых из бизнес-проектов LoRa.

LoRa Alliance и экосистема LoRa – самый быстрорастущий альянс в секторе IoT, и добавление ресурсов ST поможет стандартизировать LoRa и LoRaWAN по всему миру для IoT-сетей на основе радиочастотных приемопередатчиков малой мощности, работающих на больших расстояниях (LPWAN). Обе компании верят в то, что стандартизация и поддержка мощной экосистемы будут способствовать признанию технологии всеми участниками рынка и достижению прогнозируемых больших объемов выпуска IoT-устройств.

«Успех технологии LoRa послужил толчком для принятия операторами всего мира решения о развертывании национальных сетей LoRaWAN», – заявил Марк Пегулу, вице-президент и генеральный менеджер группы беспроводных продуктов компании Semtech, – «Партнерские отношения с ведущим поставщиком чипов для технологии LoRa, компанией ST, укрепляют уверенность в том, что технология LoRa компании Semtech, протокол LoRaWAN, IP и чипсет станут де-факто стандартом в области беспроводных сетей «Интернета Вещей».

Изучаем STM32. Урок 1. Создание проекта в CubeMX и Coocox IDE (ч1)

Добрый вечер. Пока потянуло немного на писанину напишу ещё один урок. В данном уроке мы сконфигурируем наш микроконтроллер расположенный на плате Discovery, и помигаем светодиодом нажимая на кнопку.
Так как в одной записи нельзя вставить более 20 картинок. Урок будет разбит на части.

Итак. на нашей плате расположены 4 светодиода подключённые анодами к ножкам PD12, PD13, PD14, PD15
и кнопка подключена к выводу PA0. Причём кнопка при нажатии замыкается на +3.3В (напряжение питания).

Итак открываем программу STM32Cube MX и выбираем наш процессор который у нас есть. Далее будут картинки в последовательности и немного где нужно описания. Поэтому если где то что то не подписано, то просто действуйте согласно картинкам

пояаляется наш процессоор с подписаными ножками. Справа, у нас расположена вся периферия процессора. А нажимая на ножки на картинке, мы будем выбирать что это ножка должна делать.
Итак первым делаем настариваем ножки PD12, PD13, PD14, PD15 на выход GPIO_Output

Далее нам нужно настроить ножку PA0 на вход -выбираем GPIO_Input

У нас получается вот такая картинка

тут у нас всё .
далее вверху переходим на вкладку Clock_Configuration, Она нам не нужна на данном этапе, просто посмотрите на схемку. Это система тактирования нашего процессора. В данном случае у нас идёт тактирование от внутреннего источника тактирования — HSI.

Далее переходим на вкладку Configuration
В этой вкладке настраиваются все параметры прерываний, таймеров, портов и так далее. В этом уроке нам нужно просто настроить порты ввода-вывода.

первым настроим порт вводка PA0. Настроим его безо всяких подтяжек, так как все подтяжки к питанию и массе у нас расположены в самой схеме.

Далее настраиваем порты вывода к которым подключены светодиоды.
В этом случае мы должны в выпадающем списке GPIO Pull_UP\PulL_Down — выбираем Pull_UP, так как нам нужно то на светодиод подавать напряжение, они то анодами подключены к контроллеру. Настраиваем так все наши 4 порта вывода.

Далее, ради интереса можем зайти в вкладку NVIC и посмотреть — в ней мы будем настраивать прерывания и т.д. в следующих проектах.

ну и вверху можем нажать на последнюю вкладку — Power Consumption Calculator. В этой вкладке мы можем расчитывать параметры энергопотребления и т.д. Она нам пока не инстересна.

Итак, далее мы должны настроить параметры экспорта нашего проекта. Вверху нажимаем кнопочку Project Settings и попадаем в вкладку настройки параметров

Выбираем экспорт в формате TrueStudio (кому нужно можно выбрать экспорт в Keil либо Iar)

Далее переходим в вкладку Code Generator, и в ней выбираем Copy only necesary library files

На этом первая часть урока заканчивается. Поэтому переходим ко второй части этого урока. —УРОК 1. ЧАСТЬ 2

1. Этапы проектирование ПО для микроконтроллеров STM 32

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

Наш Опыт программирования различных процессоров начиная с архитектуры х86, С51, AVR , Nios II , TigerShark , ну и конечно STM 32, точно нам говорит, что на сегодня почти всё сравнялось, и у всех производителей почти один и тот же подход. Конкретно о подходах и программировании того или иного кристалла и его особенностей мы поговорим дальше, а сейчас просто рассмотрим этапы проектирования и реализации прошивок для микроконтроллеров, который почти одинаков, во многих видах микроконтроллерах с какими то малыми изменениями. Рассмотрим их:

· Выбор языка разработки ( ASM , C , C ++);

· Выбор среды программы: либо это библиотеки, либо ОС.

§ CMSIS RTOS, μC/OS-II , FreeRTOS, Linux, Android и другие ;

Теперь перейдем к компиляторам!

2. Установка компилятора

Самих компиляторов очень много под архитектуру ARM , вот основные и наиболее популярные :

· RealView Development Suite (ARM C/C++ Compiler)

· Keil MDK-ARM (ARM C/C++ Compiler)

· IAR Embedded Workbench for ARM (IAR C/C++ Compiler)

· MULTI IDE for ARM (Green Hills C/C++ Compiler)

· CooCox CoIDE (GCC Compiler)

Мы будем использовать Keil , потому что еще давно к нему привыкли J .

Наш проект мы будем компилировать, и запускать в версии Keil 5.17. Качаем его !

Ссылка – https :// www . keil . com / download / product /.

Или какой нить не ниже 5.Х.

Установив переходим к установке системной вещи под названием CubeMX .

3. STM32CubeMX

Рис. 3.1 Обзор прицепов работы с CubeMX

STM32CubeMX – это генератор инициализационного кода для семейства STM 32, позволяющий автоматически настроить всю периферию, для данного кристалла или сгенерировать инициализационный код для какого-нибудь отладочного набора.

STM32Cube является комплексным программным решением, комбинируя встроенное программное обеспечение элементов MCU на базе программного обеспечения STM32CubeMX. Встроенное программное обеспечение не только охватывает все микроконтроллеры STM32 с высокой переносимостью, драйверов низкого уровня, но поставляется с набором компоненты middleware уровня, такие как RTOS, USB, TCP / IP, файловая система или графика. STM32CubeMX помогает пользователю настроить STM32 MCU (распиновку, цепи тактирования и периферию) и программное обеспечение стеки. Она также может помочь оценить энергопотребление благодаря калькулятору расчета потребляемой мощности. В STM32Cube встроены библиотеки программного обеспечения и STM32CubeMX генератор кода / конфигуратор может быть использован независимо друг от друга, но их полный потенциал достигается когда они используются вместе; как только MCU настроен, Пользователь может генерировать инициализационный C код, основанный на произведённых настройках в STM32CubeMX.

Свои примеры мы будем показать на отладочной плате STM32F429I-DISCO.

Рис. 3.2. Вид отладочной платы STM32F429I-DISCO

Ссылка на страницу STM 32 CubeMX для всех семейств:

Ссылка на страницу STM 32 CubeMX для семейства STM 32 F 4 набор библиотек :

Устанавливаем его и переходим к процессу создания и настройки проекта для STM 32.

** – внизу ссылка на саму программу, а для установки соответствующих библиотек , надо выбрать, соответствующий набор, подходящей для выбранного семейства, мы будем вести изложение на примере семейства STM 32 F 4.

3.1. Начинаем работать с STM32CubeMX

Общие принципы работы в STM 32 CubeMX — создаем проект, выбираем микроконтроллер и нам сразу же предлагается большая схема со всеми выводами выбранного нами контроллера. Нажимая на выводы и заходя в разнообразные меню, мы легко настраиваем как периферию, так и режимы работы каждого конкретного вывода. Сразу же очевидные плюсы — можно наглядно увидеть, какие выводы уже заняты, а какие еще свободны (в крупных проектах — более чем полезная фишка). Как все это работает мы еще увидим на примере, а пока обсудим в общих чертах )

Итак, мы выбрали все нужные нам выводы, ввели все настройки периферии (например, частоты тактирования, режимы работы таймеров….), и STM32CubeMx дает нам возможность сгенерировать соответствующий код. То есть в итоге мы получаем готовый проект, с уже прописанными настройками, с подключенными библиотеками и с готовой инициализацией всей выбранной периферии. Базой для всего этого являются библиотеки CMSIS и HAL. (С CMSIS мы уже давно знакомы, а вот вторая библиотека — это что-то новое. – Здесб надо дать ссылку на статью, где описывается CMSIS SPL HAL )

Библиотека STM32 HAL Driver пришла (пока еще не окончательно) на смену всем хорошо известной библиотеке Standard Peripheral Library (SPL). В принципе, и структура и функции этих библиотек очень схожи, но HAL более заточена под принцип «вызвал функцию и сразу заработало». Для тех, кому не особо хочется возиться с какими-то низкоуровневыми настройками периферии — то что надо ?Естественно, на данный момент библиотека еще «сыровата», есть некоторые недоработки, но с каждым новым релизом ситуация все лучше и лучше.

Перейдем к практике. И тут я решил остановить свой выбор на семействе STM32F4, хотя это не имеет особого значения, поскольку мы всего лишь хотим ознакомиться с функционалом и принципом работы STM32CubeMx. Итак ST предлагают нам во-первых, собственно, сам STM32CubeMx (в скачанном архиве будет .exe файл для установки программы), а также набор библиотек STM32Cube FirmWare F4. Несмотря на почти одинаковые названия архивов на сайте ST — это абсолютно разные вещи. CubeMx — готовый софт для конфигурирования периферии, Cube FW — набор множества библиотек.

3.1.1. Структура STM32CubeF4_FirmWare

И для начала рассмотрим, что же за библиотеки нам предлагаются. Распаковываем архив и начинаем ковырять:

Рис. 3.1.1.1. Структура папок STM 32 CubeF 4_ FirmWare

Рис. 3.1.1.2. Количество примеров для определённых отладочных плат

Рис. 3.1.1.3. Программные компоненты, реализованные в STM 32 CubeF 4_ FirmWare

Рис. 3.1.1.4. Программная архитектура STM 32 CubeF 4_ FirmWare

Архитектура имеет три уровня реализации, которые оисывают свой уровень обстракции:

· Level 0: Этот уровень делится на три подуровня:
• Пакет Поддержки Платформы (BSP): этот слой предлагает набор программных интерфейсов, связанных с аппаратными Компонентами на аппаратных платах (Аудиокодек, I / O расширитель, Сенсорный экран, SRAM драйвер, ЖК драйверы. и т.д …) и состоит из двух частей:

o Компонент: это драйвер, связанные с внешним устройством на плате, и не связан с STM32, драйвер компонент обеспечивает определенные интерфейсы к BSP внешнего компонента драйвера и могут быть перенесены на любую плату.

o BSP драйвер: он позволяет драйверу компонента должны быть связаны с конкретной плате и предоставляет набор удобных интерфейсов. Правило API именования BSP_FUNCT_Action (): напр . BSP LED_Init (), BSP LED_On ()

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

• Уровень Аппаратных Абстракций (HAL): этот слой предоставляет драйвер низкого уровня, и методы аппаратных интерфейсов, чтобы взаимодействовать с верхними слоями (приложения, библиотеки и стеки). Он обеспечивает общий, мульти экземпляр и функционально ориентированные интерфейсы, которые позволяют чтобы разгрузить реализацию пользовательского приложения, предоставляя готовые к использованию процессов. Для примера: для периферийных устройств связи (I2S, UART ) он обеспечивает интерфейсы позволяющие инициализации и настройки периферийного уровня, управлять передачей данных на основе опроса, прерываниями или DMA процессом и управлять ошибками связи с которые могут возникать во время коммуникация. HAL Драйверы API делятся на две категории :

o общие интерфейсы API, которые обеспечивают общие и определенные функции на всех сериях расширения API,

o STM32 который предусматривает конкретные и индивидуальные функции для конкретного семейства или определенной части семейства.

Основные примеры периферийного использования: этот слой содержит примеры основных операций в STM32F4 периферии используя только ресурсы HAL и BSP.

· Level 1: Этот уровень разделен на два подуровня:

• Компоненты промежуточного уровня(Middleware components:): набор библиотек, охватывающих USB Host и библиотеки устройств, STemWin, LibJPEG, FreeRTOS, FatFs, LwIP и PolarSSL. горизонтальное взаимодействие между компонентами этого слоя осуществляются непосредственно путем вызова API, функцию во время работы вертикальная взаимодействие с драйверами низкого уровня осуществляется с помощью специфических обратных вызовов и статические макросы реализованные в интерфейсе библиотеки системных вызовов. Например, FatFs Реализует дисковый ввод / вывод драйвер для доступа к диск MicroSD или USB Mass Storage Класс. Основные особенности каждого компонента промежуточного программного таковы:

o USB Host и Device Библиотеки :

– классы Несколько USB поддерживаются (запоминающих, HID, CDC, DFU, аудио-, MTP) – Поддержка мульти функции пакетной передачи: позволяет отправлять большие объемы данных
без разделения их на макс трансфертов размер пакета.

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

– Включает в себя 32-разрядных выровненные структуры данных для обработки передачи DMA основе в Highspeed Режимы.

– Поддержка мульти USB OTG основные экземпляры из пользовательского уровня через конфигурационный файл (Позволяет работать с более чем одним USB хост / устройство периферии).

– RTOS и Автономная работа

– Связь с низкоуровневым драйвером осуществляется через уровень абстракции, используя

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

o Стек STemWin Графический

– Профессиональные решения для развития GUI на основе EMWIN Segger в решение

– Оптимизированные драйверы дисплея
– Программы для генерации кода и редактирования растрового (STemWin Builder …)

– Стандарт с открытым исходным кодом

– Реализация C для кодирования изображения JPEG и декодирования.

o FreeRTOS

– Стандарт с открытым исходным кодом

– Уровень совместимости CMSIS
– Операция Tickless в режиме пониженного энергопотребления

– Интеграция со всеми модулями STM32Cube Middleware

o FAT файловой системы

– FatFs FAT библиотека с открытым исходным кодом

– Поддержки длинных имен

– Поддержка динамических несколькими накопителями

– RTOS и режимом автономной работы

– Примеры с MicroSD и USB хост-класса запоминающих

o LwIP TCP / IP стек

– Стандарт с открытым исходным

– RTOS и режимом автономной работы

• Примеры, основанные на компонентах Middleware: каждый Middleware компонент поставляется с одним или несколькими примерами (называемых также приложений), показывающие, как использовать его примеры интеграции, которые используют несколько компонентов промежуточного также предоставляются.

· Level 2: Этот уровень состоит из одного слоя, который является глобальным реальным-временем и графическое демонстрации на основе слоя Middleware программного обеспечения, слоя низкого уровне абстракции и приложений, которые используют периферийные устройств для функции поддерживаемых отладочным набором.

3.1.2. Настройка системы в CubeMX

Попробуем создать проект для нашей отладочной платы STM32F429I-DISCO!

Рис. 3.1.2.1. Стартовое окно

Выбираем новый проект – “ New Project “. Сразу же открывается окно с огромным количеством настроек, в котором нам необходимо выбрать микроконтроллер, который мы собираемся использовать в нашем проекте. Я выбрал STM32F429I‑DISCO0. Появляется новое окно:

Рис. 3.1.2.2. Окно выбора либо кристалла, либо отладочной платы

Выбираем закладку Board Selector и видим следующее окно


Рис. 3.1.2.3. Окно выбора либо кристалла, либо отладочной платы с общим описанием платы

Далее двойным щелчком выбираем плату и видим опять новое окно J ))).

3.1.2.1. Окно Настройки кристалла

Рис. 3.1.2.4. Окно Настройки кристалла

В окне на рис. 3.1.2.3. Показаны два поля : 1 – ое , позволяет настроить те или иные регистры в заданные состояния, а справа, во втором окне , задана цоколевка кристалла. Если заметить, то на многих пинах уже заданы определенные настойки. Допустим на пинах PC 14, PC 15 – эти пины определены, как вход и выход для кварцевого резонатора. А ножка PC 1 – определена как SPI и подходит к MEMS датчику. Вот в принципе общие возможности. Так же по нажатию мышки на пин, можно выбрать его настройки, если вы хотите его переопределить! ТО есть всё очень удобно и наглядно, что очень важно, чтоб не сидеть и не писать что где и как ! Очень системный подход!

Рис. 3.1.2.5. Представлены возможные иконки состояния тех или иных регистров

3.1.2.2. Окно Схема тактирования МК

Далее идет закладка “ Clock Configuration “, посмотрим что там! Ну и что Вы видите ?! Красота !

Рис. 3.1.2.5. Схема тактирования МК

Опять же всё очень наглядно и можно менять многие параметры и при этом учитываться допустимые соотношения делителя и умножителя PLL и если вы зададите недопустимые данные то, вам высветиться ошибка!

Переходим к следующей закладке “ Configaration “. В ней мы можем настроить MiddleWare уровень, добавить MiddleWare компоненты а также настроить периферию. Ну я для примера добавил FASTFS , FreeRTOS , и эти элементы добавляться в систему и можно произвести их настройку. В тестовом примере мы пока их не будем использовать. Так же видно что у нас нет никакой аналоговой части. Это связано с етм что в первом окне мы не выбрали ни одного АЦП. Это можно легко сделать перейти на первую вкладку и выбрав какой нить АЦП .

Рис. 3.1.2.6. Настройка конфигурации периферии и MiddleWare компонентов


Рис. 3.1.2.6. Пример выбора АЦП

Для примеры мы просто создадим настройки по умолчания, где нет АЦП и дополнительных компонентов.

Рис. 3.1.2.7. Пример нашего тестового проекта

3.1.2.3. Окно Конфигурация Элементов МК

Следующая закладка, отвечает за расчет мощности рассеивания. Но её мы рассматривать не будет. Посмотрите её сами. А теперь перейдём к самому ответственному это написания кода, включение и управление нашим китом!

3.2. Программируем в Keil

3.2.1. Генерируем инициализационный код, наконец-то

От создания кода нас отделяет, какая то малость.

Рис. 3.2.1.1. Вызываем меню создания инициализационного кода

Откроется окошко, в котором можно выбрать имя и папку вашего проекта. Выбрать компилятор, в данном случае выбираем “ MDK – ARM V 5″ ( Keil v 5. x ). А во второй закладке можно выбрать опции создания вашего кода. Всё, осталось запустить генерацию!

Рис. 3.2.1.2. Опции генерации проекта

Последний штрих это то, что программа позволяет создать отчет о вашем проекте , это делается в том же меню где выбирали генерацию кода, как показано на рис. 3.2.1.1. Сделайте его самостоятельно! Ну а теперь. Будет очень трудно. Так что идите перекусите, подкрепитесь или просто походите вокруг стула, для отвлечения. И снова возвращайтесь к нам. Дальше интереснее.

3.2.2. Начинаем программировать

Заходим в папку с проектом у меня он выглядит так.

Рис. 3.2.2.1. Структура фалов проекта

CubeMX нам создал папку проекта, где уже есть все необходимые файлы для компиляции. Раньше же это надо было делать руками и из общего набора заголовочных фалов и исходников кода, создавать свои сборки. Теперь этого не надо, всё уже в одной папки и рядом! При этом вы можете использовать просто голый CMSIS либо HAL ( дать ссылку на статью, где даеться пояснение на эту тему ).

Ну чтож по приветствуем мир J ))). С учетом того, что в пункте 2, мы произвели установку Keil , заходим в папку MDK – ARM и находим там Проектный файл для Keil , с расширением *.uvprojx запускаем его. У меня он будет называться “Second.uvprojx” (потому что первый у меня не получился ^) .

Рис. 3.2.2.2. Структура проекта

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

· HAL API – функции HAL уровня;

· CMSIS – драйверы низкого уровня ;

· Application / USER – прикладные функции ( main .с, _ it . c – описание обработчиков прерывания и др.) ;

· Application / MDK – ARM – здесь стартап ассемблерный код (файл startup _ stm 32 f 429 xx . s ), в котором указана описание функций обработчиков прерывания и указание на main entry point ( на начальную входную функцию , т.е. функцию main ), функцию, с которой будет грузиться проект.

Мы в последующих статьях рассмотрим больше подробностей , а сейчас просто попробуем написать пару строк для мигания светодиодом, посредством HAL и поймем заключительные моменты для запуска полноценного приложения!

4. Ура мы запустили Keil HAL LED

А сейчас допишем такие строки в код фала main . c

1. int main ( void )

4. /* USER CODE BEGIN 1 */

6. /* USER CODE END 1 */

10. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

13. /* Configure the system clock */

16. /* Initialize all configured peripherals */

19. /* USER CODE BEGIN 2 */

21. /* USER CODE END 2 */

23. /* Infinite loop */

24. /* USER CODE BEGIN WHILE */

27. /* USER CODE END WHILE */

29. /* USER CODE BEGIN 3 */

32. HAL_GPIO_WritePin ( GPIOG,GPIO_PIN_13,GPIO_PIN_RESET );

33. HAL_Delay ( 500 );

34. HAL_GPIO_WritePin ( GPIOG,GPIO_PIN_13,GPIO_PIN_SET );

35. HAL_Delay ( 500 );

42. /* USER CODE END 3 */

Строки с 32 – 35 вставляем в файл main . c .А теперь самый ответственный момент зашьем проект.

5. Заключение

Мы познакомились с необходимым набором элементов для программирования и разработки проектов под МК STM 32 на базе процессоров Cortex – M 4. Познакомились с архитектурой и структурой проекта построенного с использованием CubeMX , с настройками приложения CubeMX . Так же научились и разобрались со структурой проекта в Keil . Ну и конечно создали программу мигания светодиодом, расположенным не плате с использованием функцция HAL . В следующих статьях мы более углублённо и детально разберем создания новых проектов и работы с переферией платы по средством Keil ! Спасибо за внимание !

Name already in use

STM32_tutorials / lesson0_intro_blinkLED / README.md

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink
  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

Lesson 0: A Complete Walkthrough of Board Detail, Software Setup, and Blinking LED.

THIS LESSON Lesson 0: Setup and Blinking LED

In this lesson we’re going to take a detailed look at the STM32 chip and the dev board, learn how to hook it up to the programmer, install required softwares, set up the microcontroller, and finally write our very own «Blink» program!

Bit of warning before we start: This particular lesson is quite a bit of work, and it’s going to take a while. However, this is the most important lesson of them all since it walks you through the entire process in detail. Once you persevere, you can use it on any other STM32 variant you want.

We will be using the STM32F030F4P6 throughout this tutorial series. Out of the hundreds of STM32 variants, this is actually the cheapest and most basic chip available. And here is its specs:

Alt text

Now it might sound counterintuitive to start from the bottom of the line, but I do have some very good reasons:

They are cheap. A single chip is 50 cents, and a compete dev board is only $1.5.

They are simple enough for first timers to get going quickly.

Despite the lowly status, they are still very capable and contain all the basic peripherals we’re going to cover.

All you learned working with this chip also applies to all other STM32 chips, so you can easily step up after you’re done.

Now let’s take a look at the pinout of this chip, taken from the datasheet:

Alt text

Unlike Arduino where pins are referred to by simply a number(pin 1, pin 2. ), GPIO pins on bare microcontrollers like STM32 usually has a port and number associated with them. A port is a set of pins that are organized internally and can be controlled together. In STM32, GPIO ports are named alphabetically starting from A, and each port can have up to 16 pins from 0 to 15.

As a result, GPIO pins on STM32 are named like PXY , which stand for ‘Port X Pin Y’. Due to size limits not all chips will have all the ports, and not every port will have all its 16 pins. In this case, most of the pins are from port A(PA0 to PA14). Port B only has 1 pin(PB1), and Port F has 2(PF0 and PF1).

There are also some non-GPIO pins common to all STM32 chips that are worth mentioning:

Pin name Function
VSS Ground
VDD 3.3V Supply
VDDA Analog supply for ADC and DAC. Usually equal to VDD.
VBAT Battery input for RTC and low-power backups
NRST Active low reset. Pulled up internally.
BOOT0 Boot mode. Low: normal startup, High: run bootloader

That pretty much covers all you need to know for the moment. Let’s move on to the dev board.

By now you should have all three pieces of hardwares ready: the dev board itself, the ST-Link v2 programmer, and the USB serial adapter:

Alt text

Let’s take a closer look at the dev board itself with added annotations:

Alt text

All in all a clean, simple, and versatile little board. Something to note:

All pins have been broken out on the header.

The micro USB connector is for power only, since this chip doesn’t have USB capability.

All STM32 chips run at 3.3V, but are 5V tolerant on digital pins.

Don’t worry about the BOOT0 selector, leave it on the default GND side. (aka normal startup)

Now let’s hook it up to the programmer so we can upload our programs into it. We’re using ST’s SWD debugging interface, which only require 2 wires plus power.

Plug the 4 wires into SWDIO , GND , SWCLK and 3.3V pins on the programmer:

Alt text

And plug the other end accordingly into the programming header on the dev board.

Alt text

That’s it! Hope that wasn’t too hard for you. The programmer also powers the board when it’s plugged in.

We’re doing the development under Windows, as it is the easiest way to get started. Of course you can set up your own toolchain in Linux, but that is going to be later.

There are 3 softwares that you need to install, all of which free:

STM32 ST-LINK utility

A useful utility through which you can view/wipe the flash memory, dump/upload firmwares, adjust chip settings, etc. It also contains the driver for the ST-Link programmer that you just bought.

Go to the official site:

Click the blue «get software» button at the bottom of the page:

Alt text

It will then ask for your name and email. Give it some fake name and generate a fake email to get the download link.

Run the installer, it will ask you to install the driver, click install.

Alt text

After it’s done, plug in the programmer with the board into a USB port:

Alt text

If your wiring is correct, the power LED should light up. The user LED might start blinking too if the seller burned a demo program into it, which is kind of a spoiler, but let’s ignore that for now.

Windows should install some drivers automatically, wait for it to finish. Then open up the STM32 ST-LINK utility you just installed, click the connect button.

Alt text

If the hookup is still correct, the memory content should now appear in the main window:

Alt text

If everything works, congrats! You can move on to the next software now. There are also some tools in the Target menu to play with should you feel adventurous.

STM32CubeMX is an interactive configuration tool and code generator. It lets you set up the microcontroller in a straightforward graphical interface, then generates the initialization code so you don’t have to write any. Pretty neat!

Click me to download STM32CubeMS from this repo.

You can also download it from the official website. But in my opinion they completely butchered the UI in the latest version. I’d rather stick with the old one.

Inside the zip there are 3 copies for different platforms. You’ll want to run the windows one:

Alt text

Click through with defaults. If you don’t have Java it will ask you to install it. After it’s all said and done, we can move on to the third and final software.

Keil is considered one of the «standard» IDEs in embedded development, it has a large community, and offers excellent compiler and debugging tools. And as you would expect, it is non-free. A license costs thousands of dollars, and a 32KB code size limit is enforced otherwise.

There is a silver lining however, as ST provides a free license for all STM32F0 parts with no code size limit at all. The aim is to get more people into STM32, and I guess it’s working.

Anyway, F0 is more than capable for the majority of projects, you can it have up to 100 pins, 256KB flash, and 32KB of RAM. And when you do grow out of the F0 series, you can set up the open source arm-gcc compiler and get rid of the license issue all together.

Go to the offcial link below, fill in the form and download the installer. Again, use a fake identity to protect your privacy:

Click through the installer with default settings. It will take a bit and install some drivers. After the installation is finished it will automatically open the «Pack Installer» and start to download some software packages. Just wait for it to finish, you can see the progress on the bottom right corner.

Alt text

The lists will fill up after it’s done. We can quit the program for now.

Alt text

That’s it! All three program installed. We’re ready to actually start writing our first STM32 program now!

The simple blinking LED is the «hello world» of embedded systems. It’s probably your first Arduino program, and we’re going to do it all over again with STM32. The process involves configuring the chip in STM32CubeMX, generating the initialization code, writing your own code, and compile then upload. This process is the same with any STM32 chips.

Chip Configuration in STM32CubeMX

Selecting Target Chip

Open up STM32CubeMX and click New Project :

Alt text

It might start to check for updates, eventually you’ll end up here:

Alt text

As you can see it’s quite a comprehensive list, and you can browse by series, package, features, cost, etc.

We need to find which chip we’re using, and since we already know the part number STM32f030F4 , we just need to type it in the search box:

Alt text

Double click the listing to select this chip:

Alt text

Now we’re in a nice chip configuration view! On the left side is a list of available peripherals, and on the right side is a illustration of the chip itself. You can zoom in/out using mouse wheel, move it around with left click, and rotate it with the buttons on the toolbar above to suit your needs.

We do need to configure a few peripherals, so let’s begin.

First up we need to enable SWD in order to upload the firmware into the chip. Expand SYS node and check the Debug Serial Wire box:

Alt text

PA14 and PA13 pins are automatically highlighted on the right side, indicating they are being used.

Enable External Clock Source

There is an external crystal oscillator on the dev board, and we’re going to use that to run the chip.

Expand RCC (Reset and Clock Control) node, select Crystal/Ceramic Resonator for HSE.

Alt text

Enable GPIO Output

Finally we need to set a GPIO pin to output. We’re going to use the LED that’s connected to PA4 on our dev board.

Left click on PA4 then select GPIO_Output :

Alt text

This sets the function of PA4 to GPIO Output, after that right click on PA4 again and select Enter User Label to give it a fancy name, I’m calling it USER_LED .

Alt text

That’s all for peripherals! We now have some heady stuff coming up.

A Brief Intro on STM32 Clock Signals

Before the next step, I think it would be a good idea to first get you familiar with various clock signals that STM32 utilizes, so here it goes:

Those clock sources are inside the chips themselves, they are always available, but generally less accurate. Members are:

LSI is uncalibrated and inaccurate, avoid at all cost.

HSI and HSI48 work fine if no precise timekeeping is required, otherwise an external crystal is recommended.

You can also supply 2 clock signals externally for more accuracy:

Clock Frequency Description
LSE Usually 32.768KHz Low Speed External. Used for RTC timekeeping.
HSE 4 — 32MHz High Speed External. Used for system clock

A crystal oscillator is usually utilized for external clocks, as is the case with the dev board we’re using.

Configuring the Clock Tree

We’re ready for the clock tree! Click Clock Configuration tab:

Alt text

Now this is some proper heady stuff. Don’t worry though, I provided a completed set-up below. Follow the yellow path and I’ll explain along the way:

Alt text

The max clock rate for STM32F0 is 48MHz, so we aim to run a 48MHz system clock. However the crystal on our board is only 8MHz, so we need a way to multiply it up to 48MHz. We use the build-in PLL(Phase Locked Loop) to do exactly that, and the multiplied clock is then used as the system clock.

We start from the very beginning of the yellow path. We can see HSE is available since we enabled it earlier. The input frequency is set to 8MHz, you can change it if you’re using a different crystal.

Alt text

Next we encounter a clock divider. 8MHz is already pretty slow so we leave it at 1.

Alt text

Next we run into the PLL source Mux , which chooses which clock goes into the PLL, in this case the HSE.

Alt text

Here inside PLL we choose how many times to multiply the input clock. We have 8MHz and want 48MHz, so 6 it is.

Alt text

Now we arrive at System Clock Mux , which determines what to use to clock the entire system. In this case we pick the 48MHz PLL output.

Alt text

Now the system clock is 48MHz, and is being distributed to a number of system buses and peripherals. There’s no need to worry about the details here, just keep everything under the max frequency and it’ll be fine.

Alt text

That’s pretty much it! I hope it made sense. The clock tree might be more complicated on higher end STM32 chips, but the basic principle still stands.

As an exercise, try figure out how to use the HSI for a 48MHz system clock. Click here to see the answer.

We’re almost there! Click the «Configuration» tab for the, well, configuration view. Here you can adjust the settings of all peripherals that you enabled on the first page. Since we only enabled a GPIO, click the GPIO button.

Alt text

One the new window, select a pin to change its setting.

There actually isn’t much to change in this case, but it would help to get familiar with the options:

Alt text

GPIO Output level: High or Low. The initial output level of the pin.

GPIO Mode: Push-Pull or Open-Drain. In short PP can drive a signal both high and low, while OD can only pull the signal low. Read more here and here.

Pull-up/Pull-down: Read about it here, for output we don’t use any pulls at all.

Maximum output speed: Sets the slew rate of output signal. Leave it to default setting.

Click OK to go back, that was all the configuration done, we can finally generate our code now!

Generating the code

Now we’ll have the STM32CubeMX generate all the initialization code so we don’t have to write any.

To begin click Project menu then Settings :

Alt text

Enter a project name and select its location, select MDK-ARM V5 as our IDE, don’t touch anything else:

Alt text

Go to Code Generator tab, and select Copy only the necessary library files . It’s not strictly necessary but I like to keep it clean.

Alt text

Click OK. If it’s the first time running, it will ask you to download a firmware package, confirm and wait for it to finish.

After all that we finally get to generate the code! Click Generate Code under Project menu:

Alt text

Alt text

You can find the generated code in the folder you selected. The .ioc file is the STM32CubeMX project you’ve been working on, and the MDK project is inside MDK-ARM folder.

Alt text

Anyway, click Open Project to launch the Keil IDE.

Alt text

(Finally) My First STM32 Program

Go through this guide if this is the very first time Keil MDK is running.

After everything’s set up, find and open main.c by expanding the folders and double clicking on the file:

Alt text

Skim through the code, you’ll find the code generator left tons of comment blocks. As a rule:

ALWAYS PUT YOUR CODE BETWEEN /* USER CODE BEGIN */ AND /* USER CODE END */

This way when you regenerate the code after making changes in STM32CubeMX, your own code will be preserved, while everything outside will be overwritten. Let’s take a look at the main() function.

It looks pretty long but mostly just comments. The generated code first does some initialization, then go into a loop doing nothing, as is comparable to the setup() and loop() function in Arduino. Anyway, It’s up to us to write the actual program, in this case Blinking the LED on PA4.

Right away we have a problem: Arduino has digitalWrite() , what do we use here? To answer this question we first need to get to know the library that we’re using.

The STM32 HAL Libraries

STM32 HAL(Hardware Abstraction Layer) library is a open source library written by ST and recommended for all new projects, and is what STM32CubeMX generates. It provides a complete set of APIs that stay consistent throughout the STM32 lines. This simplifies the coding and improves portability.

All the driver files are in project_folder/Drivers/STM32F0xx_HAL_Driver . Each peripheral has their own .c and .h files. The trick here then is simple:

To see what you can do with a peripheral, just look at what functions are available in the corresponding HAL driver files

Usually the .h file is enough, although there are detailed documentation in the .c file too, so try not miss that.

Also you can right click on any function name and select «Go to definition» to see its details

Alt text

Take GPIO in this case for example. First let’s take a look at stm32f0xx_hal_gpio.h. After scrolling down a bit we see:

Alt text

The first 3 looks promising. To see how to use it we look at the details in the corresponding stm32f0xx_hal_gpio.c, there is a general description at the beginning, and you can also search a particular function for its usage.

For HAL_GPIO_WritePin() , we have:

As a result, if we want PA4 to output HIGH (3.3V), we call:

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

And for LOW (0V), we call:

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

That wasn’t too bad was it? And don’t forget you can use this method to find out about other peripherals too.

Now we have the GPIO sorted out, we need a delay function. Every STM32 has a SysTick timer soley for timekeeping, and is usually configured to increment every 1ms. The timing functions are in stm32f0xx_hal.h and stm32f0xx_hal.c. There are quite a lot of code in those two files though, so I’ll just put them here:

For delay you’ll want to call HAL_Delay() . This is equivalent to the delay() function in Arduino, and similarly the argument is in milliseconds.

You can also call HAL_GetTick() to get how long in milliseconds the chip has been running. This is equivalent to the millis() function in Arduino.

That’s all we need for the Blink! In the end we have:

The code sets PA4 to HIGH for 200ms, then sets it to LOW for 200ms. When run in a loop it blinks the LED on PA4.

Now we just have to put it in the loop in main() inside main.c :

I put it between /* USER CODE BEGIN 3 */ and /* USER CODE END 3 */ , you can put it just before /* USER CODE END WHILE */ too. Just make sure it’s in the right place and inside the /* USER CODE */ blocks. Click here to see the finished file.

All that’s left is to compile and upload the program. Press F7 to start compiling, it might take a while for the first time, eventually it will finish:

Alt text

It tells you the memory usage, you can read the details here, but in short, ROM usage = code + RO + RW , RAM usage = RW + ZI . Remember we have 16KB of ROM and 4KB of RAM on this chip.

Press F8 to start uploading the program into the STM32 chip, should take only a few seconds:

Alt text

The program should start running right away, if not try pressing the reset button. Anyway, the result:

Congratulations! This has been a long journey but you’ve finally made it, welcome to the world of 32-bit ARM embedded systems!

Getting started was the hardest part, now that you’ve done it, things are only going to get easier. We’ll cover a few other essentials in the upcoming lessons, but for now go spend a moment to bask in the magnificent radiance of a blinking light on a $1.5 circuit board.

Don’t forget to save your project, but most importantly, always use the Save All button. This saves all the project settings we changed in addition to files.

Alt text

Using External Editor

You can turn on the auto-reload in MDK so changes you made in external editors show up immediately. Click me to see how.

Remember we named our PA4 pin USER_LED in the STM32CubeMX? You might think I forgot about it, but fear not! Take a look at main.h, and you’ll find it generated some custom defines:

As a result, instead of:

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

HAL_GPIO_WritePin(USER_LED_GPIO_Port, USER_LED_Pin, GPIO_PIN_SET);

The result will be the same but the intention is more clear.

You’ll find all your custom names in main.h , try using them to make the code more readable.

Here’s an exercise for you: Instead of using HAL_GPIO_WritePin() , try using the HAL_GPIO_TogglePin() to make the light blink.

Read about its usage in stm32f0xx_hal_gpio.c and see what you can do with it.

The Free MDK License

I mentioned before that Keil MDK has a 32KB code size limit unless you pay for a license, and ST provides a free license for all F0 and L0 parts. Obviously the chip we’re using only has 16KB of flash, so we don’t have to do anything.

But if you do start using larger chips, follow this official guide to activate your MDK for free. Only follow the Activation section since we have already done everything else.

Sometimes STM32CubeMX will update itself, and you need to run it in Administrator mode to finish the process. To do so right-click the icon and select Run as Administrator from the context menu.

And from time to time when you open older version .ioc files, STM32CubeMX will ask you what to do. Always pick Migrate :

Alt text

Now that we have everything set up, the subsequent lessons will be a significantly shorter.

Next up we’ll take a look at setting up UART and print «Hello World» over serial.

If you have any questions, feel free to open an issue or email me at dekunukem gmail com . The former is preferable since it helps other people too.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *