1. 课程导论与开发环境搭建:AI on STM32 的生态全景
各位同学,欢迎来到《STM32嵌入式AI外设驱动与推理性能调优实战》的第一章。
说实话,嵌入式AI这几年火得不行。我经常被问到:“STM32这种MCU,真的能跑AI吗?” 我的回答一直是:能,而且效果超出你想象。关键在于——你得知道怎么选模型、怎么优化、怎么把外设和推理引擎拧成一股绳。
这一章,我们先搭好台子。把工具链、硬件平台、软件生态理清楚。后面再唱戏,才不慌。
1.1 AI on STM32 的生态全景
先看一张图,把整个生态串起来。
这张图我画了很多次。每次给客户做方案,第一件事就是拿这张图讲清楚:AI 不是只跑个模型就完事。外设怎么采数据、驱动怎么配合、推理性能怎么压榨,每一步都有坑。
整个生态可以拆成四层:
- 模型训练层:在 PC 上用 TensorFlow / PyTorch / Keras 训练你的神经网络。这一步跟普通 AI 没区别。
- 模型转换层:用 ST 官方的 X-CUBE-AI 扩展包,把训练好的模型转成 STM32 能吃的格式。说白了,就是把浮点模型量化成 int8,再生成 C 代码。
- 部署推理层:在 MCU 上跑推理。这里要跟外设驱动配合——摄像头采图、传感器读数、推理结果控制执行器。
- 硬件平台层:我们用的是 NUCLEO-H743ZI2,搭载 STM32H743 芯片,Cortex-M7 内核,480MHz 主频,2MB Flash,1MB RAM。跑轻量级 CNN 完全够用。
核心观点:嵌入式 AI 不是“把模型塞进 MCU”就完事。外设驱动、数据流、推理性能,三者必须一起优化。这也是这门课的核心思路。
1.2 STM32CubeMX 与 CubeIDE 安装
工欲善其事,必先利其器。我们先装好开发环境。
1.2.1 STM32CubeMX
CubeMX 是 ST 的图形化配置工具。用它来初始化时钟、外设、引脚,生成 HAL 库代码。我个人习惯是:所有项目都用 CubeMX 生成基础代码,再手动加业务逻辑。这样省去大量手写寄存器的时间。
安装步骤:
- 去 ST 官网下载 STM32CubeMX 最新版(目前是 6.x)。需要注册账号,免费。
- 运行安装包,一路 Next。注意安装路径不要有中文。
- 安装完成后,打开 CubeMX,它会自动检查更新。建议更新到最新固件包。
- 在 Help → Manage embedded software packages 里,下载 STM32H7 系列的固件包。我们用的是 H743,选 STM32H7xx 即可。
小技巧:CubeMX 的固件包下载速度有时很慢。我曾经挂了一整夜才下完。建议用手机热点或者换个时间段试试。实在不行,去 ST 官网手动下载 zip 包,再通过 CubeMX 的“From Local”导入。
1.2.2 STM32CubeIDE
CubeIDE 是 ST 官方的集成开发环境,基于 Eclipse 魔改。集成了编译器、调试器、代码编辑功能。说白了,就是一站式搞定。
安装步骤:
- 同样去 ST 官网下载 STM32CubeIDE 最新版。
- 安装时注意选择“Install for all users”还是“Current user”。我建议选当前用户,避免权限问题。
- 安装完成后,首次启动会提示选择工作空间。建议单独建一个文件夹,比如
D:\STM32_Workspace。 - 在 CubeIDE 里,可以通过 File → New → STM32 Project 直接调用 CubeMX 生成项目。两者已经深度集成。
避坑指南:我曾经遇到过 CubeIDE 编译时提示“arm-none-eabi-gcc not found”。原因是安装路径有空格。解决办法:重装 CubeIDE 到纯英文路径,或者手动配置环境变量。嗯,这里要注意,ST 的工具链对路径空格很敏感。
1.3 X-CUBE-AI 扩展包部署
X-CUBE-AI 是 ST 官方的 AI 扩展包。它的作用是把训练好的模型转成 STM32 能跑的 C 代码,并提供推理运行时库。
部署步骤:
- 打开 CubeMX,在 Pinout & Configuration 界面,找到 Software Packs → Select Components。
- 在列表里找到 X-CUBE-AI,勾选。版本建议选最新的稳定版(目前是 8.x)。
- 点击 Install,CubeMX 会自动下载并安装扩展包。
- 安装完成后,在 Pinout & Configuration 界面会出现 X-CUBE-AI 的配置选项。这里可以导入模型文件(.h5 / .tflite / .onnx 等),配置量化参数、内存分配等。
我举个例子,导入一个 Keras 模型:
// 在 CubeMX 中配置 X-CUBE-AI
// 1. 选择模型文件:model.h5
// 2. 选择量化类型:int8(默认)
// 3. 选择 RAM 分配策略:System
// 4. 点击 Generate Code
// 生成的代码结构大致如下:
// - app_x-cube-ai.c / .h:主推理接口
// - network.c / .h:模型权重和网络结构
// - ai_platform_interface.c:平台适配层
注意:X-CUBE-AI 生成的代码默认使用浮点运算。如果你想要更高的性能,一定要开启量化(int8)。量化后的模型体积缩小 4 倍,推理速度提升 2-3 倍。代价是精度略有下降,但大多数场景下可以接受。
1.4 硬件平台:NUCLEO-H743ZI2 介绍
我们这门课用的开发板是 NUCLEO-H743ZI2。为什么选它?
| 参数 | 值 | 说明 |
|---|---|---|
| 主控芯片 | STM32H743ZIT6 | Cortex-M7,480MHz |
| Flash | 2MB | 存放代码和模型权重 |
| SRAM | 1MB(含 512KB DTCM + 288KB SRAM1/2/3) | 推理时存放中间特征图 |
| 外设接口 | DCMI(摄像头)、SPI、I2C、UART、USB、ETH | 连接传感器、摄像头、显示器等 |
| 板载调试器 | ST-LINK/V3 | 支持 SWD 调试,虚拟串口 |
| 扩展接口 | Arduino Uno V3 + ST Morpho | 兼容大量扩展板 |
这块板子的亮点在于:
- 480MHz 主频:跑轻量级 CNN(比如 MobileNetV1 0.25)单次推理只要 20-30ms。
- 1MB SRAM:足够存放 int8 量化后的模型和中间结果。我做过测试,一个 100KB 的模型,推理时峰值内存占用约 300KB,完全够用。
- DCMI 接口:可以直接接 OV2640 等摄像头模块,实现实时图像采集+AI 推理。这是后面章节的重点。
个人经验:如果你手头没有 NUCLEO-H743ZI2,用 NUCLEO-H723ZG 或者 NUCLEO-F767ZI 也可以。但要注意,Flash 和 RAM 大小不同,模型大小和推理性能会有差异。我建议还是用 H743,性价比最高。
1.5 开发环境验证:点亮第一颗 LED
环境装好了,板子拿到了。我们先跑一个最简单的程序——点灯。确保整个工具链没问题。
步骤:
- 打开 CubeMX,新建项目,选择 NUCLEO-H743ZI2。
- 在 Pinout 界面,找到 PB0(板载 LED 引脚),设置为 GPIO_Output。
- 配置时钟:HSE 8MHz,PLL 倍频到 480MHz。
- 生成代码,用 CubeIDE 打开。
- 在
main.c的while(1)里添加:
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
HAL_Delay(500); // 500ms 闪烁
- 编译、下载。如果 LED 以 1Hz 频率闪烁,说明环境搭建成功。
避坑指南:我第一次用 CubeMX 生成 H743 项目时,发现程序跑不起来。查了半天,原来是时钟配置错了——H743 的 PLL 输入频率不能超过 25MHz。我用的外部晶振是 8MHz,PLL 倍频系数设成了 60,结果超了。后来改成 48 倍频,输出 384MHz,稳定运行。嗯,这里要注意,H7 系列的时钟树比 F4 复杂,一定要仔细看 Reference Manual。
1.6 本章小结
这一章我们做了三件事:
- 理清了 STM32 嵌入式 AI 的生态全景——从训练到部署,从外设到调优。
- 装好了 CubeMX、CubeIDE、X-CUBE-AI 扩展包。
- 认识了 NUCLEO-H743ZI2 硬件平台,并成功点灯验证环境。
从下一章开始,我们会真正进入 AI 推理的世界。先跑一个最简单的模型,感受一下 STM32 跑 AI 是什么体验。
准备好了吗?我们继续。