Engee 文档
Notebook

MIC32的代码生成(你好,Engee!)

本演示展示了Engee模型的开发,用于在闪烁的LED上以莫尔斯电码传输消息,然后在MIK32NUKE v0.3调试板上生成和执行代码。

导言

在此示例中,MIK32NUKE v0调试板用作目标设备。3基于微控制器*[K1948VK018MIK32Amur](https://mikron.ru/products/mikrokontrollery/mk32-amur /)。 Engee开发了一个模型,用于生成和传递莫尔斯电码编码消息的脉冲。 由于嵌入式编程的"眨眼"程序是第一个"你好,世界!"程序,在这个例子中我们将结合两个程序,调试板的LED会闪烁我们的消息"你好,Engee!". GPIO9用作传输消息的数字输出,调试板中内置的VD3LED连接到它。
代码通过
PlatformIO扩展从VS Code*编译并上传到微控制器。

模型描述

这个例子的模型 - mik32_blink.engee. 街区 C Function -"systemClockConfig"和"HAL_GPIO_WritePin_9"分别用于配置时钟系统并与外设(数字输出)一起工作。 座 Repeating Sequence Stair "序列"生成编码消息-由变量指定的二进制代码序列 Код_Морзе.

mik32_blink_model.png

还有,为了在"序列"块的输出端转换信号,使用数据类型转换块,在这种情况下从 Float64UInt8.

连接外围设备

C Function "systemClockConfig"仅在选项卡上包含有意义的代码 <\> StartCode,其用于配置微控制器频率监视器的时钟子系统。 从该块生成的函数仅在初始化期间被调用。 港口 seq 街区 C Function 它仅用于在代码生成期间建立明确的块序列。 从微控制器的硬件抽象的标准库调用函数MIC32mik32_hal),在外围连接块的代码中使用,在块设置中 C Function "systemClockConfig"头文件附加 mik32_hal_pcc.hmik32_hal_gpio.h. 这些文件包含在子文件夹中 include 的项目。

mik32_blink_include.png

您不需要下载这些文件并将它们连接到VS Code环境中的项目,因为如果环境配置正确,它们已经包含在相应的PlatformIO包中。
内嵌代码原理的详细说明 C Function 在块代码的注释中给出。

序列形成

设置为在[字母表中编码Морзе](https://ru.wikipedia.org/wiki/Азбука_Морзе#:~:text=В стандартном коде Морзе за,%2C между словами — 7 точек.)我们将简化消息"你好,Engee!"-消息"你好"是无线电广播中问候语的常见缩写。 由于它将不断循环重复,我们将在它的末尾添加一个空格。 因此,我们的整个消息现在将是这样的:"你好,ENGEE! ".

莫尔斯电码编码根据以下规则执行:
*持续时间最短的元素是一个点,
*破折号的持续时间等于三个点,
*一个字母中元素之间的间隙与点的长度相等,
*一个单词中字母(符号)之间的间隙等于三个点的长度。,
*单词之间的差距是7点,
*平均传输速率为每分钟~60-140个字母(字符),网点持续时间约为100毫秒。

字母之间的空格在字母的末尾形成。 它也遵循一个4点的空间用于分隔单词。 消息中使用的符号由以下元素序列编码:

<表宽=100%>

符号
摩尔斯电码
二进制代码

D或D $-\cdot\cdot$ 111 0 1 0 1 000 E或E $\cdot$ 1000 G或Z $--\cdot$ 111 0 111 0 1 000 N或H $-\cdot$ 11101000 R或P $\cdot-\cdot$ 1 0 111 0 1 000 Z或Z $--\cdot\cdot$ 111 0 111 0 1 0 1 000 , $\cdot-\cdot-\cdot-$ 1 0 111 0 1 0 111 0 1 0 111 000 $--\cdot\cdot--$ 111 0 111 0 1 0 1 0 111 0 111 000 空格键 0000

将编码消息写入块 Repeating Sequence Stair 点和破折号将分别转换为持续时间为1和3的单位。 间隙将转换为零:元素之间-1个零,字母之间-3个零,单词之间-字母末尾的3个零和4个零空间。

知道消息中字符的所有代码,您可以对整个消息进行编码。:

In [ ]:
Символы = collect("ЗДР, ENGEE! ")
Код_Морзе_скрипт = (Int64)[];

for Итерация in 1:size(Символы, 1)

    if (Символы[Итерация] == 'D')||(Символы[Итерация] == 'Д')
        Код_символа = [1,1,1,0,1,0,1,0,0,0];
    elseif (Символы[Итерация] == 'E')||(Символы[Итерация] == 'Е')
        Код_символа = [1,0,0,0];
    elseif (Символы[Итерация] == 'G')||(Символы[Итерация] == 'Г')
        Код_символа = [1,1,1,0,1,1,1,0,1,0,0,0];
    elseif (Символы[Итерация] == 'N')||(Символы[Итерация] == 'Н')
        Код_символа = [1,1,1,0,1,0,0,0];
    elseif (Символы[Итерация] == 'R')||(Символы[Итерация] == 'Р')
        Код_символа = [1,0,1,1,1,0,1,0,0,0];
    elseif (Символы[Итерация] == 'Z')||(Символы[Итерация] == 'З')
        Код_символа = [1,1,1,0,1,1,1,0,1,0,1,0,0,0];
    elseif Символы[Итерация] == ' '
        Код_символа = [0,0,0,0];
    elseif Символы[Итерация] == ','
        Код_символа = [1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,0,0,0];
    elseif Символы[Итерация] == '!'
        Код_символа = [1,1,1,0,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,0,0,0];
    end

Код_Морзе_скрипт = vcat(Код_Морзе_скрипт, Код_символа);
end

现在变量 Код_Морзе_скриптEngee工作区,我们的编码消息可以传递给模型。

模拟结果

要模拟带有编码消息的闪烁LED,请加载并运行模型 mik32_blink.engee:

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

# передаём для моделирования закодированное в скрипте сообщение -
# таким образом мы заменяем переменную `Код_Морзе`, загружаемую в обратных вызовах
Код_Морзе = Код_Морзе_скрипт

данные = engee.run(m);

从获得的仿真数据中,我们将绘制信号图 Sequence.1 -序列整形器输出:

In [ ]:
using Plots
gr()

plot(данные["Sequence.1"].time, данные["Sequence.1"].value;
     label = :none, st = :step, lw = 2, size = (800, 150),
     title = "ЗДР, ENGEE! ")
Out[0]:

从模拟的图中可以看出,编码的消息是成功并根据指定的规则形成的。 现在,您可以在目标设备上进行代码生成和模型代码执行。

代码生成

我们将从模型中生成代码,以便随后将控制算法加载到微控制器中。:

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

在文件夹中创建 mik32_blink_code 头文件 mik32_blink.h 而原 mik32_blink.c 我们在构建项目时继续使用它。 生成的主程序文件 main.c 它不会在项目中使用。 它已经为开发环境中的代码执行做好了准备。 main.c 位于根文件夹中 mik32_blink 一个例子。

开发环境中的项目准备

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

mik32_blink_ide.png

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

在MIC32上执行代码

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

mik32_di_do_target.png

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

morse_low.gif

作为执行从Engee模型生成的代码的结果,能够观察到由闪烁的LED形成莫尔斯电码编码的消息。

结论

在本例中,我们研究了Engee模型的开发,该模型用于在K1948VK018MIK32Amur微控制器上发出编码消息,作为MIK32NUKE V0.3调试板的一部分。 开发的模型与Vs CodePlatformIO环境项目中生成的文件一起嵌入,然后在目标设备上组装,下载和执行。