游乐游手机版
首页/AI教程/文章详情

STM32CubeMX AI模型部署流程教程

时间:2026-06-07 15:43
使用STM32CubeMX将AI模型部署到STM32单片机分为模型获取、模型部署和模型使用三环节。模型可通过官方ModelZoo或浏览器搜索获取,部署需在CubeMX中安装X-CUBE-AI扩展包并选择兼容芯片,使用ApplicationTemplate模式添加模型并生成代码。模型调用依赖官方API函数实现初始化和推理,通过重写fputc实现串口输出。

内容简介

本篇教程详细阐述了如何将AI模型成功部署到STM32单片机上,并实现基础的逻辑推理功能。整个流程可划分为三个核心环节:模型获取、模型部署以及模型调用。接下来,我们将逐一拆解每个步骤。

模型获取

在模型部署的初期阶段,你可能还不具备独立训练模型的能力——但这并不要紧,当前的首要目标是“先用起来”,而不是从零开始创造。只要能顺利部署并成功调用模型,这一阶段的任务就算圆满达成。那么,模型从哪里来?主要有以下几种常见途径。

意法半导体官方获取

在STM32CubeMX AI的官方下载页面中,下拉页面即可找到对应的官方模型库。网址如下:

下拉后可以看到STM32 Model Zoo的相关信息,点击“了解更多信息”。

在新弹出的页面中选择“前往Model Zoo”。

随后便跳转到了意法半导体官方在GitHub上提供的模型仓库。

下拉即可找到不同类型的开源模型。

不过,仔细观察就能发现:官方提供的AI模型大多用于图像处理相关操作。这类模型对板载芯片性能要求较高,还需要搭配摄像头模块,更重要的是部署难度不小,对初期学习阶段并不友好。等后期熟练掌握了模型部署流程,或者确实需要做单片机图像处理时,再回来看看这里有没有满足需求的模型。

关于模型下载的网络环境提示

意法半导体的AI模型主要存放在GitHub和Hugging Face这两个国际开源社区。国内用户直接访问时,可能会遇到页面加载缓慢、响应超时或资源无法下载等网络不稳定的情况。

建议在获取这些官方模型时,尽量保持良好的网络环境。如果下载过程中反复遇到超时问题,可以尝试在Gitee(码云)等国内代码托管平台上搜索 STM32 Model Zoo 相关的镜像搬运仓库,这能极大提高模型获取效率。

浏览器搜索获取

现在在各大浏览器中搜索“TinyML”“Edge AI”等关键词,都能找到不少教程。一般情况下,教程中也会提供相应的模型供我们去复现操作。当然,在技术社区和视频平台也能找到相关资源。

模型部署

环境搭建

将AI模型部署到MCU上,有手动和自动两种方式。绝大多数情况下我们会选择自动化部署,这就需要用到STM32CubeMX软件。不过,CubeMX并不能开箱即用,需要在原有基础上做一些额外配置。这里默认大家已经安装好了CubeMX,并且能正常使用它进行单片机程序的初始化操作。

  • 打开软件,在初始界面中选择Help选项,随后在弹出的窗口中选择Manager embedded software packages(或者直接按键盘快捷键Alt+U)。
  • 在新弹出的界面中选择STMicroelectronics选项,在下方的选项框中下拉找到X-CUBE-AI,点开折叠区,选择需要安装的版本,然后点击Install。
  • 至此,基本的AI模型环境搭建操作就完成了。

模型部署流程

单片机型号选择

打开CubeMX,像往常一样创建一个新的MCU工程。来到芯片选型界面后,在左侧的选项栏中一路下拉,最后一栏就能看到对应的AI模型使能选项。勾选它即可开启AI功能。

但如果此时选取的是F1系列的芯片,你会发现对应的选项框变成灰色,无法选择。

这说明CubeMX并不支持对F1系列芯片进行AI模型的自动化部署,主要原因是F1系列芯片性能较弱。但这不代表F1芯片上完全不能跑AI模型——我们可以手动将较小型的模型移植进去,只是操作流程会复杂很多。

模型选择与部署

  1. 例如,使用正点原子的F7系列开发板。工程创建后,通过图形化界面对项目进行一系列初始化操作。

  2. 当时钟、串口等基础配置设置完成后,就可以进行AI模型部署了。在图形化界面中选择Software Packs,并在弹出的选项框中选择Select Components(或者直接按Alt+O快捷键)。

在弹出的新窗口中进行模型功能的使能和添加工作——在对应的选项框中打勾,并选择相应的模式。

选择X-CUBE-AI折叠选项中的Core之后,AI功能就被激活了。下面几个选项框对应的是不同的模式,三种模式的应用场景各不相同:

  • SystemPerformance模式:主要用于评估在STM32硬件上的实时性能指标(如推理时间、CPU负载等),适用于部署前的性能分析。
  • Validation模式:用于验证模型转换后的准确性,可在桌面环境或MCU中进行验证,主要检查模型在压缩、量化后的精度损失。
  • Application Template模式:提供AI模型的框架,便于用户添加业务逻辑(如传感器数据采集等),适用于实际落地项目。

根据当前需求,我们不需要做可靠性检测——这部分工作别人已经完成了。我们只需完成模型部署和调用即可,因此选择Application Template模式。

选择成功后,在左侧侧边栏选择最底部的折叠选项卡,在新弹出的选项中选择X-CUBE-AI,然后在右侧窗口中点击Add network,为当前项目添加新的AI神经网络模型。

接下来就可以在新弹出的窗口中对AI模型进行配置了。

当前界面中各选项的作用依次如下:

  • network所在栏:当前AI模型的名称,支持自定义。
  • Keras所在栏:模型文件格式。CubeMX支持三种格式:Keras(后缀.h5)、TFLite(后缀.tflite)、ONNX(后缀.onnx)。使用时注意选择合适的文件类型。
  • Compression:压缩等级。当模型体积较大无法完整写入MCU时,可以用这个选项适当压缩,减少资源消耗。
  • Optimization:优化等级,可对模型进行空间优化和推理时间优化。
  • Validation inputs:验证数据源。选择Random numbers表示使用随机生成的数据进行验证,也可以使用自己准备的数据。
  • Validation outputs:控制验证输出结果的处理方式,这个选项使用频率较低。
  • 下面的ComplexityUsed FlashUsed RAM:在未选择模型时,显示当前MCU的硬件资源。例如图中展示的MCU有1MB Flash和512KB RAM——类比电脑就是1MB磁盘和512KB内存。
  • Analyze:验证当前AI模型能否在MCU上正常运行。如果模型体积过大,这里会出现警告。
  • validate on desktopvalidate on target:分别在PC端和MCU端进行模型可靠性验证。

了解了配置面板的功能后,接下来选择合适的模型类型。本次选用的是后缀为.tflite的模型文件,因此选择TFLite类型。选择完成后点击Browse,在对应文件夹中找到下载好的AI模型。

随后点击Analyze。当结果没有报错时,就代表模型可以正确烧录到MCU中。

从分析界面中可以查看AI模型占用的Flash和RAM等资源。

如果模型占用资源超过了当前选型的芯片,可以尝试使用Compression选项进行压缩。之后点击进入项目配置界面,填写工程名称以及使用的IDE(本次使用MDK-ARM)。

随后点击Code Generator栏目进行相应改进。

最后点击右上角的Generate Code,即可一键生成对应工程。

模型使用

生成文件介绍

项目生成后,用Keil5打开工程,会发现比之前多了一个新文件夹,里面的文件都跟AI模型相关。

所以只需要了解新增文件的内容,就能轻松实现AI模型调用。新增文件中有4个.c文件,每个.c文件对应一个头文件,一共8个文件。不过没必要详细了解每一个文件的内容——这几个文件的作用各不相同:

  • network.c/network.h:文件名与添加模型时自定义的名称一致。其中.c文件存储了模型的结构和接口函数实现代码,.h文件声明了模型的接口函数、宏定义等。
  • network_data.c/network_data.h:存放模型的权重(Weights)和偏置(Bias)等参数,通常是常量数据,存储在Flash中。
  • network_data_params.c/network_data_params.h:这是连接训练好的AI模型与STM32硬件的桥梁,相当于AI模型的数据仓库,AI依赖此文件中的内容才能正常进行推理。

上述文件在开发时有一个共同特点:我们不需要、也不能修改文件中的内容,只需大致了解即可。具体的AI运行逻辑函数大多在app_x-cube-ai.c文件中编写,里面提供了空的模板函数,我们可以在其中完善自己需要的业务逻辑。如果觉得麻烦,也可以直接在main.c中编写对应函数。

代码编写流程

由于CubeMX的AI模型库并不开源,因此要实现AI模型初始化及推理等函数功能,必须调用官方提供的API函数。前面提到,AI模型的函数接口都在network.h中进行了声明,我们可以去该头文件中查找。下面简单介绍几个常用API函数及其功能:

  • ai_network_create:创建模型实例,分配AI模型的基础内存。
  • ai_network_init:初始化模型,设置权重和激活内存。
  • ai_network_run:执行一次推理,并获取输出。
  • ai_network_inputs_get:获取输入缓冲区的指针。
  • ai_network_outputs_get:获取输出缓冲区的指针,用于获取输出。
  • ai_network_get_error:在API调用失败后,获取并清除最近的错误码。

至于如何使用这些API函数,可以参考意法半导体官方提供的操作案例。

看过这些资料后,应该对AI初始化函数和推理过程函数有了大致了解。接下来就尝试动手编写这些函数——为了方便,函数的声明和定义都放在main.c中完成,减少操作流程。

重写fputc函数

本次程序将调用AI模型来实现将对应角度的正弦值通过串口输出到PC端。由于不同MCU的串口引脚不同,为了降低复刻难度,将串口输出统一通过printf函数来实现:

  1. printf函数的底层实现依赖fputc函数,因此只需要重写fputc即可。在此之前,需要先使能一个可以与PC端进行数据收发的串口,确保能正常发送数据后再开始下一步。
  2. 重写部分代码如下,将huart1替换为自己程序中已经使能成功的串口即可:

int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); return ch;}

  1. 在Keil5主界面中点击魔法棒,在弹出的界面中选择Use MicroLIB即可。

AI初始化函数

在初始化函数中,需要实现获取模型参数、创建模型、初始化模型、获取输入输出缓冲区指针等操作。这些操作看起来无从下手,但别忘了前面提到的network.c中官方提供的API函数——我们只需要调用它们即可。具体代码实现如下:

void AI_Model_Init(void) {
ai_error err;
ai_network_params params;
printf("Initializing AI Model...\r");

// 调用参数获取API函数获取AI模型参数
if (!ai_network_data_params_get(¶ms)) {
printf("Failed to get network params\r");
Error_Handler();
}

// 调用创建模型API函数创建模型实例
err = ai_network_create(&network, AI_NETWORK_DATA_CONFIG);
if (err.type != AI_ERROR_NONE) {
printf("AI Model Creation Failed\r");
Error_Handler();
}

// 调用初始化API函数初始化模型
if (!ai_network_init(network, ¶ms)) {
printf("AI Model Initialization Failed\r");
err = ai_network_get_error(network);
printf("Initialization Error\r");
Error_Handler();
}

// 调用对应API函数获取输入输出缓冲区指针
ai_input = ai_network_inputs_get(network, NULL);
ai_output = ai_network_outputs_get(network, NULL);
printf("AI Model Initialized Successfully.\r");
}

AI推理函数

AI推理函数的主要作用是处理输入的角度,并尝试求取它们的正弦值。执行逻辑大致为:

  • 对输入数据进行量化处理,确保所有输入角度都在有效范围内。
  • 将数据量化后传递给AI模型进行计算。
  • 从输出缓冲区中读取数据并进行反量化处理。

具体代码实现如下:

/**
* @brief 运行AI模型进行推理
* @param angle_deg: 输入的角度值(0-360度)
* @retval 模型推理出的正弦值(反量化后的float值)
*/
float AI_Model_Run(int angle_deg) {
ai_i32 batch;
float real_output;

// 角度预处理:将0-360度映射到0-255范围
// 计算:normalized_angle = (angle % 360) × 255 ÷ 360
uint8_t normalized_angle = (uint8_t)((angle_deg % 360) * 255 / 360);

// 量化处理:将0-255范围转换到int8_t的标准范围(-128到127)
// 计算:quantized_input = normalized_angle - 128
int8_t quantized_input = (int8_t)(normalized_angle - 128);

// 将预处理后的数据写入模型输入缓冲区
*((int8_t*)(ai_input[0].data)) = quantized_input;

// 执行模型推理
batch = ai_network_run(network, ai_input, ai_output);
if (batch != 1) {
printf("AI Model Run Failed. Batch: %ld\r", batch);
Error_Handler();
}

// 从模型输出缓冲区读取量化结果
int8_t quantized_output = *((int8_t*)(ai_output[0].data));

// 反量化处理:将量化输出转换为真实的正弦值
/* 使用network.c中定义的量化参数:
* scale = 0.008472006767988205f
* zero_point = 4
* 计算:real_output = (quantized_output - zero_point) × scale
*/
real_output = (quantized_output - 4) * 0.008472006767988205f;
return real_output;
}

main函数调用

完成上述函数后,就可以在主函数中进行调用。首先调用模型初始化函数:

// 初始化AI模型
AI_Model_Init();
printf("Starting AI Mode");

随后在主循环中调用AI推理函数。主循环实现了从0度开始,每隔10度输出一次对应角度的正弦值,主要执行逻辑如下:

  1. 内部循环每隔10度进行一次计算。
  2. 调用AI推理函数计算对应角度的正弦值。
  3. 调用数学库中的正弦函数计算角度对应的准确正弦值。
  4. 计算两种正弦值的误差。
  5. 输出结果。

代码内容如下:

while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// 遍历0-360度,步长为10度,进行正弦值推理验证
for (int angle_deg = 0; angle_deg <= 360; angle_deg += 10) {
// 调用AI模型推理当前角度的正弦值
float sine_value = AI_Model_Run(angle_deg);

// 计算真实的正弦值用于对比验证(使用数学库sinf函数)
float real_sine = sinf(angle_deg * 3.14159265f / 180.0f);

// 计算模型输出与真实值的绝对误差
float error = fabsf(sine_value - real_sine);

// 输出结果
printf("Angle: %d deg -> AI Output: %7.4f, Real: %7.4f, Error: %6.4f\r",
angle_deg, sine_value, real_sine, error);
HAL_Delay(100);
}
printf("\rCycle complete. Starting again...\r\r");
HAL_Delay(2000);
}

观察输出结果

完成上述代码后,点击编译运行,将程序烧录到单片机中。打开串口助手(如VOFA+),连接对应端口,即可看到如下输出:

至此,程序的编写就全部完成了。

总结

综合模型获取及嵌入的整个过程,我们会发现模型的使用并不困难。CubeMX AI已经生成了便捷可靠的API函数,在这个阶段,只需要多进行几次模型下载和使用的操作,熟悉总体流程,后续的学习和开发节奏就能明显加快。

来源:https://blog.csdn.net/2501_93018024/article/details/158392200
上一篇码上飞Vibe Coding实战10分钟搭建餐饮点餐小程序 下一篇OpenCode AI编程保姆级教程从安装到实战效率提升
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Sentieon DNAscope Hybrid长短读长混合分析流程详解评测
AI教程 · 2026-06-07

Sentieon DNAscope Hybrid长短读长混合分析流程详解评测

一、前言 基因组学研究已进入下半场,精度与全面性成为临床诊断及群体研究的核心需求。然而,单一测序技术常常让人陷入选择困境:短读长测序(如 Illumina)准确性高、成本低廉,但在面对结构变异、重复序列和复杂区域时显得力不从心;长读长测序(如 Oxford Nanopore)虽能轻松跨越这些障碍,超

腾讯混元Hy3 preview 295B/21B MoE架构与上下文详解
AI教程 · 2026-06-07

腾讯混元Hy3 preview 295B/21B MoE架构与上下文详解

摘要: 295B 21B MoE 是腾讯 2026 年 4 月发布的混元 Hy3 preview 的核心架构标识。本文解释参数总量与激活参数的含义、MoE 的工作机制、为什么 Hy3 preview 能原生支持 256K 上下文,并说明它在 TokenHub 上的完整能力支持与价格档位。 一、读懂

腾讯云AI业务流架构师训练营重塑编程与业务的新范式
AI教程 · 2026-06-07

腾讯云AI业务流架构师训练营重塑编程与业务的新范式

AI业务流架构师训练营:在腾讯云上重塑编程与业务的新范式 到2026年,企业AI竞争的核心已不再是“拥有AI”,而是“谁的AI业务流架构更为高效”。这一转变彻底颠覆了传统编程模式。对于技术从业者而言,AI业务流架构师已成为舞台中央的关键角色——他们不再仅仅编写代码,而是将业务需求转化为自主运行的数字

推荐一款免费使用谷歌最新NanoBanana 2插件
AI教程 · 2026-06-07

推荐一款免费使用谷歌最新NanoBanana 2插件

谷歌近期推出了重磅更新——NanoBanana2模型正式登场。无论是在知识储备、图像生成质量、推理能力还是主体一致性方面,这一版本都实现了全面升级,堪称当前地表最强的AI生图模型之一。 生成速度直接减半,价格也同步腰斩,性价比表现极为突出。不过,国内用户想直接访问官方渠道依然困难重重,大部分路径都绕

企业生产管理系统选型排行榜
AI教程 · 2026-06-07

企业生产管理系统选型排行榜

企业在进行生产管理系统选型时,往往容易陷入一个常见的思维误区:首先问“哪家功能更全面”。但从实际部署与落地效果来看,真正决定系统价值的,往往不是模块数量的简单堆叠,而是它是否真正贴合实际生产流程、能否支撑高效的跨部门协作、以及是否具备随业务变化持续迭代升级的能力。迈入2026年,制造企业对生产管理系