第一课:课程导论与开发环境搭建
各位同学,欢迎来到《TFLite微控制器部署实战》的第一课。
我是你们的讲师,一个在嵌入式AI领域摸爬滚打了好几年的工程师。说实话,刚开始接触TFLite Micro的时候,我也觉得这东西挺玄乎的——把神经网络塞进一个只有几百KB内存的芯片里?听起来像天方夜谭。但后来我发现,这事儿不仅可行,而且已经遍地开花了。
今天这一课,咱们先把地基打牢。我会带你搞清楚TFLite Micro到底是什么、能用在哪儿、需要什么硬件,然后手把手把编译环境搭起来,最后跑一个“Hello World”示例——让LED灯根据模型输出闪烁。嗯,就是这么实在。
1.1 TFLite Micro 到底是什么?
先问个问题:你平时在电脑或手机上跑TensorFlow模型,是不是觉得挺顺畅的?但如果你想把模型放到一个只有256KB Flash、64KB RAM的STM32芯片上呢?
这就是TFLite Micro的用武之地。它是TensorFlow Lite的一个子集,专门为微控制器设计的推理引擎。说白了,它就是一个超级精简的“模型运行器”,能把训练好的模型压缩、优化,然后在资源极度受限的MCU上跑起来。
我个人习惯把TFLite Micro比作“微型翻译官”。你的模型是用Python写的“外语”,而MCU只懂C语言。TFLite Micro就是那个能把模型指令翻译成C代码,让MCU理解并执行的中间人。
核心特点:
- 内存占用极小:典型场景下只需16KB RAM
- 无操作系统依赖:裸机也能跑
- 支持静态内存分配:避免运行时内存碎片
- 算子集精简:只保留最常用的几十个算子
1.2 应用场景:哪些地方已经用上了?
你可能觉得,在MCU上跑AI,性能肯定很差吧?其实不然。我去年帮一个客户做智能传感器项目,就是在STM32F4上跑了一个关键词唤醒模型,功耗只有几毫瓦,响应速度却不到100毫秒。
常见的应用场景包括:
- 语音唤醒:比如智能音箱的“小爱同学”、“Hey Siri”,其实很多是在MCU上完成的
- 手势识别:通过加速度计或摄像头,识别挥手、旋转等动作
- 异常检测:监测电机振动、电流波形,提前发现故障
- 图像分类:在摄像头模组上做简单的物体识别,比如区分猫和狗
- 传感器融合:把温度、湿度、气压数据一起输入模型,预测天气变化
我曾经踩过一个坑:有个项目要求在电池供电的设备上做连续语音识别,我一开始用了树莓派,结果电池撑不过2小时。后来换成ESP32跑TFLite Micro,功耗直接降到原来的十分之一,电池续航超过一周。这就是TFLite Micro的价值所在——在功耗和性能之间找到了最佳平衡点。
1.3 开发板选择:STM32F746 还是 ESP32?
这个问题我经常被问到。其实没有绝对的“最好”,只有“最合适”。
| 特性 | STM32F746 | ESP32 |
|---|---|---|
| 内核 | Cortex-M7 (300MHz) | Xtensa LX6 (240MHz) |
| Flash | 1MB | 4MB (外挂) |
| RAM | 320KB | 520KB |
| 浮点运算 | 硬件FPU (单精度) | 软件模拟 |
| 无线连接 | 无 (需外接) | WiFi + BLE 内置 |
| 典型价格 | 约150元 | 约30元 |
| 适合场景 | 高性能计算、图像处理 | 物联网、无线传感 |
我的建议是:
- 如果你主要做图像分类或音频处理,选STM32F746。它的硬件浮点运算单元能让你省去很多量化优化的麻烦。
- 如果你做物联网项目,需要WiFi上传数据,选ESP32。它自带无线功能,而且社区资源非常丰富。
- 如果你是初学者,我建议先从ESP32入手——便宜、资料多、烧录简单,就算烧坏了也不心疼。
小提示:我个人习惯在开发阶段用STM32F746,因为调试工具(比如ST-Link)更成熟。等模型调好了,再移植到ESP32上做产品化。这样既能享受高性能调试,又能获得低成本量产。
1.4 搭建编译环境:Arm GCC + Make/CMake
好,理论说完了,咱们来点实际的。搭建编译环境是每个嵌入式工程师的必修课。说实话,我第一次配环境的时候,光装工具链就折腾了一整天。现在我把步骤简化到最少,你跟着做就行。
1.4.1 安装 Arm GCC 工具链
Arm GCC 是编译器的核心。它能把你的C代码编译成ARM芯片能执行的机器码。
下载地址:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm
选择对应操作系统的版本:
- Windows:
gcc-arm-none-eabi-xxx-win32.zip - Linux:
gcc-arm-none-eabi-xxx-linux.tar.bz2 - macOS:
gcc-arm-none-eabi-xxx-mac.tar.bz2
安装完成后,记得把 bin 目录添加到系统环境变量。验证方法:
arm-none-eabi-gcc --version
如果看到版本号输出,说明安装成功。
注意:我曾经遇到过一个问题——装完GCC后,运行命令提示“找不到文件”。后来发现是环境变量没生效,重启终端就好了。如果你也遇到类似情况,别慌,先重启试试。
1.4.2 安装 Make 或 CMake
Make 和 CMake 都是构建工具,用来管理编译过程。简单来说,它们能帮你自动执行“编译→链接→生成二进制文件”这一整套流程。
- Make:传统工具,适合小型项目。Windows下可以用
mingw32-make,Linux/macOS自带。 - CMake:更现代的工具,能生成Makefile或Ninja构建文件。推荐新手使用。
安装CMake:
# Ubuntu/Debian
sudo apt install cmake
# macOS (Homebrew)
brew install cmake
# Windows: 下载安装包 https://cmake.org/download/
验证:
cmake --version
1.4.3 获取 TFLite Micro 源码
TFLite Micro 的源码托管在GitHub上,是TensorFlow仓库的一部分。我们只需要克隆其中的微控制器相关部分:
git clone https://github.com/tensorflow/tflite-micro.git
cd tflite-micro
这个仓库包含了所有示例代码、算子实现和构建脚本。嗯,这里要注意:仓库比较大,如果网络不好,可以只克隆最新版本:
git clone --depth 1 https://github.com/tensorflow/tflite-micro.git
1.5 Hello World 示例:让LED亮起来
终于到了最激动人心的环节——跑第一个示例。TFLite Micro 自带了一个“Hello World”项目,它的功能是:训练一个简单的正弦波预测模型,然后根据模型输出控制LED的亮度。
说白了,就是让LED按照正弦波的规律呼吸。
1.5.1 项目结构
进入 tflite-micro/tensorflow/lite/micro/examples/hello_world 目录,你会看到:
main.cc:主程序入口model.cc:预训练好的模型数据(C语言数组形式)constants.cc:一些常量定义output_handler.cc:输出处理函数(控制LED)Makefile.inc:构建配置文件
1.5.2 编译与烧录(以ESP32为例)
首先,确保你已经安装了ESP-IDF开发框架。如果没有,可以参考官方文档安装。
然后,在项目根目录执行:
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=esp TARGET_ARCH=xtensa-esp32 hello_world
编译成功后,会生成一个 .bin 文件。烧录命令:
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=esp TARGET_ARCH=xtensa-esp32 flash
如果你用的是STM32F746,命令类似,只是把 TARGET 改成 stm32f7:
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=stm32f7 hello_world
避坑指南:我曾经在烧录ESP32时,一直提示“连接超时”。后来发现是USB驱动没装好。ESP32用的是CP2102或CH340芯片,需要安装对应的驱动。如果你也遇到类似问题,先检查设备管理器里有没有识别到串口。
1.5.3 观察效果
烧录成功后,你会看到开发板上的LED开始缓慢地呼吸——从暗到亮,再从亮到暗,循环往复。这就是模型在实时计算正弦波的值,然后通过PWM控制LED亮度。
你可能会问:“这跟AI有什么关系?”
其实,这个示例的核心在于:它展示了完整的TFLite Micro工作流程——模型加载、输入填充、推理执行、输出解析。虽然只是一个正弦波,但换成任何分类或回归模型,流程都是一模一样的。
1.6 本章小结
好了,第一课的内容就到这里。我们做了几件事:
- 理解了TFLite Micro是什么——一个在MCU上跑AI模型的轻量级引擎
- 了解了它的应用场景——语音、手势、异常检测等
- 对比了STM32F746和ESP32的优劣——根据需求选择
- 搭建了编译环境——Arm GCC + Make/CMake
- 跑通了Hello World示例——让LED呼吸起来
下一课,我们会深入模型转换和量化的细节。你会学到如何把Keras训练好的模型转换成TFLite格式,再进一步量化为int8,让它在MCU上跑得更快。
记住,嵌入式AI的核心不是模型有多复杂,而是如何在资源受限的情况下,把模型跑得又快又准。咱们一步一步来。
有任何问题,欢迎在课程群里交流。下节课见!