3、硬件平台选型:STM32系列选型指南、性能与功耗权衡、外设资源评估

做AI模型部署,第一步不是写代码,而是选芯片。

我见过太多项目,算法团队把模型调得精度很高,结果发现选的那颗STM32根本跑不动。或者跑起来了,功耗却超标,产品没法过认证。所以这一章,咱们把选型这件事聊透。

3.1 STM32系列选型指南

STM32家族很大,从低功耗的L0到高性能的H7,跨度非常大。但做AI部署,我们主要关注几个系列。

入门级:STM32F4系列

说实话,F4系列是很多人的入门选择。它带FPU(浮点运算单元),主频最高到180MHz。如果你部署的是轻量级模型,比如只有几千个参数的小网络,F4完全够用。

我个人习惯用STM32F407作为基准测试平台。为什么?因为它性价比高,开发板便宜,社区资源多。你想想看,踩坑的时候能搜到一堆解决方案,这多重要。

进阶选择:STM32H7系列

H7系列才是真正为AI准备的。双核架构(Cortex-M7 + Cortex-M4),主频最高480MHz。我去年做一个工业缺陷检测项目,模型大概5万个参数,用F4跑一帧要200ms,换成H7直接降到40ms。嗯,这个差距是质的飞跃。

低功耗场景:STM32L5系列

如果你做的是电池供电的设备,比如手持检测仪,那L5系列更合适。它基于Cortex-M33内核,带TrustZone安全特性。功耗控制得非常好,跑一个推理任务只需要几十毫瓦。

选型核心原则:

  • 模型参数量 < 10K:F4系列足够
  • 模型参数量 10K - 100K:H7系列更稳妥
  • 电池供电 + 实时性要求不高:L5系列
  • 需要双核并行处理:H7系列

3.2 性能与功耗权衡

做AI部署,性能和功耗永远是一对矛盾体。你想跑得快,就得把主频拉高,功耗自然就上去了。

主频与算力的关系

STM32的算力主要来自CPU和可选的硬件加速器。H7系列有DSP指令集和FPU,算力可以达到2000 DMIPS以上。但代价是什么?全速运行时功耗可能超过500mW。

我曾经在一个项目中,客户要求推理时间小于50ms,同时整机功耗不能超过300mW。我试了F4,推理时间80ms,超了。换H7,推理时间30ms,但功耗450mW,也超了。

最后怎么解决的?我用了动态调频策略。推理时把主频拉到400MHz,推理完立刻降到100MHz。这样平均功耗控制在280mW,完美达标。

我的经验:不要只看峰值功耗,要看平均功耗。很多场景下,推理是间歇性的。用STM32的PWR模块做动态电压频率调整(DVFS),可以省下30%-50%的功耗。

睡眠模式与唤醒

工业现场很多设备是「大部分时间在睡觉,偶尔醒来干活」。STM32的Stop模式和Standby模式非常实用。Stop模式下功耗可以降到几十微安,唤醒时间只要几微秒。

你想想看,一个传感器节点,每10秒采集一次数据,跑一次推理,然后继续睡。这样一颗纽扣电池能用半年以上。

模式 典型功耗 唤醒时间 适用场景
Run (400MHz) ~450mW - 推理计算
Sleep ~50mW ~1μs 等待中断
Stop ~50μW ~5μs 间歇性采集
Standby ~1μW ~50μs 超低功耗待机

3.3 外设资源评估

选芯片不能只看算力,外设资源同样关键。我见过有人选了颗算力很强的芯片,结果发现没有足够的串口接传感器,最后只能外挂扩展芯片,成本和体积都上去了。

必须关注的外设

  • USART/UART:工业现场最常用的通信接口。至少需要2-3个,一个接调试,一个接传感器,一个备用。
  • SPI:连接外部Flash、ADC、显示屏。如果你要存模型参数,外部Flash几乎是必须的。STM32内部Flash通常只有1-2MB,存不下大模型。
  • I2C:接温湿度传感器、加速度计等。速度不快,但省引脚。
  • DMA:这个容易被忽略。没有DMA,CPU会被数据搬运占满,推理性能大打折扣。我建议选至少2个DMA控制器。
  • 定时器:做PWM控制、脉冲计数。工业现场经常需要精确控制电机或采集编码器信号。

避坑指南:我曾经选了一颗STM32F4,发现它只有一个硬件I2C外设。项目后期要同时接两个I2C传感器,只能软件模拟一个I2C,结果通信不稳定,排查了三天。所以选型时一定要把外设数量列清楚,别省那几块钱。

存储资源评估

AI模型部署对存储有硬性要求。模型参数、中间激活值、输入输出缓冲区,这些都要算清楚。

举个例子,一个8位量化的模型,10万个参数,大约占100KB。加上代码和中间变量,至少需要256KB的RAM。如果你用浮点模型,同样的参数量要400KB RAM。

我个人建议:RAM至少选512KB以上的型号。别问我为什么,问就是吃过亏。之前一个项目模型只占300KB,但运行时中间变量暴涨,直接溢出,最后只能重新选型,项目延期两周。

外部存储扩展

当内部Flash不够用时,可以用QSPI接口接外部Flash。STM32H7支持QSPI,可以映射到地址空间,像访问内部Flash一样访问外部存储。这样模型可以放在外部,推理时直接执行,不用搬来搬去。

// QSPI 初始化示例(HAL库)
QSPI_HandleTypeDef hqspi;
hqspi.Instance = QUADSPI;
hqspi.Init.ClockPrescaler = 2;      // 分频系数
hqspi.Init.FifoThreshold = 4;       // FIFO阈值
hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_NONE;
hqspi.Init.FlashSize = POSITION_VAL(0x1000000) - 1; // 16MB
hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_1_CYCLE;
hqspi.Init.ClockMode = QSPI_CLOCK_MODE_0;
HAL_QSPI_Init(&hqspi);

嗯,这里要注意:外部Flash的读取速度比内部慢,如果模型需要频繁读取,可能会成为瓶颈。我一般把模型加载到内部RAM后再推理,这样速度最快。

3.4 我的选型清单

最后,分享一个我常用的选型检查清单。每次选芯片前,我都会过一遍:

  1. 算力够吗? 模型推理时间是否满足实时性要求?留30%余量。
  2. RAM够吗? 模型参数 + 中间变量 + 系统开销,至少留50%余量。
  3. Flash够吗? 代码 + 模型参数,不够就考虑外部Flash。
  4. 外设够吗? 串口、SPI、I2C、DMA、定时器,一个都不能少。
  5. 功耗达标吗? 峰值功耗和平均功耗都要算,特别是电池供电场景。
  6. 开发工具支持吗? STM32CubeMX、CubeIDE、X-CUBE-AI是否支持该型号?

说实话,选型这件事没有标准答案。每个项目都有自己的约束条件。但只要你把上面这些点都过一遍,大概率不会踩大坑。

下一章,咱们聊聊具体的开发环境搭建。工欲善其事,必先利其器嘛。