1. 课程导入与工程全景
STM32 边缘 AI 部署,指的是把在 PC 或服务器上训练好的神经网络模型,经过量化、格式转换与代码集成,最终运行在 STM32 微控制器上,由 MCU 自身完成推理,而不是把原始数据上传到云端。它与“云端 AI”最本质的区别在于约束条件:STM32 通常只有几十到几百 KB 的 SRAM、几百 KB 到几 MB 的 Flash,主频在几十到几百 MHz,且往往没有操作系统或只有 RTOS。因此边缘 AI 部署的核心矛盾是——模型精度与资源占用之间的平衡。
典型应用场景包括:工业设备上的振动异常检测(用加速度计 + 1D-CNN 判断轴承状态)、可穿戴设备的心率/步态识别、智能家居的离线关键词唤醒(KWS)、电机驱动的故障电弧识别、以及电池供电的预测性维护节点。这些场景的共同点是:数据敏感或带宽受限、要求低延迟、要求长期稳定运行,且功耗预算严格。
完整工程链路
一个可落地的 STM32 边缘 AI 项目,通常要经过七个阶段,每个阶段都有明确的输入与输出:
- 数据采集:确定传感器与采样率。例如振动检测常用 3 轴加速度计,采样率 1.6 kHz~6.4 kHz,按窗口切分(如 1024 点/窗),并做去均值、归一化。
- 模型训练:在 PC 上用 TensorFlow/Keras 或 PyTorch 训练一个小型网络,如 3 层 1D-CNN,参数量控制在 10 K~50 K。
- 量化:把 float32 权重转为 int8。常用训练后量化(PTQ),若精度掉点明显则用感知量化训练(QAT)。量化后模型体积约缩小 4 倍。
- 转换:通过 STM32Cube.AI 把 .h5/.tflite/.onnx 转成 C 代码,生成网络权重数组与推理 API。
- 集成:把生成的代码加入 STM32CubeIDE 工程,分配张量内存(激活缓冲区),配置时钟与串口。
- 部署:烧录到目标板,用真实传感器数据跑通推理,观察输出类别与置信度。
- 优化:根据 RAM/Flash 占用与推理耗时,调整模型结构、窗口长度、量化方式,或启用 CMSIS-NN 加速。
下面这张图把上述链路与“资源约束”这条主线放在一起,帮助建立工程全景:
硬件平台与软件工具链概览
本课程以 STM32F407 与 STM32L4 系列作为主要目标平台。F407 主频 168 MHz、192 KB SRAM、1 MB Flash,适合作为“性能足够、便于观察”的教学板;L4 系列主频较低但功耗优秀,用于说明低功耗场景下的取舍。传感器侧以 LIS3DH 三轴加速度计为例,通过 SPI 读取 16 位加速度数据,采样率设为 1.6 kHz,每 1024 点组成一个窗口。
软件工具链分三段:训练段使用 TensorFlow/Keras,输出 .h5;转换段使用 STM32Cube.AI(X-CUBE-AI 扩展包),把模型转成 C 数组与 ai_run() 接口;部署段使用 STM32CubeIDE 编译、烧录,并通过串口打印推理结果。Cube.AI 会给出每层的 RAM/Flash 占用与 MACC 数量,这是判断模型能否放下的第一手依据。
一个可参考的起步示例
假设做振动三分类(正常 / 不平衡 / 松动)。训练侧输入形状为 (1024, 3),网络为 Conv1D(16,5) → MaxPool → Conv1D(32,3) → GlobalAvgPool → Dense(3)。float32 模型约 120 KB,量化成 int8 后约 30 KB,激活缓冲区约 40 KB。在 F407 上单次推理约 8~15 ms(示例量级,实际随编译选项与 CMSIS-NN 启用情况变化)。判断是否达标的标准是:推理周期小于窗口步进时间(例如 1024 点 @1.6 kHz ≈ 640 ms),且 RAM 占用留有余量。
本课程后续会沿着这条链路逐段展开:先建立数据与窗口的概念,再进入模型训练与量化,然后完成 Cube.AI 转换与工程集成,最后用真实数据验证并做优化。你现在需要建立的认知是——边缘 AI 部署不是“把模型塞进去”,而是在资源约束下做一连串可验证的工程决策。