1. 课程导入与开发环境搭建
说实话,我见过太多初学者一上来就急着写代码,结果卡在环境配置上半天。嵌入式开发的第一步,就是把工具链理顺。这章咱们就把 STM32CubeMX、MDK-ARM(或者 IAR)装好,再聊聊 LL 库和 HAL 库到底怎么选。最后,我会带你创建一个干干净净的工程模板。
本章核心目标:装好三件套(CubeMX + IDE + 工具链),理解库的选择逻辑,能独立创建并编译一个空工程。
1.1 STM32CubeMX 安装:图形化配置的起点
STM32CubeMX 是 ST 官方出的图形化配置工具。你用它点一点,就能生成初始化代码。我个人习惯,所有新项目都从 CubeMX 开始,省时省力。
安装步骤:
- 去 ST 官网下载最新版 STM32CubeMX(需要注册账号,免费)。
- 运行安装包,一路 Next。注意安装路径不要有中文。
- 安装完成后,打开软件,它会提示你安装固件包(Firmware Package)。
- 在 Help → Manage embedded software packages 里,选择你用的芯片系列(比如 STM32F4、STM32L0),下载对应的固件包。
我的小技巧:固件包很大,建议只下载你需要的系列。我刚开始时一股脑全下了,硬盘直接爆红。
1.2 MDK-ARM / IAR 安装:选一个顺手的 IDE
MDK-ARM(Keil)和 IAR 是两家主流的嵌入式 IDE。它们都能用,但各有脾气。
| 对比项 | MDK-ARM (Keil) | IAR Embedded Workbench |
|---|---|---|
| 上手难度 | 较低,资料多 | 稍高,但编译优化强 |
| 代码大小限制 | 免费版 32KB | 免费版 32KB(部分版本) |
| 调试器支持 | J-Link, ST-Link 都行 | J-Link 首选,ST-Link 需配置 |
| 个人推荐场景 | 初学者、中小项目 | 对代码体积/性能有要求 |
安装注意:
- MDK-ARM:安装后需要注册(License Management),否则编译有 32KB 限制。
- IAR:安装时选择对应芯片架构(ARM Cortex-M)。
- 两者都建议安装到默认路径,避免环境变量问题。
我曾经踩过的坑:MDK 安装后没装 Device Pack,结果编译报错说找不到芯片。记得在 Pack Installer 里下载对应型号的 SVD 文件。
1.3 LL 库与 HAL 库选择策略:别纠结,看场景
很多新手会问:到底学 HAL 还是 LL?我的答案是:都学,但分场景用。
HAL 库(硬件抽象层):
- 封装度高,函数名长,但易读。
- 适合快速开发、不关心底层细节的场景。
- 缺点:代码体积大,中断响应慢。
LL 库(底层库):
- 接近寄存器操作,函数名短,效率高。
- 适合对时序敏感、资源受限的场景。
- 缺点:需要你对芯片寄存器有一定了解。
我个人的策略很简单:
- 项目初期用 HAL 快速验证功能。
- 性能瓶颈处,用 LL 重写关键代码。
- 两者可以混用,CubeMX 生成的代码里 HAL 和 LL 是兼容的。
一句话总结:HAL 是自动挡,LL 是手动挡。先学会自动挡上路,再学手动挡飙车。
1.4 第一个工程模板创建:从零到能跑
咱们直接动手。我以 STM32F103C8T6(蓝色 pill 板)为例,创建一个 GPIO 翻转的模板工程。
步骤:
- 打开 CubeMX,点击 New Project。
- 在 Board Selector 里搜索 STM32F103C8,选中后双击。
- 在 Pinout & Configuration 界面,配置一个 GPIO 为输出(比如 PA5)。
- 在 Project Manager 里设置工程名、路径,选择 IDE 为 MDK-ARM(或 IAR)。
- 点击 GENERATE CODE,生成代码。
- 用 MDK 打开生成的 .uvprojx 文件,编译。
编译通过后,你会在 main.c 里看到类似这样的代码:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
HAL_Delay(500);
}
}
这就是一个最基础的模板。每次新项目,我都从这个模板开始改。
我的习惯:生成代码后,我会手动把 HAL_Delay 换成基于定时器的延时,因为 HAL_Delay 会阻塞 CPU。但初期调试,用它没问题。
1.5 知识体系总览:一张图看懂本章
下面这张 SVG 图,把本章的核心逻辑串起来了。你一看就明白:工具、库、模板,这三者怎么配合。
1.6 避坑指南:我替你试过错
环境搭建这一步,说简单也简单,说烦也烦。我把自己踩过的坑列出来,你遇到了直接翻这里。
- 路径有中文:CubeMX 生成的工程路径、IDE 安装路径,都不要有中文。否则编译报错,你查半天都查不到原因。
- 固件包版本不匹配:CubeMX 生成的代码,依赖特定版本的固件包。如果你手动更新了固件包,最好重新生成一次代码。
- 调试器驱动没装:ST-Link 驱动没装好,IDE 就识别不到调试器。去 ST 官网下载 ST-Link 驱动,或者用 Zadig 工具安装。
- MDK 编译报错说找不到芯片:去 Pack Installer 里下载对应芯片的 Device Family Pack。
我曾经犯过的错:有次我图省事,把 CubeMX 生成的代码直接复制到另一个工程里,结果时钟配置全乱了。后来我学乖了:每个新工程都从 CubeMX 重新生成,不偷懒。