1. 课程导入与开发环境搭建

说实话,我见过太多初学者一上来就急着写代码,结果卡在环境配置上半天。嵌入式开发的第一步,就是把工具链理顺。这章咱们就把 STM32CubeMX、MDK-ARM(或者 IAR)装好,再聊聊 LL 库和 HAL 库到底怎么选。最后,我会带你创建一个干干净净的工程模板。

本章核心目标:装好三件套(CubeMX + IDE + 工具链),理解库的选择逻辑,能独立创建并编译一个空工程。

1.1 STM32CubeMX 安装:图形化配置的起点

STM32CubeMX 是 ST 官方出的图形化配置工具。你用它点一点,就能生成初始化代码。我个人习惯,所有新项目都从 CubeMX 开始,省时省力。

安装步骤:

  1. 去 ST 官网下载最新版 STM32CubeMX(需要注册账号,免费)。
  2. 运行安装包,一路 Next。注意安装路径不要有中文。
  3. 安装完成后,打开软件,它会提示你安装固件包(Firmware Package)。
  4. 在 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 翻转的模板工程。

步骤:

  1. 打开 CubeMX,点击 New Project。
  2. 在 Board Selector 里搜索 STM32F103C8,选中后双击。
  3. 在 Pinout & Configuration 界面,配置一个 GPIO 为输出(比如 PA5)。
  4. 在 Project Manager 里设置工程名、路径,选择 IDE 为 MDK-ARM(或 IAR)。
  5. 点击 GENERATE CODE,生成代码。
  6. 用 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 图,把本章的核心逻辑串起来了。你一看就明白:工具、库、模板,这三者怎么配合。

开发环境搭建知识体系 开发环境搭建核心流程 STM32CubeMX MDK-ARM / IAR HAL / LL 库 图形化引脚配置 时钟树设置 生成初始化代码 编译 / 链接 下载 / 调试 仿真 / 断点 HAL:快速开发 LL:高性能 混用:取长补短 最终产出:一个可编译、可下载、可调试的 STM32 工程模板 后续所有章节的代码,都基于这个模板展开

1.6 避坑指南:我替你试过错

环境搭建这一步,说简单也简单,说烦也烦。我把自己踩过的坑列出来,你遇到了直接翻这里。

  • 路径有中文:CubeMX 生成的工程路径、IDE 安装路径,都不要有中文。否则编译报错,你查半天都查不到原因。
  • 固件包版本不匹配:CubeMX 生成的代码,依赖特定版本的固件包。如果你手动更新了固件包,最好重新生成一次代码。
  • 调试器驱动没装:ST-Link 驱动没装好,IDE 就识别不到调试器。去 ST 官网下载 ST-Link 驱动,或者用 Zadig 工具安装。
  • MDK 编译报错说找不到芯片:去 Pack Installer 里下载对应芯片的 Device Family Pack。

我曾经犯过的错:有次我图省事,把 CubeMX 生成的代码直接复制到另一个工程里,结果时钟配置全乱了。后来我学乖了:每个新工程都从 CubeMX 重新生成,不偷懒。