4、STM32CubeAI项目创建:在CubeMX中激活AI功能、添加神经网络处理单元(NPU/CPU)、配置RAM和Flash

好,咱们进入实操环节。前面聊了那么多理论,现在该动手了。这一章我带你走一遍STM32CubeMX的项目创建流程,重点是怎么把AI功能“激活”,怎么选NPU还是CPU,以及RAM和Flash怎么分配。

说实话,我第一次用CubeMX做AI项目时,也踩过坑。比如忘了勾选AI扩展包,结果编译出来模型跑不了。嗯,咱们一步步来,别急。

4.1 在CubeMX中激活AI功能

打开STM32CubeMX,新建项目。选芯片时,我建议你直接搜带“AI”后缀的型号,比如STM32H747AI。这类芯片内置了NPU,性能会好很多。

项目创建后,关键一步来了——激活AI功能。你需要在Software Packs里找到X-CUBE-AI,勾选它。这个包就是STM32的AI运行时库,没有它,模型跑不起来。

激活步骤:

  1. 点击Pinout & Configuration标签
  2. 在左侧Software Packs下拉菜单中,选择Select Components
  3. 找到X-CUBE-AI,勾选CoreRuntime
  4. 点击OK确认

这里有个小细节:X-CUBE-AI的版本要跟你的CubeMX版本匹配。我遇到过版本不兼容,编译直接报错。建议用最新稳定版。

4.2 添加神经网络处理单元:NPU还是CPU?

激活AI功能后,你会看到AI选项卡。点进去,第一个问题就是:用NPU还是CPU?

我个人习惯这样选:

  • 有NPU的芯片(比如STM32N6系列):优先用NPU。功耗低,速度快。我做过一个手势识别项目,NPU推理比CPU快了将近10倍。
  • 普通芯片(比如STM32F4系列):只能用CPU。这时候要优化模型,比如量化、剪枝,不然跑不动。
  • 混合模式:有些场景可以部分层跑NPU,部分层跑CPU。但配置复杂,新手不建议尝试。

我的经验:如果你不确定选哪个,先选CPU。等模型跑通了,再切NPU优化。这样调试起来更可控。

在CubeMX里,你只需要在AI选项卡的Runtime设置中,选择TargetCPUNPU。选好后,系统会自动配置对应的驱动和内存映射。

4.3 配置RAM和Flash

模型跑起来,内存是关键。我见过不少新手,模型量化后明明很小,但一跑就死机。为什么?RAM不够。

在CubeMX中,你需要手动分配:

  • Flash:存放模型权重和代码。一般模型文件(.tflite或.onnx)会编译成数组,直接烧进Flash。
  • RAM:运行时存放输入输出数据、中间激活值。这个量往往比模型本身大。

具体配置路径:Project ManagerAdvanced SettingsAI。你会看到类似下面的表格:

内存区域 用途 建议大小
Flash (模型权重) 存储量化后的模型参数 模型大小 + 10% 余量
RAM (激活缓冲区) 推理时的中间张量 模型峰值内存 × 1.5
RAM (输入输出) 存放输入图像/音频和推理结果 根据数据尺寸定

注意:我曾经在一个项目中,模型只有200KB,但RAM峰值需求达到了1.2MB。因为没预留足够空间,程序跑着跑着就HardFault了。后来我加了个内存池监控,才发现问题。所以,配置RAM时,一定要留余量。

配置完成后,点击Generate Code。CubeMX会自动生成初始化代码,包括AI运行时库的调用、内存分配、以及模型加载函数。

你会在生成的main.c里看到类似这样的代码:

/* 初始化AI运行时 */
aiSystemInit();

/* 加载模型到Flash */
AI_MODEL *model = ai_model_create(&network, NULL);

/* 分配输入输出缓冲区 */
AI_BUFFER *input = ai_buffer_create(model, AI_BUFFER_FORMAT_F32);
AI_BUFFER *output = ai_buffer_create(model, AI_BUFFER_FORMAT_F32);

嗯,到这里,项目骨架就搭好了。下一章咱们会往里面塞真正的模型文件,然后跑一次推理试试。

最后提醒一句:生成代码后,别急着改。先编译一次,确保没有错误。我习惯先跑个空模型(全0输入),看系统能不能正常初始化。这叫“冒烟测试”,能省很多调试时间。