Stm32 CubeMx安装和配置Cube.ai教程

Posted 17岁boy想当攻城狮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Stm32 CubeMx安装和配置Cube.ai教程相关的知识,希望对你有一定的参考价值。

目录

前言

下载ST CubeMx IDE

安装过程

配置Cube.AI

Cube.AI背景知识

CubeMX配置Cube.AI

在项目中使用Cube.AI扩展库

验证AI

结尾小谈


前言

Stm32 Cube MX是Stm32公司推出的一款专门为Stm32平台开发的IDE,通过它能够快速构建集成开发环境,与早期的STM32外设库相比,Cube MX更为简单,Cube MX做了更多层的封装,使的用户可以不用太关心MCU底层的实现,通过调用相关API即可完成工作,新手不建议直接使用它,新手可以先从最基本的GPIO口操作,在到外设库,然后在到Cube MX,否则你在开发过程中对底层硬件会浑然不知。

Stm32 Cube MX可以快速构建Stm32开发板的应用程序,同时它内置了许多模块,其中目前已经支持了AI模块:X.Cube.AI,可以在微型MCU上实现AI解决方案,同时支持ONNX、Tensor Flow、Keras神经网络模型转换到Cube.AI上,并且支持模型压缩,以损失精度的方式来换取更小体积的模型。

下载ST CubeMx IDE

首先进入ST CUBEMX下载页面:ST CUBE MX

然后将页面一直往下拉,可以看到“Get Software”,根据你的系统型号选择合适的版本,然后点击“Get Latest”

 在弹出的页面中点击右上角的“ACCEPT”,然后会要求你输入姓名与邮箱地址,邮箱地址记得输入目前可以使用的,因为下载链接会发送到你的邮箱中

 然后你会收到一封来自ST的邮件,点击“Download now”按钮即可进入下载页面,在下载之前建议大家开启代理,ST的服务器在国外,可能会出现网络原因导致下载失败

安装过程

下载完成之后双击打开安装程序,如果电脑文件有权限的话记得以管理员权限打开,否则就会报错

 打开之后会出现如下界面,直接点击右下角的“Next”

 选中“I accept the terms of this license agreement”,然后点击“Next”

 选中下面两个选择框,同意ST的相关协议,然后点击“Next”

 最后一步选中好安装路径然后点击“Next"即可开始自动化安装

配置Cube.AI

Cube.AI背景知识

Cube.AI是ST公司推出的一款针对STM32平台微型MCU的AI推理库,它重写了CNN神经网络中的卷积、池化、全连接层、推理等算法,使其能够在微型MCU上更好的运算。

同时它还支持将Tensor Flow、ONNX的模型转化为Cube.AI模型,除此之外还支持模型压缩,根据你开发板的FLASH大小来进行倍数压缩,这样的压缩会损失精度,但会降低空间,并且有非常可观的倍数选择,如8MB的模型文件,在最大程度上能压缩至1MB以下,并且精准的也不会丢失太厉害,这是Cube.AI的压缩框架。

可以使用Cube.AI在ST上做许多事情,如运动分析、Face ID、物体检测、语音唤醒等等,因为Cube.AI支持的算法非常多,所以也可以运行Keral的高阶算法,SSD的物体识别模型也是可以运行的。

相较于Tensor Flow Lite Micro,Cube.AI更加强大。

CubeMX配置Cube.AI

配置前建议大家开启代理,如果不开启代理的话可能会出现下载失败的情况

在添加好电脑代理之后点击“Help”,然后点击“Updater Settings ...”

 然后选中“Connection Parameters”

 选择“Use System Proxy Parameters”

 然后点击“Check Connection”来检查代理,如果可以正常访问ST服务器按钮图标则会变成“√”

当然你也可以不使用代理,选择“No Proxy”然后在点击“Check Connection”来确认是否可以访问,如果可以那么可以不使用代理

网络没有问题之后回到主页,点击“INSTALL/REMOVE”

 然后点击“STMicroelectronics”

然后选择“X-CUBE-AI”-展开

 选择一个你认为合适的版本,然后点击“Install Now”

然后就可以等待安装完成了,时间取决于你的网络

 

在项目中使用Cube.AI扩展库

在你安装好Cube.AI之后回到主页,点击File-New Project...

在左侧的列表菜单中就可以看到“Artificial Intelligence”,选中“Enable”

选中之后会展开如下界面:

Model:模型类型

Type:导入模型方式

Model:模型文件路径

Compression:压缩等级

你可以根据你的模型类型来选择

选择好了之后点击“Model:Browse”选择你的模型文件

在选择完成之后可以点击Analyze来计算神经网络模型在你的Ram与Flash里的占用是多少,来确认当前的内存是否能够正常运行模型

配置好AI模块之后在MCU列表中选择你的MCU型号,双击创建项目,也可以点击右上角的“Start Project”

然后选择“Software Packs-Select Components”

这里可以看到我们所有的模块,展开刚刚添加的Cube.AI模块 

 

选中“Core”,然后点击“OK”,这样Cube.AI库就添加到我们的项目里了

如果需要增加扩展功能,将“Device Application-Application"选择为“SystemPlatforma”

 然后回到项目主页可以看到多了一个“Software Packs”,将它展开

展开并选中

然后点击“network_1639379038750”,可以看到我们刚刚创建项目时配置的AI模型相关属性信息

你可以点击“Analyze”按钮进行分析模型是否适合在当前的MCU中运行,若模型正确且当前MCU环境适合运行,会显示“✔”,代表当前模型可以在当前MCU上正确运行

然后在点击”Validate on desktop“对模型进行二次验证,可以看到模型的输入类型等信息

 

验证AI

通过刚刚的配置我们的项目中已经添加了AI扩展库,并且已经配置好了,那么接下来我们进行一个简单的验证,就是通过串口输出AI预测结果,根据STM开发板的规律,我们需要先配置时钟,使能总线,因为STM主打低功耗的,在默认情况下总线是不工作的,我们需要配置时钟让其工作。

首先你需要对STM32的时钟总线有所了解,然后要知道你的串口接在哪个总线上,APB1还是APB2,这个请参考你的电路原理图与芯片手册

 根据手册中的HSI RCC以及LSI RCC频率输入到配置界面中,然后程序会自动推导配置出最合适的RCC时钟频率,如下是我的配置

 然后记得在模块中开启它

如果不知道怎么配置可以参考自己的手册,查找相关关键字

然后切换到“Pinout & Configuration”

展开“Connectivity”

选择对应的UART,然后在右侧的Model中下拉框中选中“Asynchronous”

 在里面可以配置你的串口的波特率、停止位等

 点击“GPIO Settings”可以看到PIN脚名是否与原理图中的一致

你可以在左侧的CPU建模中看到PIN脚的引用

然后点击“Project Manager”

配置项目名称与项目存储位置

 注意Toolchin/IDE这里选择“MDK-ARM”,版本选择“V5x”

然后选中“Code Generator”将“Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”选中,将设备文件生成对应的.h与.c文件

 

 然后点击“GENERATE CODE”生成代码

 生成之后我们进入到文件夹中,打开MDK-ARM文件夹

可以看到keil5的工程文件就已经生成了,我们双击打开,注意需要保证你的电脑上已经安装了“Keil5”

项目体系大致是这样的,main文件在"Application/User/Core"中

 我们可以先关注"Application/User/X-CUBE-AI/App"文件

app_x-cube-ai.c是核心接口文件,打开它可以看到对应的API

以下是我展开的代码,我将重点关注的函数整理了出来

//初始化AI Lib库
void MX_X_CUBE_AI_Init(void);
//初始化模型网络
ai_bool ai_mnetwork_init(ai_handle network, const ai_network_params* params)
//运行模型
ai_i32 ai_mnetwork_run(ai_handle network, const ai_buffer* input,ai_buffer* output)

 然后我们在关注“network_1639447327850_data.c”文件,这个文件是与你在cube.ai创建网络时的名称一致的,这个文件主要是获取模型的参数

 这个文件中主要实现了两个函数,分别是获取模块的handle(指向模型BUFF的指针)与params(模型相关属性指针)

//获取handle
ai_handle ai_network_1639447327850_data_weights_get(void);
//获取params
ai_bool ai_network_1639447327850_data_params_get(ai_handle network, ai_network_params* params)

如果想验证模型的正确性,将你的开发板串口与你的电脑连接,然后你可以打开刚刚的cubemx工程,找到cubeai这块选项

使用方法也非常简单,在main函数中添加如下代码:

//初始化usart
MX_USART1_UART_Init();
//获取模型属性
ai_handle hand = ai_network_1639447327850_data_weights_get();
ai_network_params* par = NULL;
if(!ai_network_1639447327850_data_params_get(hand,par))
    printf("error get params\\n");

//初始化cube.ai
ai_mnetwork_init(hand,par);
//声明输入输出层的结构体
//AI_MNETWORK_IN_NUM、AI_MNETWORK_OUT_NUM是cube.ai会根据你模型属性来自动生成的
ai_buffer ai_input[AI_MNETWORK_IN_NUM];
ai_buffer ai_output[AI_MNETWORK_OUT_NUM];
//输入数据
//这里需要注意,ai_input.data是一个void*的类型,使用之前需要先转化,这是为了适应于不同的数据格式,如float、int、char*
ai_i8 *in_data = (ai_i8 *)ai_input[0].data;
in_data[0] = 25;
//推理模型
ai_mnetwork_run(hand,ai_input,ai_output);
//获取输出并打印
ai_i8 *out_data = (ai_i8 *)ai_output[0].data;
printf("%d\\n",out_data[0]);

编写完成之后使用keil5生成bin文件并烧录到程序中就可以了

然后打开串口就可以看到输出了

在使用时如果想获取输入输出层的最大数据池尺寸可以使用“AI_BUFFER_SIZE”获取

示例:

for (ai_size j = 0; j < AI_BUFFER_SIZE(&ai_input[i]); ++j) 
    //xxxx

如果想验证模型的正确性,将你的开发板串口与你的电脑连接,然后你可以打开刚刚的cubemx工程,找到cubeai这块选项

使用此功能需要在添加AILIB库时候将“Application“选上,然后在”Platform Settings“中选择测试UART口就可以了。

配置完成之后需要重新生成代码,重新编译烧录到开发板中。

 

验证方法就是在Network中选择“Validate on target”

 

选择好串口号,点击“OK”

 如果成功可以看到你的模型信息

结尾小谈

你在cube.ai生成的源代码中并没有发现模型BUFF数组,这是因为cube.ai对它进行了封装,你可以在"*_data.c"的文件中可以看到类似这样的数组:

AI_ALIGNED(32)
const ai_u64 s_network_1639447327850_weights_array_u64[ 1 ] = 
  0x41ffbe5c3fe81ca2U,
;

这个数组里包含了使用算法计算出来的一组数字,相当于一个KEY,最后通过它演算可以得出对应的模型数据

你可以看到获取Handle函数时的写法

ai_handle ai_network_1639447327850_data_weights_get(void)

  static const ai_u8* const s_network_1639447327850_weights_map[1 + 2] = 
    AI_PTR(AI_MAGIC_MARKER),
    AI_PTR(s_network_1639447327850_weights_array_u64),
    AI_PTR(AI_MAGIC_MARKER)
  ;
 
  return AI_HANDLE_PTR(s_network_1639447327850_weights_map);
 

它并不是一开始就申请内存来存放模型数据的,先将模型以算法形式计算出一个KEY值,然后保存起来,这样简化了代码行数,然后在调用时生成一个静态内存空间,里面在演算生成完整模型数据,并放入这个空间中。

最后在返回它的指针”AI_HANDLE_PTR“,就是获取这块空间的首指针地址,并转化为ai_handle类型,最后return就拿到这块内存地址的访问空间。

以上是关于Stm32 CubeMx安装和配置Cube.ai教程的主要内容,如果未能解决你的问题,请参考以下文章

STM32CubeMX介绍及安装

STM32CubeMX介绍及安装

cubeIDE开发, stm32人工智能开发应用实践(Cube.AI).篇一

STM32CubeMX(01)基于HAL库点亮LED

开发工具之STM32CubeMX下载安装和界面详解

STM32CubeMX软件工程描述_USART配置过程