3. 开发环境与工具链搭建
STM32N6 是 ST 首颗带自研 NPU(Neural-ART 加速器)的 MCU,其工具链与普通 STM32 项目有明显差异:模型转换、NPU 算子映射、外部 Flash 加载、调试探针的访问权限都会影响后续能否顺利跑通推理。本节的目标不是"把软件装上",而是搭出一套可验证、可复现的环境:装完之后,你能用一条最小链路证明"PC 端工具 → 生成代码 → 编译下载 → 板上运行 → 调试观察"是通的。
一、先理清各工具的分工
很多初学者会把 STM32CubeMX、STM32CubeIDE、STM32Cube.AI 混为一谈。它们的关系是:
- STM32CubeMX:图形化配置工具,负责引脚、时钟、外设、中间件初始化,并生成
.ioc工程文件与初始化代码。它是"配置源头"。 - STM32CubeIDE:基于 Eclipse + GCC 的集成开发环境,负责编辑、编译、下载、调试。它内置了 CubeMX 的配置视图,可以直接打开
.ioc。 - STM32Cube.AI:把训练好的神经网络模型(如
.tflite、.onnx、.h5)转换成 STM32 可用的 C 代码,并给出 Flash/RAM 占用估算。它有两种形态:独立桌面版 STM32Cube.AI Developer Cloud / 桌面版,以及集成进 CubeMX 的 X-CUBE-AI 扩展包。 - X-CUBE-AI:CubeMX 的扩展包(Expansion Package),安装后在 CubeMX 里多出 "Artificial Intelligence" 分类,可直接在工程中生成 AI 中间件代码。
- 调试工具链:ST-LINK 驱动、ST-LINK GDB Server、串口终端(如 Tera Term / minicom),用于下载、单步、看变量、看串口日志。
下图给出本节要搭出的完整工具链拓扑,以及各环节之间的数据流向:
二、安装顺序与关键选择
推荐顺序:先装 CubeIDE(自带 CubeMX 与 GCC)→ 再装 X-CUBE-AI 扩展包 → 最后装 ST-LINK 驱动与串口终端。这样能避免 CubeMX 与 CubeIDE 版本不匹配导致的 .ioc 打不开问题。
安装时有几个容易踩坑的点:
- 版本对齐:CubeIDE 与 CubeMX 的版本号不必完全相同,但 X-CUBE-AI 扩展包必须与 CubeMX 主版本兼容。例如 CubeMX 6.12 对应 X-CUBE-AI 10.x,装错版本会在 CubeMX 里看不到 AI 分类。
- 安装路径不要有中文和空格:GCC 与 GDB Server 对路径敏感,
C:\Program Files\ST这类路径在部分脚本中会出问题,建议用D:\ST\。 - X-CUBE-AI 的两种用法:如果只是做模型转换与占用估算,用独立桌面版即可;如果要直接在 CubeMX 工程里生成 AI 代码,必须装扩展包。两者可以共存。
- ST-LINK 驱动:Windows 下装 ST-LINK USB 驱动后,设备管理器应出现 "STMicroelectronics STLink dongle"。若显示黄色感叹号,说明驱动未正确签名或版本过旧。
三、用最小工程验证工具链
装完不等于能用。下面用一个"LED 闪烁 + 串口打印"的最小工程,把整条链路走一遍。这个工程不涉及 AI,但它是后续所有 AI 工程的基础模板。
在 CubeMX 中新建工程,选择 STM32N6570-DK(或你手上的 N6 板卡),配置:
- 系统时钟:使用 HSE + PLL,目标 SYSCLK 600 MHz(N6 的 M55 可跑到 800 MHz,但初期验证建议先降频,减少时钟配置出错概率)。
- 一个 GPIO 输出接 LED,一个 UART(如 USART1,115200-8-N-1)用于打印。
- 生成代码时选择 "Copy only necessary library files",工具链选 STM32CubeIDE。
生成后在 CubeIDE 中编译,主循环里加入:
printf("N6 toolchain OK, tick=%lu\r\n", HAL_GetTick());
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(500);
下载运行后,串口终端应每 500 ms 打印一行,LED 同步闪烁。如果串口无输出,先检查:波特率是否一致、TX/RX 是否接反、printf 是否重定向到 UART(需要实现 _write 或 __io_putchar)。
四、验证 X-CUBE-AI 是否可用
AI 工具链的验证不能只看"装上了",要跑一次真实的模型转换。准备一个极小的模型(例如一个 3 层全连接、输入 1×16 的 .tflite),在 CubeMX 中打开 Artificial Intelligence 分类,添加模型,点击 "Analyze"。
正常情况下会看到类似下面的输出(数值为示例,实际以你的模型为准):
Model name : tiny_mlp
Input : float32[1,16]
Output : float32[1,4]
Params : 1,236
MACC : 1,152
Flash (weights) : 4.8 KB
RAM (activations): 0.3 KB
NPU supported : partial (2/3 layers)
这里要重点看三件事:MACC(乘加次数,反映计算量)、Flash/RAM 占用(决定能否放进 N6 的片上存储)、NPU supported(哪些层能被 NPU 加速)。如果 NPU 支持率很低,说明模型里有 NPU 不支持的算子,后续要么换算子,要么接受回退到 CPU 执行。
.map 文件可能有 5%~15% 的偏差,尤其是激活内存。不要只信估算值,最终要以编译后的实际占用为准。五、调试工具链的验证
调试环节要验证三件事:
- 下载:CubeIDE 中点击 Run,能正常烧录并复位运行。
- 单步与断点:在
HAL_Delay前打断点,能停住,能看HAL_GetTick()的值。 - 串口日志:与调试同时工作,不冲突。注意 ST-LINK V3 的虚拟串口与独立 UART 是两回事,如果板卡用的是独立 UART,需要单独接 USB-TTL。
如果调试时出现 "Target not responding",优先检查:SWD 线序(SWCLK/SWDIO/GND 是否接对)、目标板是否已上电、复位模式是否设为 "Connect under reset"。N6 在低功耗模式下会关闭调试口,若程序里进了低功耗,需要先按住复位再连接。
六、本节交付物:环境自检清单
把上面的验证过程固化成一张可填写的清单,每次换机器或升级工具后跑一遍:
| 检查项 | 验证方法 | 通过标准 |
|---|---|---|
| CubeIDE 编译 | 新建空工程并 Build | 0 error,生成 .elf |
| CubeMX 配置 | 打开 .ioc 并生成代码 | 无版本不兼容提示 |
| X-CUBE-AI 扩展包 | CubeMX 中出现 AI 分类 | 能添加模型并 Analyze |
| 模型转换 | 转换 tiny_mlp.tflite | 输出 MACC 与占用估算 |
| ST-LINK 识别 | 设备管理器 / CubeIDE 连接 | 识别到芯片 ID |
| 下载运行 | 烧录 LED 闪烁程序 | LED 按 500 ms 闪烁 |
| 串口输出 | 115200 打开终端 | 每 500 ms 一行日志 |
| 断点调试 | 在 HAL_Delay 前打断点 | 能停住并查看变量 |