第2章:MCU硬件平台选型:常见MCU对比、算力与内存要求、外设接口

好,咱们开始聊硬件选型。说实话,很多朋友一上来就问我:“老师,跑ONNX模型到底用哪款MCU最合适?”我的回答通常是——先别急着下单,咱们得把家底盘清楚。

我个人习惯把MCU选型比作“配电脑”。你想想看,你要跑个3A大作,结果配了个办公本的配置,那肯定卡成PPT。反过来,你只是写个文档,却上了个顶配工作站,那纯属浪费。ONNX推理也是这个道理。

2.1 三大主流MCU家族,我该怎么选?

目前市面上能跑轻量级ONNX模型的MCU,主要就三个流派:STM32ESP32、以及Cortex-M系列(其实STM32也是Cortex-M内核,但这里我们按生态来分)。

我在项目中遇到过不少选型翻车的案例。有一次,团队选了某款低端Cortex-M0芯片,结果模型量化后内存还是爆了,最后只能换芯片,板子重画,工期延误了两周。嗯,从那以后,我选型时第一件事就是看内存。

2.1.1 STM32系列(意法半导体)

STM32是嵌入式界的“老大哥”。生态成熟,文档齐全,CubeMX一键生成代码,用起来很顺手。但要注意,STM32家族非常庞大,从M0到M7都有。

  • 适合场景:工业控制、医疗设备、需要高可靠性的场景。
  • 算力水平:F4系列(M4内核)大概在200-400 DMIPS;H7系列(M7内核)能到1000 DMIPS以上。
  • 我的建议:如果你做的是电池供电的设备,选STM32U5系列,低功耗做得很好。如果追求极致算力,上H7。

2.1.2 ESP32系列(乐鑫)

ESP32是物联网领域的“网红”。便宜、自带Wi-Fi和蓝牙,社区资源极其丰富。说白了,如果你想快速做个原型验证,ESP32是首选。

  • 适合场景:智能家居、IoT终端、语音唤醒、简单的图像分类。
  • 算力水平:双核Xtensa LX6,主频240MHz,带一个FPU。算力大概在600 DMIPS左右。
  • 避坑指南:我曾经在ESP32上跑一个2MB的模型,结果内存直接爆了。ESP32的SRAM只有520KB,大模型必须用PSRAM(外部扩展内存),但PSRAM速度慢,推理延迟会明显增加。

2.1.3 其他Cortex-M系列(NXP、GD32、瑞萨等)

除了ST和乐鑫,还有很多优秀的MCU。比如NXP的i.MX RT系列,跨界处理器,性能直逼低端ARM Cortex-A。还有国产的GD32,性价比极高。

  • 适合场景:对成本敏感、或者需要特定外设(如CAN FD、以太网)的场景。
  • 算力水平:M4内核普遍在300-500 DMIPS,M7内核可以到1500 DMIPS。
  • 我的经验:如果你需要跑TinyML模型,比如TensorFlow Lite Micro,GD32F4系列是个不错的选择,价格只有STM32F4的一半,但性能差不多。

2.2 算力与内存要求——别让模型“饿死”

跑ONNX模型,说白了就是“算力换时间,内存换空间”。你算力不够,推理就慢;内存不够,模型根本加载不进去。

2.2.1 算力(DMIPS / MMAC)

算力怎么看?别只看主频。同样是200MHz,M4内核和M7内核的算力差了好几倍。关键看两个指标:DMIPS(Dhrystone百万条指令每秒)和MMAC(百万次乘累加每秒)。

内核 典型主频 DMIPS MMAC(@200MHz) 适合模型大小
Cortex-M0+ 48 MHz ~50 ~20 极小型(<50KB)
Cortex-M4 200 MHz ~300 ~200 小型(50-200KB)
Cortex-M7 400 MHz ~1000 ~800 中型(200-500KB)
ESP32 240 MHz ~600 ~400 小型(<200KB,需PSRAM)

为什么会这样?因为M7有双精度浮点单元和更大的缓存,做矩阵乘法时优势明显。我个人习惯,如果模型里卷积层多,优先选M7或带DSP指令的M4。

2.2.2 内存(SRAM / Flash)

内存是MCU推理的“硬伤”。你想想看,一个1MB的ONNX模型,量化成int8后大概250KB。但运行时,中间激活值、输入输出缓冲区、栈空间,加起来可能翻倍。

内存估算公式(我自己的经验值):

所需SRAM ≈ 模型参数大小 × 1.5 + 输入张量大小 × 2 + 输出张量大小 × 2 + 栈空间(4KB)

举个例子:一个量化后的模型参数为200KB,输入是32×32×3(约12KB),输出是10个类别(忽略不计)。那么SRAM至少需要:200×1.5 + 12×2 + 4 = 328KB。

注意:很多MCU的SRAM只有128KB或256KB。如果你算出来需要328KB,那这块芯片就装不下。我曾经在STM32F407上踩过这个坑,模型量化后参数只有180KB,但运行时内存分配失败,最后只能把模型拆成两段,分步推理。

2.3 外设接口——模型怎么“看”和“说”

模型跑起来了,总得跟外界交互吧?外设接口决定了你的模型能接什么传感器,能输出什么控制信号。

2.3.1 必备接口

  • I2C / SPI:接传感器(温度、湿度、加速度计、麦克风)。我建议至少留一个SPI接口,因为很多高速传感器(如摄像头、麦克风阵列)都用SPI。
  • UART:调试必备。打印推理结果、日志输出,全靠它。
  • GPIO:控制LED、继电器、电机。模型推理出结果后,通过GPIO输出控制信号。

2.3.2 高级接口

  • USB:如果你需要把MCU当做一个USB设备(如USB摄像头、USB麦克风),那必须选带USB OTG的型号。STM32F4系列基本都带。
  • 以太网:工业场景常用。模型推理结果通过MQTT或HTTP上传到服务器。
  • CAN / CAN FD:汽车电子、工业总线。如果你做车载诊断或工业控制,这个接口是刚需。

我的小技巧:选型时,别只看接口数量,还要看接口的DMA支持。比如SPI传输数据时,如果不用DMA,CPU会被占用,推理延迟会大幅增加。我习惯选那些每个外设都有独立DMA通道的MCU。

2.4 总结一下选型思路

嗯,说了这么多,其实选型就三步:

  1. 算模型内存:用上面的公式估算,确定SRAM下限。
  2. 定算力需求:如果推理延迟要求小于100ms,上M7或ESP32;如果允许1秒以上,M4就够了。
  3. 对外设接口:列出你需要的传感器和输出设备,对照MCU的数据手册,看接口数量是否够用。

最后,我建议你手边常备一块STM32H743和一块ESP32-S3。前者用来做高性能原型,后者用来做低成本量产验证。两块板子加起来不到200块钱,但能帮你避开90%的选型坑。

下一章,咱们聊聊ONNX Runtime在MCU上的移植和适配。到时候我会手把手带你搭建开发环境,记得准备好你的开发板。