STM32代码生成(有限状态机上的按钮和闪烁LED)
本演示讨论了用于控制STM32微控制器的数字输入和输出的Engee模型。
导言
这个例子的任务是开发一个模型Engee一个相当简单的程序,用于使用嵌套状态和库超转换控制STM32F446RE微控制器的数字输入和输出。 Engee有限自动机。
此演示是stm32(有限自动机上闪烁LED)的示例代码生成的功能开发。
模型描述
示例模型 - stm32_button_blink.engee 它包括三个街区 C Function 配置和连接控制器外围设备:
GPIO_PC13_INPUT (USER_BUTTON)-在程序初始化期间,配置并初始化微控制器的引脚PC13作为输出。 在程序的逐步执行期间,它返回数字输出的状态。PinState. 在NUCLEO-F446RE调试板上,用户按钮*B1"USER"*连接到此引脚。GPIO_5_OUTPUT (LED)-在程序初始化期间,配置并初始化微控制器的引脚PA5作为输入。 在逐步执行的过程中,为其分配一个状态从PinState. 在NUCLEO-F446RE调试板上,一个LED*LD2"GREEN"*连接到此引脚。DELAY-在程序初始化期间,配置和初始化内部定时器SysTick. 在逐步执行期间,它在其帮助下产生延迟。Ts,等于建模步骤。
可配置参数 Ts 由函数定义 PreLoadFunc 在[回调](https://engee.com/helpcenter/stable/modeling/callbacks-engee.html ),并用作模型求解器中的步长,块的输入值 DELAY 和块计算步骤 Pulse Generator.
座 Pulse Generator 模拟仿真过程中调试板上B1按钮的周期性按下。 按压的持续时间为10秒,频率为20秒。 在仿真期间,该块的信号不变地通过数字输入块。
在街区里 Blink 使用状态图实现了用于使LED闪烁的脉冲产生的逻辑。
状态图
在从示例*Stm32的代码生成(在有限自动机上闪烁LED)*中开发状态图时,包含一个父状态,该块 Chart 此示例包含两个父状态,它们之间具有超级转换。
内部变量 FullTime 设置LED闪烁周期的持续时间 - 父状态下的秒数 Period_and_Clock 如果未按下B1按钮并且输入变量 ChangeFreq 等于 ,而 父状态下的秒数 Period_and_Clock_2 在相反的情况下。 当处于父状态时,发生增量,当退出它们时,计数器变量被重置。 CurrentTime.
连接外围设备
与stm32的示例*代码生成(在有限状态机上闪烁LED)*不同,它使用STM32硬件抽象层(HAL)库与外设一起工作,其中外设块根据头文件使用寄存器访问 stm32f4xx.h. 在块的构建选项中 C Functions 此文件正在连接。 文件本身 stm32f4xx.h 位于example文件夹中,仅用于建模和代码生成,无需稍后将其添加到IDE项目中。
在对代码的注释中给出了对外围块代码的其他解释。
模拟结果
为了模拟生成控制脉冲的算法,我们只需按一下按钮即可加载并运行模型。 stm32_button_blink.engee:
if "stm32_button_blink" in [m.name for m in engee.get_all_models()]
m = engee.open( "stm32_button_blink" );
else
m = engee.load( "$(@__DIR__)/stm32_button_blink.engee" );
end
data = engee.run(m);
从获得的仿真数据中,我们将绘制信号图 Blink.Out -内置LED的状态和 Pulse Generator.1 -按钮状态:
using Plots
plotlyjs()
plot(data["Pulse Generator.1"].time,
data["Pulse Generator.1"].value,
label="Переключение частоты", size=(900,300),
lw=2, legend=:topright)
plot!(data["Blink.Out"].time,
data["Blink.Out"].value,
label="Состояние светодиода", lw=2, )
从图表中可以看出,LED的周期性信号是在模型中生成的,频率可以在触摸按钮时改变。
代码生成
我们将从模型中生成代码,以便随后将控制算法加载到微控制器中。:
engee.generate_code( "$(@__DIR__)/stm32_button_blink.engee",
"$(@__DIR__)/stm32_button_blink_code")
在文件夹中创建 stm32_button_blink_code 头文件 stm32_button_blink.h 而原 stm32_button_blink.c 我们在构建项目时继续使用它。
开发环境中的项目准备
构建项目并将其上传到目标设备的开发环境是Vs Code,带有PlatformIO附加组件。 环境和连接配置对应于示例*Stm32的代码生成(有限自动机上闪烁的LED)*中已经描述的配置。
创建新项目后,您需要将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"。
作为加载程序的结果,可以在调试板上观察到频率为1Hz的LED。 按下B1按钮时,LED以2Hz闪烁。
为了在示例中进行演示,将Hantec DSO数字示波器连接到调试板的相应引脚(D13),并使用DSO Analyzer外壳通过计算机的串行端口读取波形。 正如您在上面的动画中看到的,当按下内置按钮时,输出信号的频率加倍。
结论
在本例中,我们研究了Engee模型的开发,该模型用于通过STM32F446RE微控制器上的数字输入信号控制闪烁LED,作为NUCLEO调试板的一部分。 该算法使用嵌套状态和超级块转换来实现。 Chart 来自库Engee有限自动机并适用于代码生成。 开发的模型与Vs Code的PlatformIO环境项目中生成的文件一起嵌入,然后在目标设备上组装,下载和执行。