2. STM32N6 NPU开发环境搭建

STM32N6 是 ST 首颗集成自研 Neural-ART NPU 的 MCU,其 NPU 算力约 600 GOPS,配合 4.2 MB 片上 SRAM 与外部 PSRAM,可以运行 MobileNet、YOLO 系列等中小型视觉模型。但要让模型真正跑在 NPU 上,第一步不是写推理代码,而是把"模型 → 量化 → 代码生成 → 工程编译"这条工具链搭起来。本节围绕 ST 官方提供的四类工具,说明它们各自的职责、安装方式以及如何协同工作。

一、工具链全景:谁负责什么

很多初学者会把 STM32CubeMX、STM32Cube.AI、X-CUBE-AI 和 ST Edge AI Developer Cloud 混为一谈,实际上它们处在模型部署链路的不同位置:

  • STM32CubeMX:图形化配置工具,负责芯片选型、时钟树、外设(如 OCTOSPI、DCMI、UART)与中间件(X-CUBE-AI)的初始化,最终生成 .ioc 工程与 C 代码骨架。
  • X-CUBE-AI 扩展包:STM32CubeMX 的一个中间件组件,内含 stedgeai 命令行工具与运行时库(Network Runtime),负责把 .tflite/.onnx 模型转成 C 数组并生成推理 API。
  • STM32Cube.AI:早期对 X-CUBE-AI 的统称,现在更多指代"AI 模型部署"这一产品线,包含 CubeMX 内的插件与独立命令行。
  • ST Edge AI Developer Cloud:ST 提供的在线服务,可上传模型,在云端完成量化、基准测试(benchmark)并给出每层耗时、内存占用报告,适合在本地算力不足或需要快速评估模型可行性时使用。

下图给出这四者在一次典型部署中的位置与数据流向:

训练好的模型 .tflite / .onnx ST Edge AI Developer Cloud 量化 / benchmark STM32CubeMX X-CUBE-AI 中间件 stedgeai 命令行 + 运行时 时钟 / 外设 / 内存 OCTOSPI · DCMI · UART 生成的 C 工程 network.c / network.h weights 数组 编译与烧录 STM32CubeIDE / Keil STM32N6-DK 板卡 两条路径的取舍: · 本地路径(蓝):CubeMX + X-CUBE-AI,离线可用,适合迭代调试,需本地安装扩展包。 · 云端路径(橙):Developer Cloud,免安装、可快速 benchmark,但需上传模型,适合前期评估。 · 两条路径最终都产出 C 工程,可互相验证量化与内存报告是否一致。

二、本地工具链安装

推荐使用 STM32CubeMX 6.11 及以上版本,因为 X-CUBE-AI 从 9.x 起才完整支持 STM32N6 的 Neural-ART NPU。安装步骤如下:

  1. 从 ST 官网下载并安装 STM32CubeMX(Windows/Linux/macOS 均可)。
  2. 打开 CubeMX,进入 Help → Manage embedded software packages,在 STMicroelectronics 分类下找到 X-CUBE-AI,勾选最新版本(如 10.0.0)并 Install。安装完成后,扩展包会落在 ~/.stm32cube/Repository/Packs/STMicroelectronics/X-CUBE-AI/ 目录下。
  3. 同时安装 STM32CubeN6 固件包(含 HAL 驱动与 N6 的 BSP),否则新建工程时找不到 STM32N6 器件。
  4. 若使用命令行,可单独安装 stedgeai:在扩展包目录下执行 Utilities/linux/stedgeai(或对应平台的可执行文件),验证 stedgeai --version 能输出版本号。
X-CUBE-AI 的运行时库分为 Network Runtime(纯软件推理,兼容所有 STM32)与 Neural-ART Runtime(调用 NPU 硬件加速,仅 N6 等带 NPU 的型号)。在 CubeMX 中勾选 X-CUBE-AI 后,需在配置页把 Runtime 设为 Neural-ART,否则模型会退化为 CPU 推理,速度差一个数量级。

三、在 CubeMX 中导入模型并生成代码

以 MobileNetV2 0.35 为例,假设已有一个 mobilenetv2_035_int8.tflite(INT8 量化版)。操作流程:

  1. 新建工程,选择 STM32N657X0H3Q(N6 系列常见型号),配置好时钟与调试接口。
  2. 在 Middleware 中勾选 X-CUBE-AI,进入其配置界面,点击 Add network,选择上述 tflite 文件。
  3. 设置 Runtime 为 Neural-ART,Compression 可选 None(调试期)或 RLE(减小 Flash 占用)。
  4. 点击 Analyze,CubeMX 会调用 stedgeai 解析模型,输出每层算子、权重占用、激活内存峰值。若某层不被 NPU 支持,会以黄色警告标出,并回退到 CPU。
  5. 生成代码后,工程中会出现 X-CUBE-AI/App/network.c、network.h 与 network_data.c(权重数组)。

生成的 API 非常简洁,核心调用如下:

#include "network.h"

ai_handle network;
ai_buffer *ai_input;
ai_buffer *ai_output;

/* 初始化 */
ai_error err = ai_network_create_and_init(&network, ai_input, ai_output);
if (err.type != AI_ERROR_NONE) { /* 处理错误 */ }

/* 填充输入:假设输入为 96x96x3 的 INT8 张量 */
ai_input[0].data = AI_HANDLE_PTR(input_buf);

/* 推理 */
ai_i32 n_batch = ai_network_run(network, ai_input, ai_output);

/* 读取输出 */
int8_t *out = (int8_t *)ai_output[0].data;

其中 input_buf 需按模型要求的量化参数(scale、zero_point)把图像像素映射到 INT8。例如输入量化参数为 scale=0.0078, zero_point=-1,则 q = round(pixel/255 / 0.0078) - 1,这一步若做错,推理结果会完全失真。

四、ST Edge AI Developer Cloud 的使用

当本地没有安装扩展包,或想快速对比不同量化方案时,可访问 ST Edge AI Developer Cloud(stedgeai.st.com)。注册后新建一个 project,上传 .tflite 或 .onnx,选择目标板卡(如 STM32N6570-DK),云端会:

  • 自动完成 INT8 量化(若上传的是浮点模型);
  • 生成每层耗时、内存占用、Flash 占用的 benchmark 报告;
  • 提供可下载的 C 代码包,结构与本地 CubeMX 生成的一致。

需要注意,云端 benchmark 的耗时数据是在服务器上模拟得到的,与真实 N6 板卡会有偏差,通常用于横向比较不同模型结构,而不是作为最终性能指标。最终性能仍需在板卡上用 ai_network_run 配合 DWT 计数器实测。

五、环境验证清单

工具链搭好后,建议按以下顺序做一次最小验证,确认每一环都通:

检查项验证方法预期结果
CubeMX 版本Help → About≥ 6.11
X-CUBE-AI 安装Manage packages 中可见版本 ≥ 10.0.0
stedgeai 可用命令行执行 stedgeai --version输出版本号
模型可解析CubeMX 中 Analyze 模型无红色错误,层信息完整
NPU 生效查看生成报告中的 Runtime显示 Neural-ART
板卡可运行烧录后串口打印推理耗时MobileNetV2 0.35 约数 ms 级
常见坑:① 模型输入尺寸与 CubeMX 中配置不一致,导致 ai_network_create_and_init 返回 AI_ERROR_INVALID_PARAM;② 忘记把 Runtime 切到 Neural-ART,性能远低于预期;③ 权重数组放在内部 Flash 但未开启 XIP 或未正确配置 OCTOSPI,运行时取指失败。遇到问题优先检查这三项。

完成本节配置后,你应当拥有一个能在 STM32N6 上编译、烧录并调用 NPU 推理的最小工程。下一阶段的工作——模型量化策略、算子替换与内存布局优化——都将在这个工程基础上展开。