Генерация кода для 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
:
if "stm32_blink" in [m.name for m in engee.get_all_models()]
m = engee.open( "stm32_blink" );
else
m = engee.load( "$(@__DIR__)/stm32_blink.engee" );
end
data = engee.run(m);
Из полученных данных моделирования построим график сигнала Out
- состояния встроенного светодиода:
using Plots
plotlyjs()
plot(data["Blink.Out"].time,
data["Blink.Out"].value,
label="Состояние светодиода", size=(900,300),
lw=2, legend=:topright)
Как видно из графика, на выходе управляющего алгоритма формируется периодический сигнал с заданной частотой и длительностью импульсов.
Генерация кода
Сгенерируем код из модели для последующей загрузки алгоритма управления в микроконтроллер:
engee.generate_code( "$(@__DIR__)/stm32_blink.engee",
"$(@__DIR__)/stm32_blink_code")
Созданные в папке stm32_blink_code
файлы - заголовочный stm32_blink.h
и исходный stm32_blink.c
мы и используем далее при сборке проекта.
Сборка проекта
Среда разработки, через которую ведётся сборка проекта и его загрузка в целевое устройство - VS Code с надстройкой PlatformIO. При работе с STM32 в этом примере также используется платформа ST STM32 и фреймворк STM32Cube для PlatformIO. Файл конфигурации проекта PlatformIO platformio.ini
содержит следующие настройки:
[env:nucleo_f446re]
platform = ststm32
board = nucleo_f446re
framework = stm32cube
После создания нового проекта нужно добавить в него сгенерированные в 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 с последующей сборкой, загрузкой и исполнением на целевом устройстве.