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为例)

安装过程其实不复杂,但有几个坑。我踩过,你注意避开。

  1. 下载MDK:去Keil官网下载MDK-ARM最新版。别下成C51了,那是51单片机的。
  2. 安装路径:默认路径是C:\Keil_v5。我建议别改,因为后面CMSIS-Pack会自动识别这个路径。
  3. 破解(学习用):运行注册机,以管理员身份打开MDK,在File-License Management里输入CID生成激活码。
  4. 安装设备支持包:打开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一键生成,省心。

配置要点:

  1. 选择芯片:在Part Number里输入你的型号,比如STM32F407VGT6。
  2. 时钟配置:HCLK拉到最大(比如168MHz)。CMSIS-NN的推理速度跟主频直接挂钩,能跑多快跑多快。
  3. 调试接口:在SYS里选择Serial Wire。不然下载器连不上。
  4. 串口配置:使能USART1,波特率115200。用来打印推理结果。
  5. 生成工程: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 知识体系总览

下面这张图把整个开发环境的结构画清楚了。你可以把它当作地图,后面每章都会对应到其中一个模块。

CMSIS-NN 开发环境知识体系 编译器 (MDK/IAR) CMSIS-Pack STM32CubeMX CMSIS-NN 核心库 (arm_nnfunctions.h) STM32F4 系列 STM32F7 系列 STM32H7 系列 关键依赖关系 编译器 → CMSIS-Pack → 硬件平台 CubeMX 生成初始化代码,与 CMSIS-NN 库链接

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加速,方便对比测试。