一、课程导论与开发环境搭建
各位同学好,欢迎来到《STM32模型移植与TFLite Micro内存调优实战》的第一章。
我是你们这门课的主讲。做了十几年嵌入式,从最早的8位机一路折腾到现在的双核MCU,踩过的坑确实不少。尤其是这几年AI模型往端侧跑的趋势越来越猛,我发现自己那套“老嵌入式”的内存管理思路,在TFLite Micro面前经常碰壁。
所以这门课,说白了就是把我这些年踩过的坑、总结出来的经验,尤其是内存调优那点“脏活累活”,掰开了揉碎了讲给你们听。
1.1 为什么是STM32 + TFLite Micro?
先聊聊为什么选这个组合。
STM32不用多说,做嵌入式的没人不知道。Cortex-M4和M7内核,带FPU和DSP指令集,跑轻量级推理完全够用。我最早在F4上跑过一个手势识别模型,帧率能到30fps,功耗才几十毫瓦。
TFLite Micro呢?它是Google专门为MCU级别设备打造的推理框架。没有操作系统依赖,纯C++17编写,ROM占用可以压到几十KB。我见过最极致的优化,整个推理引擎只用了16KB Flash。
但问题也出在这里——内存。MCU的RAM通常只有几百KB,而一个中等规模的模型,光中间结果缓冲区就可能吃掉上百KB。怎么在这么紧巴巴的空间里把模型跑起来,就是这门课要解决的核心问题。
核心观点:模型移植是基本功,内存调优才是决定项目能否量产的关键。
1.2 开发板选型:F4还是H7?
我个人建议,初学者从STM32F4系列入手。原因很简单:资料多、生态成熟、价格便宜。一块NUCLEO-F446RE,淘宝一百多块钱,足够跑通大部分轻量模型。
如果你要做更复杂的应用,比如视觉类的模型,那还是得上H7。H743的RAM有1MB,主频480MHz,双精度FPU,跑MobileNet V1都能到10fps以上。
我整理了一个对比表,方便你们选型:
| 特性 | STM32F446RE | STM32H743ZI |
|---|---|---|
| 内核 | Cortex-M4 | Cortex-M7 |
| 主频 | 180 MHz | 480 MHz |
| RAM | 128 KB | 1 MB |
| Flash | 512 KB | 2 MB |
| FPU | 单精度 | 双精度 |
| 典型价格 | ~120元 | ~350元 |
| 适合场景 | 入门、传感器数据处理 | 视觉、音频、复杂模型 |
我的建议:如果你预算有限,先买一块F4的板子把流程跑通。等后面讲到内存调优的高级技巧时,再考虑升级到H7。我自己当年就是F4起步的,那块板子到现在还在用。
1.3 IDE安装:STM32CubeIDE
开发环境这块,我推荐直接用STM32CubeIDE。它是ST官方基于Eclipse打造的免费IDE,集成了CubeMX配置工具和GCC编译器,开箱即用。
安装步骤很简单:
- 去ST官网下载STM32CubeIDE安装包(Windows/Linux/Mac都有)
- 双击安装,一路默认选项就行
- 安装完成后,打开IDE,它会自动检测并安装必要的驱动
嗯,这里要注意一个坑:Windows用户安装时,安装路径不要有中文和空格。我之前有个学生,装在了“D:\程序\STM32”下面,结果编译一直报路径错误,折腾了半天才发现是中文目录的问题。
避坑指南:安装路径、工程路径、源文件路径,全部使用英文和数字。这是嵌入式开发的铁律,不光是CubeIDE,所有工具链都一样。
1.4 TFLite Micro源码获取与编译
接下来是重头戏——获取TFLite Micro源码。
TFLite Micro的源码托管在GitHub上,是TensorFlow仓库的一部分。获取方式有两种:
- 完整克隆:
git clone https://github.com/tensorflow/tensorflow.git,然后切换到特定版本 - 浅克隆:
git clone --depth 1 --branch v2.12.0 https://github.com/tensorflow/tensorflow.git,只下载最新代码
我个人习惯用浅克隆。完整仓库有2个多G,下载太慢了。浅克隆只下载最新版本,够用。
下载完成后,进入 tensorflow/lite/micro 目录,你会看到这样的结构:
tensorflow/lite/micro/
├── examples/ # 示例工程
├── kernels/ # 算子实现
├── tools/ # 工具脚本
├── memory_planner/ # 内存规划器(重点!)
├── test/ # 测试代码
├── BUILD # Bazel构建文件
└── README.md
编译的话,官方推荐用Bazel。但我更推荐用Makefile,尤其是做STM32移植时。因为Bazel对交叉编译的支持比较麻烦,而Makefile可以灵活指定工具链。
编译命令示例:
# 进入micro目录
cd tensorflow/lite/micro
# 使用Makefile编译
make -f tensorflow/lite/micro/tools/make/Makefile \
TARGET=linux \
test_hello_world
# 编译成功后,可执行文件在
# tensorflow/lite/micro/tools/make/gen/linux_x86_64/bin/
我第一次编译时,卡在了依赖下载上。TFLite Micro的Makefile会自动下载flatbuffers、gemmlowp等第三方库,但国内网络环境你懂的,经常下载失败。解决办法是手动下载这些库,放到 tensorflow/lite/micro/tools/make/downloads 目录下。
小技巧:如果你网络不好,可以用我整理好的离线依赖包。在课程配套资料里,有个 tflite_micro_deps.zip,解压后放到downloads目录就行。
1.5 本章知识体系总览
为了让大家对本章内容有个整体认识,我画了一张结构图:
1.6 本章小结
这一章我们做了三件事:
- 明确了方向:STM32 + TFLite Micro是端侧AI的黄金组合,但内存是最大瓶颈
- 选好了硬件:F4入门、H7进阶,根据预算和需求来
- 搭好了环境:CubeIDE装好,TFLite Micro源码拉下来,编译通过