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 内部通过多层 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 可访问的缓冲区地址范围,避免误放 TCM 导致 NPU 无法读取。
- 共享 SRAM 建议设为 Non-Cacheable 或 Write-Through,减少一致性维护。
- 权重与帧缓冲尽量分置不同存储,降低总线仲裁冲突。
- 启动模式与链接脚本地址必须一致,否则会出现取指异常或跳转失败。
- 用 MPU 明确各区域属性,比依赖默认映射更可控。
把 M55、NPU、总线矩阵、TCM/Cache 与外部存储看成一条完整的数据通路,而不是孤立模块,才能在后续部署模型时做出正确的内存布局与启动规划。