4. STM32CubeMX 项目创建:选型、时钟与调试
好,咱们正式开始动手。前面几章聊了AI落地的思路和传感器选型,现在要落地到真正的工程上。我个人习惯,拿到一个新项目,第一件事不是写代码,而是先把CubeMX的项目骨架搭好。这一步要是歪了,后面所有工作都得推倒重来。
说白了,CubeMX就是STM32的“项目生成器”。你告诉它用什么芯片、要哪些外设、跑多快,它帮你把初始化代码、时钟配置、引脚分配全搞定。咱们这章就聚焦三个核心动作:选MCU、配时钟、设调试接口。
4.1 选MCU:L4、F4还是H7?
做AI推理,MCU选型直接决定了你能跑多大的模型、跑多快。我见过不少新手,一上来就选最顶配的H7,结果发现功耗压不住,或者根本用不上那么多资源。你想想看,选MCU其实就三个维度:算力、功耗、内存。
| 系列 | 内核 | 主频 | SRAM | 典型场景 |
|---|---|---|---|---|
| STM32L4 | Cortex-M4F | 80 MHz | 128-640 KB | 低功耗传感器节点、电池供电 |
| STM32F4 | Cortex-M4F | 168-180 MHz | 192-1024 KB | 通用控制、中等算力需求 |
| STM32H7 | Cortex-M7 | 400-550 MHz | 1-2 MB | 高性能AI推理、复杂信号处理 |
咱们这门课,我选STM32L4作为主力平台。为什么?因为AI模型部署到边缘端,功耗往往是第一位的。L4的80MHz主频配合Cortex-M4F的浮点单元,跑个TinyML模型绰绰有余。我在一个温湿度异常检测项目里,就用L4跑了个2层全连接网络,推理一次只要1.2ms,整机功耗不到10mW。
4.2 时钟树配置:别让CPU饿着
时钟树,说白了就是给芯片各个模块分配“心跳”。CPU要跑多快、外设要跑多快,全靠这里配。我刚开始学的时候,总觉得时钟树很复杂,各种PLL、分频器、倍频器。其实你只要记住一条:先定系统时钟,再分给外设。
在CubeMX里,时钟树配置在Clock Configuration标签页。咱们以L4为例,标准操作流程是这样的:
- 选择时钟源:一般用外部晶振HSE(8MHz),比内部RC振荡器准得多。
- 配置PLL:把8MHz倍频到80MHz。L4的PLL有倍频系数N和分频系数M,公式是:
PLL输出 = HSE / M * N。 - 设置系统时钟:把PLL输出作为SYSCLK,然后通过AHB分频器给到CPU和总线。
- 外设时钟:APB1和APB2总线上的外设,按需分频。一般APB1跑80MHz,APB2也跑80MHz。
下面这张图,是我整理的L4时钟树配置流程。你可以照着这个思路去配,基本不会出错。
4.3 调试接口配置:SWD是标配
调试接口,说白了就是你和芯片“对话”的通道。以前用JTAG,20个引脚,占地方。现在主流都用SWD(Serial Wire Debug),只要两根线:SWDIO(数据)和SWCLK(时钟),再加一个GND,就能完成下载和调试。
在CubeMX里,配置SWD很简单:
- 进入Pinout & Configuration标签页。
- 在左侧System Core里找到SYS。
- 在Debug下拉菜单里,选择Serial Wire。
就这么三步。CubeMX会自动把PA13(SWDIO)和PA14(SWCLK)分配好,其他引脚全部释放给你用。
4.4 生成基础工程:一键搞定
配置完MCU、时钟和调试接口,就可以生成工程了。CubeMX支持多种IDE:MDK-ARM(Keil)、IAR、STM32CubeIDE。我个人推荐用STM32CubeIDE,免费、集成CubeMX、调试功能也够用。
生成步骤:
- 点击菜单栏的Project → Generate Code。
- 选择工程路径和IDE类型。
- 勾选Generate peripheral initialization as a pair of .c/.h files per peripheral(每个外设单独生成.c/.h文件,方便管理)。
- 点击OK,等待生成完成。
生成后,你会看到这样的工程结构:
MyProject/
├── Core/
│ ├── Inc/ # 头文件
│ │ ├── main.h
│ │ ├── stm32l4xx_hal_conf.h
│ │ └── ...
│ └── Src/ # 源文件
│ ├── main.c
│ ├── stm32l4xx_hal_msp.c
│ └── ...
├── Drivers/
│ ├── CMSIS/ # ARM内核抽象层
│ └── STM32L4xx_HAL_Driver/ # HAL库驱动
├── .mxproject # CubeMX项目文件
└── *.ioc # CubeMX图形配置文件
嗯,到这里,基础工程就生成了。你可以编译一下,看看有没有报错。正常情况下,应该零错误零警告。