4. 开发环境搭建

STM32N6 是 ST 首颗带自研 NPU(Neural-ART)的 MCU,围绕它做音频 AI 终端,工具链不是“装一个 IDE 就完事”,而是由五类工具各司其职、互相衔接:STM32CubeMX 负责引脚与外设的图形化配置并生成初始化代码;STM32CubeIDE 负责工程编译、下载与源码级调试;STM32CubeProgrammer 负责烧写、读回、擦除与选项字节(Option Bytes)管理;X-CUBE-AI 负责把训练好的神经网络模型转换成可在 STM32N6 上运行的 C 代码;调试工具链则包含 ST-LINK 驱动、SWD 连接、串口终端与日志输出。本章先完成安装与配置,再用“点灯 + 串口输出”验证整条链路是否打通。

一、安装顺序与版本选择

推荐安装顺序为:STM32CubeMX → STM32CubeIDE → STM32CubeProgrammer → X-CUBE-AI 扩展包 → 串口终端工具。STM32CubeIDE 自带 GCC 工具链和 ST-LINK GDB Server,安装时勾选“ST-LINK 驱动”即可;STM32CubeProgrammer 独立安装,用于处理 N6 的启动模式与外部 Flash 烧写。X-CUBE-AI 以扩展包形式集成进 CubeMX 与 CubeIDE,安装后在 CubeMX 的“Additional Software”中可见。版本上建议使用 CubeIDE 1.16 及以上、CubeMX 6.12 及以上、CubeProgrammer 2.17 及以上,以保证对 STM32N6 系列(如 STM32N657X0)的支持。

安装路径不要包含中文和空格,否则 CubeMX 生成脚本与 X-CUBE-AI 的模型转换命令可能因路径解析失败而报错。建议统一放在 D:\STM32\ 下。

二、用 CubeMX 建立第一个工程

打开 CubeMX,选择“New Project”,在搜索框输入 STM32N657X0H3Q(以 NUCLEO-N657X0-Q 开发板为例),双击进入引脚配置界面。先做三件事:

  1. 配置时钟源:在 System Core → RCC 中把 HSE 设为 Crystal/Ceramic Resonator,为后续音频采样提供稳定时钟基准。
  2. 配置调试接口:System Core → SYS 中 Debug 选择 Serial Wire,否则下载一次后 SWD 引脚被复用,后续无法再连接。
  3. 配置串口:在 Connectivity 中选择 USART3,Mode 设为 Asynchronous,波特率 115200,8 位数据、无校验、1 位停止位。NUCLEO 板上 USART3 默认连到 ST-LINK 虚拟串口,无需额外接线。

接着配置一个 LED。以板载 LD1 为例,对应引脚 PF13(不同板卡可能不同,以原理图为准),点击该引脚选择 GPIO_Output,在 GPIO 参数中把 Output level 设为 Low,Mode 设为 Output Push Pull,Pull-up/Pull-down 设为 No pull,Speed 设为 Low,User Label 填 LED1。这样生成的代码里会出现 LED1_Pin 与 LED1_GPIO_Port 宏,便于阅读。

在 Project Manager 中填写工程名(如 N6_LedUart),Toolchain 选择 STM32CubeIDE,勾选“Generate peripheral initialization as a pair of .c/.h files”,然后点击 GENERATE CODE。CubeMX 会生成 Core/Src/main.c、gpio.c、usart.c 等文件,其中 MX_GPIO_Init() 与 MX_USART3_UART_Init() 已完成寄存器级配置。

三、在 CubeIDE 中编写点灯与串口代码

用 CubeIDE 打开刚生成的工程,编译一次确认无错误。然后在 main.c 的 while (1) 循环内加入以下代码(注意写在 /* USER CODE BEGIN WHILE */ 与 /* USER CODE END WHILE */ 之间,重新生成代码时不会被覆盖):

HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
printf("LED toggled, tick=%lu\r\n", HAL_GetTick());
HAL_Delay(500);

要让 printf 走串口,需要重定向 _write(GCC 环境)或 fputc(Keil 环境)。在 CubeIDE 中推荐在 main.c 的用户代码区加入:

#include <stdio.h>
int _write(int file, char *ptr, int len) {
    HAL_UART_Transmit(&huart3, (uint8_t *)ptr, len, HAL_MAX_DELAY);
    return len;
}

编译后点击 Run → Debug,CubeIDE 会自动调用 ST-LINK GDB Server 下载程序并停在 main() 入口。按 F8 全速运行,板上 LED 应以约 1 Hz 频率闪烁。

四、用串口终端验证输出

打开任意串口终端(PuTTY、Tera Term 或 CubeIDE 内置的 Serial Monitor),选择 ST-LINK 对应的 COM 口,参数 115200-8-N-1。复位开发板后应看到类似输出:

LED toggled, tick=500
LED toggled, tick=1000
LED toggled, tick=1500

如果 LED 不闪且串口无输出,按以下顺序排查:确认 SYS Debug 已设为 Serial Wire;确认 USART3 的引脚未被其它外设占用;用万用表测 LED 引脚电平是否在翻转;检查串口终端是否选错 COM 口或被其它软件占用。若下载时报“No STM32 target found”,多为 SWD 被禁用或板子处于低功耗态,可按住复位键再点击下载,或通过 BOOT0 进入系统存储器模式后用 CubeProgrammer 擦除。

STM32N6 开发工具链与首个点灯/串口验证链路 STM32CubeMX 引脚/时钟/外设配置 STM32CubeIDE 编译/下载/源码调试 CubeProgrammer 烧写/擦除/选项字节 X-CUBE-AI 模型→C代码 生成 .elf/.bin 集成 STM32N657X0 目标板 PF13 → LED1(GPIO 输出) USART3 → ST-LINK 虚拟串口(115200-8-N-1) SWD 下载 烧写 ST-LINK GDB Server 断点/单步/变量观察 串口终端 COM 口 / 115200 观察结果 LED 1Hz 闪烁 + 日志 验证闭环:LED 闪烁 + 串口打印 tick 递增 → 工具链打通

五、X-CUBE-AI 的接入位置

点灯与串口跑通后,X-CUBE-AI 才真正登场。在 CubeMX 中打开“Additional Software”,勾选 X-CUBE-AI,选择版本后进入其配置页,导入 .tflite 或 .onnx 模型,设置量化方式(推荐 int8)与输入输出张量,点击“Analyze”可看到模型在 STM32N6 上的 RAM/Flash 占用与 NPU 加速层数。生成代码后,CubeIDE 工程中会多出 X-CUBE-AI/App 目录,其中 network.c 提供 ai_network_create()、ai_network_run() 等接口,后续音频推理章节将直接调用它们。

X-CUBE-AI 生成的代码默认使用较大 RAM 缓冲区,STM32N6 虽有 4.2 MB 片上 SRAM,但音频前端 + 模型 + 双缓冲仍需仔细规划。建议在 CubeMX 的“Project Manager → Linker Settings”中把堆栈与 AI 缓冲区显式分配到不同 SRAM 区域,避免运行时溢出。

六、常见问题速查

现象可能原因处理
下载报 “No STM32 target found”SWD 引脚被复用或芯片进入低功耗按住复位再下载,或用 BOOT0 进系统存储器擦除
串口无输出COM 口选错 / 波特率不匹配 / _write 未重定向核对设备管理器、115200-8-N-1、检查重定向函数
LED 不亮引脚号与原理图不符 / 未调用 MX_GPIO_Init()查板卡原理图,确认 main() 中初始化顺序
X-CUBE-AI 分析失败模型算子不支持 / 路径含中文换用支持算子或改用 ONNX,路径改英文