Engee 文档
Notebook

为 MIC32(二进制计数器)生成代码

该演示介绍了一个两位二进制计数器的 Engee 模型的开发过程,以及代码生成和在 MIK32 NUKE V0.3 调试板上的执行过程。

简介

在本示例中,使用基于 K1948VC018 MIK32 Amur 微控制器的 MIK32 NUKE V0.3 调试板作为目标器件。用 Engee 开发了最终设备的模型(一个两位二进制计数器),并生成了 C 代码。该代码由 VS CodePlatformIO 扩展编译并加载到微控制器中。
内置用户按钮 K1 用作计数器输入,内置 LED VD3 和 VD4 用作输出。

型号说明

本示例的模型是mik32_DI_DO.engee 。从功能上讲,它可分为用于连接控制器外围、控制逻辑和模拟按下用户按钮 K1 的模块。

mik32_di_do.png

用户按钮模拟块 -Pulse Generator 在模拟过程中产生频率为 1 Hz、填充因子为 0.5 的矩形信号。程序块C Function "PLATE_BUTTON "将该信号传送给计数器子系统,不做任何更改。

连接外围设备

为了与 MIK32 控制器的外设配合使用,C Function : *GPIO_INIT - 用于打开 GPIO 时钟; *PLATE_BUTTON - 用于初始化内置用户按钮 K1,读取其状态state ; *LED_1 - 用于初始化内置 LED LD1,将其状态传输至state ; *LED_2 - 用于初始化内置 LED LD2,将其状态传输至state

模块GPIO_INITPLATE_BUTTON 的触点seq 专门用于定义功能执行顺序,模型代码生成后将从这些模块接收这些功能。 用于控制器外围工作和在开发环境中成功编译从模型获得的代码的插件文件 -mik32_memory_map.h,pad_config.h,power_manager.hwakeup.h 位于当前示例的include 目录中。它们连接在块GPIO_INIT 、标签Build options 中。无需下载这些文件并将其连接到 VS Code 环境中的项目,因为如果环境设置正确,这些文件已经包含在相应的 PlatformIO 包中。

mik32_di_do_headers_2.png

C Function 中嵌入代码的原理详见代码块注释。

二进制计数器

子系统BINARY_COUNTER 中的二进制计数器工作原理如下。从子系统的输入Trigger 到程序块Chart 的信号来自选定的信号前沿 - 按 K1 按钮。在程序块Chart 中,对接收到的信号数量进行计数,计数结果输出到输出输出程序块。计数在 [0; 3] 范围内循环进行。

mik32_di_do_counter_2.png

Multiport Switch 块根据计数器输出信号切换位状态,控制发光二极管 VD3 和 VD4,从而将十进制数编码为二进制数。数字的低位在 VD3 上形成,高位在 VD4 上形成。输出数据类型为无符号 32 位整数(UInt32)。

建模结果

为了模拟两位二进制计数器的运行,让我们加载并运行模型mik32_DI_DO.engee

In [ ]:
if "mik32_DI_DO" in [m.name for m in engee.get_all_models()]
    m = engee.open( "mik32_DI_DO" );
else
    m = engee.load( "$(@__DIR__)/mik32_DI_DO.engee" );
end

    data = engee.run(m);

根据获得的模拟数据,绘制信号图: *PLATE_BUTTON.1 - 按钮的模拟、 *BINARY_COUNTER.VD3 - 输出代码低位的状态、 *BINARY_COUNTER.VD4 - 输出代码高位的状态。 绘制的信号为二进制格式,但为显示清晰起见已按比例缩放。

In [ ]:
using Plots
plotlyjs()

plot(data["PLATE_BUTTON.1"].time,
     data["PLATE_BUTTON.1"].value*0.5,
     label="Сигнал кнопки", lw=1)
plot!(data["BINARY_COUNTER.VD3"].time,
      data["BINARY_COUNTER.VD3"].value*0.99,
      label="Младший бит", size=(900,300),
      lw=3, legend=:topright)
plot!(data["BINARY_COUNTER.VD4"].time,
      data["BINARY_COUNTER.VD4"].value*1.01,
      label="Старший бит", lw=3)
Out[0]:

从模拟图中可以看出,二进制计数器算法运行正常,现在我们可以继续生成代码并在目标设备上执行模型代码。

代码生成

让我们根据模型生成代码,将控制算法加载到微控制器中:

In [ ]:
engee.generate_code( "$(@__DIR__)/mik32_DI_DO.engee",
                     "$(@__DIR__)/mik32_DI_DO_code")
[ Info: Generated code and artifacts: /user/start/examples/codegen/mik32_di_do/mik32_DI_DO_code

mik32_DI_DO_code 文件夹中创建的文件 - 头文件mik32_DI_DO.h 和源文件mik32_DI_DO.c 将在项目装配中继续使用。生成的主程序文件main.c 将不会在项目中使用,而是在main.c 准备的开发环境中执行代码,该环境位于示例的根文件夹mik32_DI_DO 中。

在开发环境中准备项目

用于构建项目并将其加载到目标设备的开发环境是带有 PlatformIO 附加组件的 VS Code。本示例不考虑环境配置和连接,因为控制器开发人员的 resources)有详细说明。
让我们将示例目录中生成的文件、main.c 和配置文件platformio.ini 转移到 PlatformIO 项目。

mik32_di_do_ide.png

之后,您就可以继续构建项目并加载程序了。

在 MIK32 上执行代码

让我们将调试板 MIK32 NUKE V0.3 连接到计算机的 USB 端口,然后在 PlatformIO 中观察连接的设备。要正确识别调试板的连接,需要使用 USB 驱动程序。示例中使用的驱动程序是libusbK

mik32_di_do_target.png

连接成功后,让我们继续构建项目:
"PLATFORMIO -> PROJECT TASKS -> mik32v2 -> General -> Build ".
如果没有编译错误,则将编译好的代码加载到微控制器中:
"PLATFORMIO -> PROJECT TASKS -> mik32v2 -> General -> Upload ".

mik32_dido_1080.gif

在执行从 Engee 模型生成的代码后,可以观察到按下内置按钮 K1 时,内置 LED 指示灯 VD3 和 VD4 上二进制代码的形成。可以看到,加载的代码再现了一个两位二进制计数器的运行。

结论

在本示例中,我们考虑开发Engee模型,用于通过K1948VK018 MIK32 Amur微控制器(作为MIK32 NUKE V0.3调试板的一部分)上内置按钮的信号控制内置 LED 的程序。该算法使用Engee有限自动机库中的块Chart 实现,适合代码生成。开发的模型与生成的文件一起嵌入到VS代码PlatformIO环境项目中,并在目标设备上进一步组装、加载和执行。