1. 引言
- TinyML 的概念与价值:在资源受限的MCU上运行机器学习推理
- 为什么选择 STM32:生态成熟、工具链完善、性能与功耗平衡
- 本文目标:从零开始,在STM32上完整跑通一个TinyML项目(数据采集→模型训练→模型转换→部署推理)
2. 环境与硬件准备
- 硬件清单:
- STM32开发板推荐(如 STM32F746G-Discovery、STM32L4 系列、NUCLEO-H743ZI2)
- 传感器选型(加速度计/麦克风/摄像头模块)
- 调试器(ST-Link / J-Link)
- 软件工具链:
- STM32CubeMX / STM32CubeIDE
- X-CUBE-AI 扩展包(模型转换与代码生成)
- TensorFlow / TensorFlow Lite for Microcontrollers
- Python 环境(训练用)
- 开发环境搭建步骤简述
3. TinyML 工作流概览
- 标准流程:数据采集 → 模型训练 → 模型量化 → 模型转换 → 部署推理
- 各环节在STM32上的特殊约束(内存、Flash、算力)
- 本文采用的示例项目:基于加速度计的手势识别(或关键词唤醒)
4. 数据采集与预处理
- 传感器数据采集方式(串口/DMA/定时器)
- 数据标注策略
- 数据清洗与归一化
- 生成训练数据集(CSV / TFRecord 格式)
- 数据增强技巧(适用于MCU场景的轻量增强)
5. 模型训练(Python端)
- 模型选型原则:小模型优先(DNN / 1D-CNN / 轻量RNN)
- 使用 TensorFlow 构建分类模型
- 训练参数配置(学习率、batch size、epochs)
- 模型评估与调优(准确率、参数量、模型大小)
- 导出为 TensorFlow Lite 模型(
.tflite)
6. 模型量化与优化
- 为什么需要量化:FP32 → INT8 的精度与体积权衡
- TensorFlow Lite 量化方法:
- 训练后量化(Post-training quantization)
- 量化感知训练(Quantization-aware training)
- 验证量化后模型精度
- 模型大小与RAM占用预估
7. 模型转换与集成(X-CUBE-AI)
- 安装 X-CUBE-AI 扩展包
- 在 STM32CubeMX 中导入
.tflite模型 - 配置模型输入输出(数据格式、缓冲区大小)
- 生成 C 代码(AI 推理函数、内存分配)
- 验证生成的代码结构(
network.h、network_data.c等)
8. STM32 端代码实现
- 工程初始化(时钟、GPIO、串口、传感器驱动)
- 集成 AI 推理代码
- 数据采集与预处理(滑动窗口、特征提取)
- 调用推理函数(
ai_run()) - 解析推理结果并输出(串口打印 / LED指示 / OLED显示)
- 完整代码示例(关键函数片段)
9. 性能测试与优化
- 推理耗时测量(使用 DWT 或 TIM 定时器)
- Flash 与 RAM 占用分析
- 优化方向:
- 模型剪枝与进一步量化
- 使用 CMSIS-NN 加速
- 调整缓冲区大小与推理频率
- 对比不同STM32型号的性能差异
10. 常见问题与调试技巧
- 模型推理结果全为0或固定值 → 检查输入数据格式与归一化
- 内存不足 → 减小模型/调整缓冲区/使用外部SRAM
- 推理速度慢 → 启用硬件加速/降低模型复杂度
- CubeMX 导入模型报错 → 检查模型版本与算子兼容性
- 串口数据乱码 → 检查波特率与数据格式
11. 总结与扩展方向
- 本文回顾:从数据到部署的完整链路
- 进阶方向:
- 多传感器融合
- 边缘端在线学习
- 低功耗场景优化(STM32L4+ 系列)
- 使用 Edge Impulse / NanoEdge AI 等平台
- 推荐学习资源(官方文档、社区、开源项目)
附录
- A. 完整工程目录结构
- B. 关键代码清单(训练脚本、STM32主程序)
- C. 常用命令速查表(CubeMX CLI、X-CUBE-AI 命令行)