Документация Engee
Notebook

Генерация кода для STM32 (Мигающий светодиод на конечных автоматах)

В этом демонстрационном примере рассмотрена модель Engee для управления цифровым выходом микроконтроллера STM32.

Введение

Цель этого примера - разработать модель Engee для простейшей программы управления цифровым выходом микроконтроллера STM32F446RE с использованием вложенных состояний библиотеки Конечных автоматов Engee.
Также в примере будет показано, как добавить сгенерированные файлы в проект с последующим программированием контроллера в среде PlatformIO для VS Code.

Описание модели

Модель примера, stm32_blink.engee, состоит из двух блоков - блока Chart "Blink" и C Function "GPIO_5_OUTPUT (LED)".

image.png

Первый блок реализует управляющий алгоритм - изменение состояния Out на выходе блока, а второй блок инициализирует цифровой канал управления GPIO_5, соединенный с встроенным светодиодом отладочной платы NUCLEO-F446RE, и изменяет его состояние в ходе работы программы.

Диаграмма состояний

Диаграмма состояний, содержащаяся в блоке Chart, включает в себя следующие состояния:

image.png

Материнское: "Period_and_Clock" - задаёт период импульсов FullTime (в шагах расчёта модели) для мигания встроенного светодиода и инкрементирует счётчик периода CurrentTime.
Дочерние:

  • "HIGH" - при значениях счётчика CurrentTime, меньших или равных половине периода импульса, формирует высокий уровень сигнала на выходе блока.
  • "LOW" - при значениях счётчика CurrentTime, больших половины периода импульса, формирует высокий уровень сигнала на выходе блока.
    В случае равенства значения счётчика времени периода импульса счётчик сбрасывается в переходе между состояниями "LOW" - "HIGH".

Подключение периферии

Периферия контроллера - GPIO №5, задействованный в этом примере, полностью параметрируется в блоке C Function модели.
В первую очередь следует обратить внимание, что для корректной компиляции в среде разработки используемых в этом блоке функций и структур, необходимо подключить заголовочный файл, содержащий прототипы этих функций и структуры stm32f4xx_hal. В дальнейшем этот файл нет необходимости использовать в проекте для среды разработки - обычно он уже содержится в добавленных библиотеках.
На рисунке ниже показан способ подключения заголовочного файла в блоке C Function.

image.png

Во вкладке </> StartCode блока содержатся функции конфигурации и инициализации периферии - цифрового входа/выхода №5, а во вкладке </> OutputCode - функция, выполняемая на каждом шаге расчёта модели - функция установки состояния цифрового выхода.
Дополнительные пояснения по коду, приведённому в блоке C Function, даны в соответствующих комментариях.

Результаты моделирования

Для моделирования алгоритма формирования управляющих импульсов загрузим и запустим модель stm32_blink.engee:

In [ ]:
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 - состояния встроенного светодиода:

In [ ]:
using Plots
plotlyjs()
plot(data["Blink.Out"].time,
     data["Blink.Out"].value,
     label="Состояние светодиода", size=(900,300),
     lw=2, legend=:topright)
Out[0]:

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

Генерация кода

Сгенерируем код из модели для последующей загрузки алгоритма управления в микроконтроллер:

In [ ]:
engee.generate_code( "$(@__DIR__)/stm32_blink.engee",
                     "$(@__DIR__)/stm32_blink_code")
[ 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. Файл конфигурации проекта PlatformIO platformio.ini содержит следующие настройки:

[env:nucleo_f446re]
platform = ststm32
board = nucleo_f446re
framework = stm32cube

После создания нового проекта нужно добавить в него сгенерированные в Engee файлы и файл с кодом основной программы main.c (добавлен в папку примера):

image.png

После этого можно перейти к сборке проекта и загрузке программы.

Выполнение модели на STM32

Подключим отладочную плату NUCLEO-F446RE к USB-порту компьютера, после чего в PlatformIO можем наблюдать подключенное устройство. Для корректной идентификации подключения этой платы требуется драйвер ST-Link V2.

image.png

После успешного подключения можно перейти к сборке проекта: "PLATFORMIO -> PROJECT TASKS -> nucleo_f446re -> General -> Build". При отсутствии ошибок сборки загрузим скомпилированный код в микроконтроллер: "PLATFORMIO -> PROJECT TASKS -> nucleo_f446re -> General -> Upload".
В результате загрузки программы на отладочной плате можно наблюдать мигание светодиода с частотой 0.5 Гц.

stm32blnk.png

Для демонстрации в примере к соответствующему выводу микроконтроллера был подключен цифровой осциллограф Hantec DSO, осциллограмма выведена в последовательный порт компьютера с помощью оболочки DSO Analyzer. Как можно видеть на рисунке выше, полученный сигнал имеет заданную в модели периодичность и длительность импульса.

Заключение

В данном примере мы рассмотрели разработку модели Engee для простейшей программы управления - мигающего светодиода на микроконтроллере STM32F446RE в составе отладочной платы NUCLEO. Алгоритм реализован при помощи вложенных состояний блока Chart из библиотеки Конечных автоматов Engee и подходит для генерации кода. Рассмотрен процесс встраивания сгенерированных из модели файлов в проект среды PlatformIO для VS Code с последующей сборкой, загрузкой и исполнением на целевом устройстве.

Блоки, использованные в примере