Генерация кода для STM32 (Мигающий светодиод на конечных автоматах)
В этом демонстрационном примере рассмотрена модель Engee для управления цифровым выходом микроконтроллера STM32.
Введение
Цель этого примера - разработать модель Engee для простейшей программы управления цифровым выходом микроконтроллера STM32F446RE с использованием вложенных состояний библиотеки Конечных автоматов Engee.
Также в примере будет показано, как добавить сгенерированные файлы в проект с последующим программированием контроллера в среде PlatformIO для VS Code.
Описание модели
Модель примера, stm32_blink.engee, состоит из двух блоков - блока Chart "Blink" и C Function "GPIO_5_OUTPUT (LED)".
Первый блок реализует управляющий алгоритм - изменение состояния Out на выходе блока, а второй блок инициализирует цифровой канал управления GPIO_5, соединенный с встроенным светодиодом отладочной платы NUCLEO-F446RE, и изменяет его состояние в ходе работы программы.
Диаграмма состояний
Диаграмма состояний, содержащаяся в блоке Chart, включает в себя следующие состояния:
Материнское: "Period_and_Clock" - задаёт период импульсов FullTime (в шагах расчёта модели) для мигания встроенного светодиода и инкрементирует счётчик периода CurrentTime. Дочерние:
"HIGH" - при значениях счётчика CurrentTime, меньших или равных половине периода импульса, формирует высокий уровень сигнала на выходе блока.
"LOW" - при значениях счётчика CurrentTime, больших половины периода импульса, формирует высокий уровень сигнала на выходе блока.
В случае равенства значения счётчика времени периода импульса счётчик сбрасывается в переходе между состояниями "LOW" - "HIGH".
Подключение периферии
Периферия контроллера - GPIO №5, задействованный в этом примере, полностью параметрируется в блоке C Function модели.
В первую очередь следует обратить внимание, что для корректной компиляции в среде разработки используемых в этом блоке функций и структур, необходимо подключить заголовочный файл, содержащий прототипы этих функций и структуры stm32f4xx_hal. В дальнейшем этот файл нет необходимости использовать в проекте для среды разработки - обычно он уже содержится в добавленных библиотеках.
На рисунке ниже показан способ подключения заголовочного файла в блоке C Function.
Во вкладке </> StartCode блока содержатся функции конфигурации и инициализации периферии - цифрового входа/выхода №5, а во вкладке </> OutputCode - функция, выполняемая на каждом шаге расчёта модели - функция установки состояния цифрового выхода.
Дополнительные пояснения по коду, приведённому в блоке C Function, даны в соответствующих комментариях.
Результаты моделирования
Для моделирования алгоритма формирования управляющих импульсов загрузим и запустим модель stm32_blink.engee:
[ Info: Generated code and artifacts: /user/start/examples/codegen/stm32_blink/stm32_blink_code
Созданные в папке stm32_blink_code файлы - заголовочный stm32_blink.h и исходный stm32_blink.c мы и используем далее при сборке проекта.
Сборка проекта
Среда разработки, через которую ведётся сборка проекта и его загрузка в целевое устройство - VS Code с надстройкой PlatformIO. При работе с STM32 в этом примере также используется платформа ST STM32 и фреймворк STM32Cube для PlatformIO. Файл конфигурации проекта PlatformIOplatformio.ini содержит следующие настройки:
После создания нового проекта нужно добавить в него сгенерированные в Engee файлы и файл с кодом основной программы main.c (добавлен в папку примера):
После этого можно перейти к сборке проекта и загрузке программы.
Выполнение модели на STM32
Подключим отладочную плату NUCLEO-F446RE к USB-порту компьютера, после чего в PlatformIO можем наблюдать подключенное устройство. Для корректной идентификации подключения этой платы требуется драйвер ST-Link V2.
После успешного подключения можно перейти к сборке проекта: "PLATFORMIO -> PROJECT TASKS -> nucleo_f446re -> General -> Build". При отсутствии ошибок сборки загрузим скомпилированный код в микроконтроллер: "PLATFORMIO -> PROJECT TASKS -> nucleo_f446re -> General -> Upload".
В результате загрузки программы на отладочной плате можно наблюдать мигание светодиода с частотой 0.5 Гц.
Для демонстрации в примере к соответствующему выводу микроконтроллера был подключен цифровой осциллограф Hantec DSO, осциллограмма выведена в последовательный порт компьютера с помощью оболочки DSO Analyzer. Как можно видеть на рисунке выше, полученный сигнал имеет заданную в модели периодичность и длительность импульса.
Заключение
В данном примере мы рассмотрели разработку модели Engee для простейшей программы управления - мигающего светодиода на микроконтроллере STM32F446RE в составе отладочной платы NUCLEO. Алгоритм реализован при помощи вложенных состояний блока Chart из библиотеки Конечных автоматов Engee и подходит для генерации кода. Рассмотрен процесс встраивания сгенерированных из модели файлов в проект среды PlatformIO для VS Code с последующей сборкой, загрузкой и исполнением на целевом устройстве.