STM32代码生成(在有限状态机上闪烁LED)
本演示讨论了用于控制STM32微控制器数字输出的Engee模型。
导言
此示例的目的是开发Engee模型,用于使用库的嵌套状态控制STM32F446RE微控制器的数字输出的最简单程序。 Engee有限自动机。
该示例还演示了如何将生成的文件添加到项目中,然后在PlatformIO环境中为VS Code编程控制器。
模型描述
示例模型, stm32_blink.engee,由两个块-一个块 Chart "眨眼"和 C Function "GPIO_5_OUTPUT(LED)"。
第一个块实现控制算法-状态改变 Out 块的输出处,并且所述第二块初始化所述数字控制信道 GPIO_5 与NUCLEO-F446RE调试板的内置LED相连,并在程序运行过程中改变其状态。
状态图
块中包含的状态图 Chart,包括以下状态:
母亲:"Period_and_Block"-设置脉冲周期 FullTime (在模型计算步骤中)为内置LED闪烁并递增周期计数器 CurrentTime.
附属公司:
*"高"-用于计数器的值 CurrentTime,小于或等于脉冲周期的一半,在块的输出端产生高信号电平。
*"低"-在计数器的值 CurrentTime,超过脉冲周期的一半,在块的输出端产生高信号电平。
如果脉冲周期时间计数器的值相等,则计数器在"低"和"高"状态之间的转变中复位。
连接外围设备
本例中使用的控制器外设GPIO No.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 我们在构建项目时继续使用它。
建设项目
构建项目并将其上传到目标设备的开发环境是Vs Code,带有PlatformIO附加组件。 使用STM32时,此示例还使用Stm32平台和PlatformIO的STM32Cube框架。 PlatformIO项目配置文件 platformio.ini 它包含以下设置:
``'ini
[env:nucleo_f446re]
平台=ststm32
板=nucleo_f446re
框架=stm32cube
创建新项目后,您需要将Engee中生成的文件和主程序代码文件添加到其中。 main.c (添加到示例文件夹中):
之后,您可以继续构建项目并下载程序。
在STM32上运行模型
将NUCLEO-F446RE调试板连接到计算机的USB端口,之后我们可以在Nucleo中观察连接的设备。 需要ST-Link V2驱动程序才能正确识别此卡的连接。
连接成功后,您可以继续进行项目构建:"PLATFORMIO->PROJECT TASKS->nucleo_f446re->General->Build"。 如果没有构建错误,我们将编译后的代码上传到微控制器:"PLATFORMIO->PROJECT TASKS->nucleo_f446re->General->Upload"。
作为加载程序的结果,可以在调试板上观察到频率为0.5hz的LED。
为了在示例中进行演示,将一个Hantec DSO数字示波器连接到微控制器的相应引脚,示波器使用DSO Analyzer外壳输出到计算机的串行端口。 如上图所示,接收信号具有模型中指定的频率和脉冲持续时间。
结论
在这个例子中,我们研究了最简单的控制程序--STM32F446RE微控制器上闪烁的LED--的Engee模型的开发,作为NUCLEO调试板的一部分。 该算法使用嵌套块状态实现。 Chart 来自库Engee有限自动机并适用于代码生成。 考虑将从模型生成的文件嵌入到Vs Code的PlatformIO环境项目中并随后在目标设备上组装,下载和执行的过程。