为 STM32 生成代码(有限自动机上闪烁的 LED 灯)
本演示将介绍用于控制 STM32* 微控制器数字输出的 Engee 模型。
介绍
本示例的目的是利用Engee有限自动机库的嵌套状态,为一个STM32F446RE*微控制器的简单数字输出控制程序开发一个Engee**模型。
该示例还将展示如何将生成的文件添加到项目中,然后在 VS Code 的 PlatformIO 环境中对控制器进行编程。
模型描述
示例模型stm32_blink.engee
由两个模块组成,即Chart
"闪烁 "模块和C Function
"GPIO_5_OUTPUT(LED)"模块。

第一个程序块实现了控制算法--在程序块输出端改变Out
的状态,第二个程序块初始化了与 NUCLEO-F446RE 调试板内置 LED 相连的数字控制通道GPIO_5
,并在程序运行期间改变其状态。
状态图
块Chart
中包含的状态图包括以下状态:

材料:"Period_and_Clock"(周期和时钟)--设置FullTime
脉冲的周期(以模型计算步数为单位),以闪烁内置 LED 并递增周期计数器CurrentTime
。
附属:
- HIGH"(高电平)- 在计数器值
CurrentTime
时,小于或等于脉冲周期的一半,在模块输出端产生高电平信号。 - 低"--计数器值
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
- 内置 LED 的状态:
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
将在项目组装中进一步使用。
项目组装
用于构建项目并将其加载到目标设备的开发环境是带有 PlatformIO 附加组件的 VS Code。在使用 STM32 时,本示例也使用 ST STM32 平台和 STM32Cube 框架的 PlatformIO 。PlatformIO 项目platformio.ini
的配置文件包含以下设置:
[env:nucleo_f446re]。
平台 = ststm32
板 = nucleo_f446re
框架 = 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 -> Build)。如果没有构建错误,则将编译好的代码加载到微控制器中:"PLATFORMIO -> PROJECT TASKS -> nucleo_f446re -> nucleo_f446re -> General -> Upload"。
在调试板上加载程序后,可以观察到 LED 以 0.5 Hz 的频率闪烁。

为演示示例,将 Hantec DSO 数字示波器连接到微控制器的相应引脚,并使用 DSO Analyzer 外壳将示波器图输出到计算机的串行端口。 如上图所示,接收到的信号具有模型中指定的周期和脉冲持续时间。
结论
在本示例中,我们考虑了为一个简单的控制程序开发Engee模型--作为NUCLEO调试板一部分的STM32F446RE微控制器上的闪烁 LED。该算法是利用Engee自动机**库中的嵌套状态块Chart
实现的,适用于代码生成。我们考虑了将模型生成的文件嵌入VS代码的PlatformIO环境项目中,然后在目标设备上进行组装、加载和执行的过程。