Engee 文档
Notebook

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

此演示展示了Engee模型的开发,用于两位二进制计数器,然后在MIK32nuke v0.3调试板上生成和执行代码。

导言

在此示例中,MIK32NUKE v0调试板用作目标设备。3基于微控制器*[K1948VK018MIK32Amur](https://mikron.ru/products/mikrokontrollery/mk32-amur /)。 Engee开发了一个终端设备的模型,一个两位二进制计数器,并生成了一个C代码。 代码通过PlatformIO扩展从VS Code*编译并上传到微控制器。
内置用户按钮K1用作计数器的输入,内置Led VD3和VD4用作输出。

模型描述

这个例子的模型 - mik32_DI_DO.engee. 在功能上,它可以分为用于连接控制器的外围设备,控制逻辑的块和用于模拟用户的K1按钮的点击的块。

mik32_di_do.png

用于模拟点击自定义按钮的块 - Pulse Generator 在仿真过程中生成频率为1Hz、填充因子为0.5的矩形信号。 座 C Function "PLATE_BUTTON"将此信号传输到计数器子系统而不进行更改。

连接外围设备

要与MIK32控制器外围设备一起使用,该模型包含以下块 C Function:

  • GPIO_INIT -启用GPIO时钟;
  • PLATE_BUTTON -初始化内置用户按钮K1,读取其状态 state;
  • LED_1 -要初始化内置LD1LED,请将状态转移到它 state;
  • LED_2 -要初始化内置LD2LED,请将状态转移到它 state.

联络人 seq 街区 GPIO_INITPLATE_BUTTON 它们专门用于确定函数的执行顺序,这些函数将作为模型代码生成的结果从这些块中获得。
用于与控制器外围设备一起工作并在开发环境中成功编译从模型中获得的代码的插件文件 - 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 位状态被切换以控制Led 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 一个例子。

开发环境中的项目准备

构建项目并将其上传到目标设备的开发环境是Vs Code,带有PlatformIO附加组件。 环境和连接配置在本例中不考虑,因为它们在ресурсах控制器的显影剂。
从示例目录中,我们将传输生成的文件main。c和配置文件到PlatformIO项目。 platformio.ini.

mik32_di_do_ide.png

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

在MIC32上执行代码

将调试板MIK32NUKE V0.3连接到计算机的USB端口,之后我们可以在PlatformIO中观察连接的设备。 需要USB驱动程序才能正确识别此卡的连接。 示例使用驱动程序 libusbK.

mik32_di_do_target.png

成功激活后,我们将继续构建项目。:
"PLATFORMIO->项目任务->mik32v2->常规->构建"
如果没有构建错误,我们会将编译后的代码上传到微控制器。:
"PLATFORMIO->项目任务->mik32v2->常规->上传"

МИК32_DIDO_1080.gif

作为执行从Engee模型生成的代码的结果,能够通过按下内置按钮K1来观察在内置Led VD3和VD4上形成二进制代码。 如您所见,上传的代码再现了两位二进制计数器的操作。

结论

在这个例子中,我们研究了基于K1948VK018MIK32Amur微控制器内置按钮信号控制内置Led的程序的Engee模型的开发,作为MIK32NUKE v0.3调试板的一部分。 该算法是使用块实现的 Chart 来自库Engee有限自动机并适用于代码生成。 开发的模型与Vs CodePlatformIO环境项目中生成的文件一起嵌入,然后在目标设备上组装,下载和执行。