2. 开发环境搭建:MDK/IAR安装、CMSIS-Pack安装、STM32CubeMX配置、硬件准备
说实话,很多初学者在AI模型上花了大把时间,结果卡在环境搭建这一步。我见过不少朋友,模型量化都做完了,却发现开发板点不亮。嗯,这章我们就来把这摊事理顺。
开发环境说白了就四样东西:编译器(MDK或IAR)、CMSIS软件包、CubeMX配置工具、以及一块能跑的板子。下面我按自己的习惯,一步步说清楚。
核心思路:先装工具链,再装算法库,最后用CubeMX生成工程框架。顺序别搞反,否则你会遇到各种路径找不到的玄学问题。
2.1 编译器选择:MDK vs IAR
我个人习惯用MDK(Keil MDK-ARM),原因很简单:CMSIS-NN的官方示例大部分都是MDK工程。但IAR也有它的优势,比如代码体积优化更好。怎么选?看下表:
| 对比项 | MDK (Keil) | IAR Embedded Workbench |
|---|---|---|
| CMSIS-NN支持 | 原生支持,示例最多 | 需手动导入,兼容性好 |
| 调试体验 | 与STM32CubeIDE深度集成 | 独立调试器,速度更快 |
| 代码体积 | 中等 | 通常更小(优化等级高) |
| 许可证费用 | MDK-Plus约$5000 | IAR约$8000 |
| 我的推荐 | 初学者首选 | 产品级开发 |
小技巧:如果你只是学习,MDK的32KB代码限制版完全够用。CMSIS-NN的推理代码通常不会超过20KB。我刚开始学的时候就用这个版本,跑了三个模型都没问题。
2.2 安装步骤(以MDK为例)
安装过程其实不复杂,但有几个坑。我踩过,你注意避开。
- 下载MDK:去Keil官网下载MDK-ARM最新版。别下成C51了,那是51单片机的。
- 安装路径:默认路径是
C:\Keil_v5。我建议别改,因为后面CMSIS-Pack会自动识别这个路径。 - 破解(学习用):运行注册机,以管理员身份打开MDK,在File-License Management里输入CID生成激活码。
- 安装设备支持包:打开Pack Installer,找到你的芯片型号(比如STM32F407VG),点击Install。
注意:我曾经在安装过程中把路径改成了中文文件夹,结果编译时报了一堆莫名其妙的错误。折腾了两天才发现是路径问题。所以——路径里不要出现中文,不要有空格,老老实实用英文。
2.3 CMSIS-Pack安装
CMSIS-Pack是ARM官方提供的软件包集合。CMSIS-NN就藏在里面。安装方式有两种:
- 方式一(推荐):在MDK的Pack Installer里搜索“CMSIS”,找到“ARM::CMSIS”点击Install。版本选最新的5.9.0以上,因为CMSIS-NN从5.7.0开始才稳定。
- 方式二(手动):去ARM官网下载CMSIS包,解压到
C:\Keil_v5\ARM\Pack\ARM\CMSIS\5.9.0。适合离线环境。
装完之后,你可以在安装目录下找到CMSIS-NN的头文件和源码:
C:\Keil_v5\ARM\Pack\ARM\CMSIS\5.9.0\CMSIS\NN\Include
C:\Keil_v5\ARM\Pack\ARM\CMSIS\5.9.0\CMSIS\NN\Source
这里面有arm_nnfunctions.h,就是我们要调用的核心API。后面章节会详细讲怎么用。
2.4 STM32CubeMX配置
CubeMX的作用是生成初始化代码。你想想看,如果手写时钟配置、GPIO初始化、DMA设置,那得写到什么时候?CubeMX一键生成,省心。
配置要点:
- 选择芯片:在Part Number里输入你的型号,比如STM32F407VGT6。
- 时钟配置:HCLK拉到最大(比如168MHz)。CMSIS-NN的推理速度跟主频直接挂钩,能跑多快跑多快。
- 调试接口:在SYS里选择Serial Wire。不然下载器连不上。
- 串口配置:使能USART1,波特率115200。用来打印推理结果。
- 生成工程:Toolchain选MDK-ARM,生成代码。
个人经验:我习惯在CubeMX里把堆栈设大一点。Heap设0x1000,Stack设0x2000。CMSIS-NN推理时会申请临时缓冲区,堆太小会直接HardFault。别问我怎么知道的……
2.5 硬件准备
硬件方面,你需要一块带FPU的STM32开发板。CMSIS-NN依赖硬件浮点运算单元(FPU)做量化反量化。没有FPU的板子(比如F1系列)也能跑,但速度会慢很多。
| 系列 | 典型型号 | 主频 | SRAM | 适合场景 |
|---|---|---|---|---|
| STM32F4 | F407VG, F429ZI | 168MHz | 192KB | 入门学习,小模型 |
| STM32F7 | F767ZI, F746NG | 216MHz | 512KB | 中等模型,实时推理 |
| STM32H7 | H743ZI, H750VB | 480MHz | 1MB+ | 复杂模型,多路推理 |
我个人推荐初学者用STM32F407VGT6的探索板。便宜(某宝100出头),资料多,跑个手写数字识别绰绰有余。等你把流程跑通了,再上H7不迟。
避坑指南:买板子时注意看版本。比如STM32F407VGT6有V版本和Z版本,V版本是512KB Flash,Z版本是1MB。CMSIS-NN的模型权重文件通常几百KB,512KB可能不够用。我当初就买错了,后来不得不换板子。
2.6 知识体系总览
下面这张图把整个开发环境的结构画清楚了。你可以把它当作地图,后面每章都会对应到其中一个模块。
2.7 验证环境是否搭好
装完别急着写代码。先跑一个空工程,确认环境没问题。
// 在main.c里添加以下代码,验证CMSIS-NN头文件是否可用
#include "arm_nnfunctions.h"
int main(void)
{
// 如果编译通过,说明环境搭建成功
// 如果报错"cannot open source file",检查CMSIS-Pack路径
while(1);
}
编译通过后,用ST-Link下载到板子。如果LED闪烁(或者串口打印出信息),恭喜你,环境搭好了。
我的习惯:我会在工程里加一个#ifdef CMSIS_NN的宏定义,用来条件编译。这样同一个工程可以切换是否启用CMSIS-NN加速,方便对比测试。