3. STM32N6内核与存储体系认知

STM32N6 是 ST 首批集成自研 NPU 的 MCU,其算力结构并非“单核跑全部”,而是由 Cortex-M55 应用内核与 Neural-ART 加速器分工协作。理解这套体系的关键,是先把“谁算、谁搬、谁存”三件事分开看:M55 负责控制流、协议栈、图像前处理与后处理;Neural-ART 负责卷积、矩阵乘等神经网络算子;而两者共享的总线矩阵、TCM、Cache 与外部 PSRAM/Flash 决定了数据能否被及时喂给计算单元。若存储路径规划不当,NPU 再强也会因取数等待而空转。

一、双计算单元的协同关系

Cortex-M55 支持 Helium(MVE)向量扩展,可高效完成 RGB 转灰度、缩放、归一化等前处理;Neural-ART 则通过专用指令流执行量化卷积。典型推理链路是:M55 从摄像头接口取帧 → 前处理写入共享缓冲区 → 触发 NPU → NPU 读权重与特征图、写输出张量 → 中断通知 M55 做后处理(如 NMS、坐标还原)。两者之间靠共享 SRAM 与中断/信号量同步,而不是靠频繁拷贝。因此,缓冲区应放在 NPU 可访问且延迟可控的区域,避免放在仅 M55 可用的紧耦合内存中造成 NPU 无法直接读取。

STM32N6 计算与存储协同视图 Cortex-M55 控制流 / 协议栈 Helium 前处理 后处理 / NMS Neural-ART 卷积 / 矩阵乘 量化算子执行 权重流式读取 共享 SRAM 缓冲区 输入张量 / 输出张量 中断 + 信号量同步 写特征图 读/写张量 总线矩阵 / AXI 互连 多主多从并发访问 · 带宽仲裁 · 低延迟路径 TCM ITCM / DTCM 零等待 · 确定性 中断向量 / 栈 Cache I-Cache / D-Cache 加速外部访问 需一致性维护 外部 PSRAM 大容量帧缓冲 权重 / 张量存储 带宽敏感 外部 Flash 代码 / 模型权重 XIP 或加载到 RAM 启动入口

二、总线矩阵与访问路径

STM32N6 内部通过多层 AXI/AHB 总线矩阵连接 CPU、NPU、DMA、外设与各类存储器。矩阵的意义在于允许多个主设备并发访问不同从设备,例如 M55 从 TCM 取指令的同时,NPU 从 PSRAM 读权重,DMA 把摄像头数据写入 SRAM,三者互不阻塞。但并发也带来带宽竞争:当 NPU 与显示 DMA 同时访问 PSRAM 时,实际可用带宽会被分摊。工程上应把高带宽、低延迟的数据(如当前层特征图)放在片上 SRAM,把大容量但访问频次较低的数据(如整帧图像、模型权重)放在 PSRAM,并尽量让 NPU 的权重读取走连续突发,减少仲裁开销。

三、TCM 与 Cache 的配置取舍

TCM 是紧耦合内存,访问无 Cache 不确定性,适合放中断向量表、栈、实时控制变量和 NPU 同步标志。Cache 则用于加速对外部 PSRAM/Flash 的访问,但引入一致性问题:若 DMA 或 NPU 直接改了 PSRAM 中的数据,而 M55 的 D-Cache 仍保留旧副本,CPU 就会读到过期数据。处理方式有两种:一是把共享缓冲区配置为 Write-Through 或 Non-Cacheable 区域;二是在数据交接点执行 Clean/Invalidate 操作。链接脚本中通常用 MPU 区域把共享 SRAM 设为 Non-Cacheable,避免每次手动维护。

四、外部 PSRAM/Flash 映射与启动模式

STM32N6 支持从外部 Flash 启动,也可通过 BOOT 引脚选择从系统存储器或内部 Flash 启动。典型映射是:外部 Flash 映射到 0x70000000 附近用于 XIP 执行代码,外部 PSRAM 映射到 0x90000000 附近用于存放帧缓冲与权重。启动时,BootROM 根据选项字节从 Flash 读取头部,把关键段搬运到内部 SRAM 或直接 XIP 运行。若模型权重较大,通常先由 M55 从 Flash 加载到 PSRAM,再由 NPU 按层流式读取,而不是让 NPU 直接 XIP 访问 Flash,因为 Flash 的随机读取延迟远高于 PSRAM。

五、链接脚本关键段规划

链接脚本决定各段落在哪块存储上,直接影响启动速度与运行性能。建议把向量表、启动代码、中断服务程序放 ITCM 或内部 Flash;把栈、堆、NPU 同步结构放 DTCM;把帧缓冲、张量缓冲放共享 SRAM 或 PSRAM;把只读模型权重放 Flash 或 PSRAM。下面是一个示例片段,用于说明段规划思路(地址为示例,实际以芯片手册和板级设计为准):

MEMORY
{
  ITCM  (rx)  : ORIGIN = 0x00000000, LENGTH = 64K
  DTCM  (rw)  : ORIGIN = 0x20000000, LENGTH = 128K
  SRAM  (rwx) : ORIGIN = 0x34000000, LENGTH = 1M
  PSRAM (rwx) : ORIGIN = 0x90000000, LENGTH = 16M
  FLASH (rx)  : ORIGIN = 0x70000000, LENGTH = 8M
}

SECTIONS
{
  .isr_vector : { KEEP(*(.isr_vector)) } > ITCM
  .text       : { *(.text*) }            > FLASH
  .data       : { *(.data*) }            > DTCM AT> FLASH
  .bss        : { *(.bss*) }             > DTCM
  .tensor_buf : { *(.tensor_buf*) }      > SRAM
  .frame_buf  : { *(.frame_buf*) }       > PSRAM
  .model_w    : { *(.model_w*) }         > PSRAM
}
判断配置是否合理,可观察三个信号:NPU 推理中断周期是否稳定、DMA 传输是否出现欠载、M55 在数据交接点是否频繁执行 Cache 维护。若 NPU 周期抖动大,优先检查权重与特征图是否放在同一块带宽受限的 PSRAM 上。

六、协同配置的检查要点

  • 确认 NPU 可访问的缓冲区地址范围,避免误放 TCM 导致 NPU 无法读取。
  • 共享 SRAM 建议设为 Non-Cacheable 或 Write-Through,减少一致性维护。
  • 权重与帧缓冲尽量分置不同存储,降低总线仲裁冲突。
  • 启动模式与链接脚本地址必须一致,否则会出现取指异常或跳转失败。
  • 用 MPU 明确各区域属性,比依赖默认映射更可控。

把 M55、NPU、总线矩阵、TCM/Cache 与外部存储看成一条完整的数据通路,而不是孤立模块,才能在后续部署模型时做出正确的内存布局与启动规划。