一、课程导论与开发环境搭建

各位同学好,欢迎来到《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编译器,开箱即用。

安装步骤很简单:

  1. 去ST官网下载STM32CubeIDE安装包(Windows/Linux/Mac都有)
  2. 双击安装,一路默认选项就行
  3. 安装完成后,打开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 本章知识体系总览

为了让大家对本章内容有个整体认识,我画了一张结构图:

第一章:课程导论与开发环境搭建 STM32 + TFLite Micro 为什么选这个组合 MCU推理 + 低功耗 开发板选型 F4入门 / H7进阶 IDE安装 STM32CubeIDE 源码获取与编译 GitHub + Makefile 核心目标:搭建可用的开发环境,跑通第一个TFLite Micro示例 后续章节将围绕模型移植、内存分析、算子优化展开 模型转换与量化 第2-5章 内存分析与调优 第6-15章 算子优化与部署 第16-30章

1.6 本章小结

这一章我们做了三件事:

  • 明确了方向:STM32 + TFLite Micro是端侧AI的黄金组合,但内存是最大瓶颈
  • 选好了硬件:F4入门、H7进阶,根据预算和需求来
  • 搭好了环境:CubeIDE装好,TFLite Micro源码拉下来,编译通过