1. 课程导学与环境搭建:从零开始点亮第一盏灯

大家好,欢迎来到这门实战课。我是你们的讲师,一个在嵌入式圈子里摸爬滚打了十几年的老工程师。

这一章,我们不急着写代码。先把吃饭的家伙准备好,再点个灯庆祝一下。你想想看,环境没搭好,后面再牛的代码也跑不起来,对吧?

1.1 STM32 与 HAL 库:为什么选它们?

STM32 是意法半导体的王牌产品线。从简单的 Cortex-M0 到高性能的 M7,覆盖了你能想到的大部分嵌入式场景。我个人习惯把 STM32 比作瑞士军刀——型号多、外设全、生态好。

那 HAL 库是什么?说白了,就是官方帮你封装好的外设驱动层。你不需要对着寄存器手册一页页翻,调用几个 API 就能把外设用起来。

核心观点: HAL 库牺牲了一点性能,换来了极大的开发效率。对于项目周期紧、维护成本高的产品,HAL 库是更务实的选择。

我记得刚入行那会儿,用的是标准外设库。每次换芯片型号,代码得重写一大半。HAL 库的硬件抽象层设计,让代码在不同型号间的移植变得轻松很多。

1.2 开发板介绍:我们用什么硬件?

本课程以 STM32F103C8T6(蓝色 pill 板)和 STM32F407VGT6(探索者板)为主。为什么选这两款?

  • F103:经典中的经典,资料多,适合入门。
  • F407:带 FPU 和 DSP 指令,适合进阶和 ADC 高速采集。
参数 STM32F103C8T6 STM32F407VGT6
内核 Cortex-M3 Cortex-M4F
主频 72 MHz 168 MHz
Flash 64 KB 1 MB
SRAM 20 KB 192 KB
ADC 通道 10 通道 24 通道
我的建议: 如果你手头有其他型号,也没关系。HAL 库的 API 是统一的,换芯片只需要改一下 CubeMX 的配置。

1.3 STM32CubeMX 安装与配置

CubeMX 是 ST 官方推出的图形化配置工具。它能帮你生成初始化代码,省去手写配置的繁琐。

安装步骤很简单,但我还是踩过坑。曾经有一次,我装了个旧版本,结果生成的代码跟 HAL 库版本不匹配,编译报错一堆。嗯,这里要注意:

  1. 去 ST 官网下载最新版 CubeMX(需要注册账号)。
  2. 安装时选择 Java 运行环境(JRE),CubeMX 依赖它。
  3. 安装完成后,打开 CubeMX,进入 Help → Manage embedded software packages,下载你需要的芯片包。
避坑指南: 我曾经因为网络问题,下载芯片包失败了好几次。建议用有线网络,或者换个时间段再试。如果实在不行,可以手动下载包文件然后离线安装。

1.4 MDK-ARM / IAR IDE 安装

IDE 的选择,看个人习惯。我用 MDK-ARM 多一些,因为它的调试器跟 ST-Link 配合得很好。IAR 的编译优化更强,但上手门槛稍高。

对比项 MDK-ARM IAR EWARM
编译器 ARMCC / AC6 IAR C/C++
调试器支持 ST-Link, J-Link ST-Link, J-Link
代码大小限制 32KB(免费版) 无限制(评估版有天数限制)
个人推荐 入门首选 产品级开发

安装时记得勾选 添加环境变量,不然命令行编译会找不到工具链。我见过不少新手卡在这一步。

1.5 第一个 HAL 库工程:点灯

点灯是嵌入式界的 Hello World。别小看它,这里面包含了时钟配置、GPIO 初始化、HAL 库调用等核心流程。

我们一步步来:

  1. 打开 CubeMX,新建工程,选择你的芯片型号。
  2. 配置时钟源:选择 HSE(外部晶振),在 Clock Configuration 页面把 HCLK 设为 72MHz(F103)或 168MHz(F407)。
  3. 配置 GPIO:找到 PC13(板载 LED 引脚),设置为 Output 模式,推挽输出,无上拉。
  4. 生成代码:Project → Generate Code,选择 MDK-ARM 或 IAR 版本。
  5. 编写主函数:
int main(void)
{
  HAL_Init();                    // 初始化 HAL 库
  SystemClock_Config();          // 配置系统时钟
  MX_GPIO_Init();                // 初始化 GPIO

  while (1)
  {
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);  // 翻转 LED
    HAL_Delay(500);                           // 延时 500ms
  }
}
关键点: HAL_Delay() 依赖于 SysTick 中断。如果你的工程里关了全局中断,延时就不准了。我在一个低功耗项目里就吃过这个亏。

编译、下载,你应该能看到板载 LED 以 1 秒的频率闪烁。如果没亮,别慌,检查这几项:

  • LED 引脚是不是 PC13?有些板子用的是 PA5 或 PB2。
  • 时钟配置对不对?HSE 起振了吗?
  • 下载器连接是否正常?ST-Link 的驱动装了没?
小技巧: 如果 LED 不亮,可以用示波器或逻辑分析仪抓一下引脚波形。没有仪器的话,用万用表测电压也行——高电平 3.3V,低电平 0V,说明代码在跑。

1.6 本章知识体系

下面这张图,帮你把本章的核心脉络理清楚:

第一章知识体系图 第一章:课程导学与环境搭建 STM32 + HAL 库 开发板选型 CubeMX 配置 IDE 安装 点灯工程 📌 核心流程 选板 → 安装 CubeMX → 配置时钟/GPIO → 生成代码 → 编写主逻辑 → 编译下载 每一步都有坑,但踩过去就是经验。后面章节我们会深入每个外设的细节。

环境搭好了,灯也亮了,恭喜你迈出了第一步。后面的章节,我们会深入 GPIO、定时器、串口、ADC 等外设,每一章都会有实战案例和故障排查经验。准备好了吗?我们继续。