第一章 课程导学与开发环境搭建
各位同学好,我是你们的嵌入式讲师。做 STM32 开发这些年,从标准库一路用到 HAL 库,踩过的坑确实不少。今天咱们就从选型开始,一步步把环境搭好,点亮第一颗 LED。
1.1 STM32 系列选型指南
选型这事儿,说白了就是「够用就好」。我见过不少新手一上来就上 F4、F7,结果大部分外设根本没用上,成本还高。
| 系列 | 内核 | 主频 | 典型应用 |
|---|---|---|---|
| STM32F0 | Cortex-M0 | 48 MHz | 简单控制、替代 8 位机 |
| STM32F1 | Cortex-M3 | 72 MHz | 工业控制、电机驱动 |
| STM32F4 | Cortex-M4F | 168 MHz | DSP、音频、图像处理 |
| STM32L4 | Cortex-M4F | 80 MHz | 低功耗、电池供电 |
| STM32H7 | Cortex-M7 | 480 MHz | 高性能计算、AI 边缘 |
我的建议:初学者从 F103C8T6 起步,资料多、价格低、够用。等把 HAL 库摸透了,再考虑升级。
1.2 HAL 库与标准库对比
很多老工程师习惯用标准库,觉得 HAL 库太臃肿。我个人觉得,这得看场景。
- 标准库:直接操作寄存器,代码量小,执行效率高。但移植性差,换个芯片型号就得重写。
- HAL 库:封装了底层细节,通过 CubeMX 配置,代码自动生成。移植方便,但代码体积大,中断响应稍慢。
我刚开始用 HAL 库时也嫌它啰嗦,直到有一次项目需要从 F1 换到 F4,标准库的代码改了两天。换成 HAL 库后,CubeMX 重新生成一下,半天搞定。嗯,从那以后我就彻底倒向 HAL 库了。
注意:HAL 库的中断处理函数里尽量不要做耗时操作,否则会影响实时性。我见过有人直接在中断里做 printf,结果系统卡死。
1.3 Keil MDK 与 STM32CubeMX 安装
环境搭建其实不难,但版本匹配容易出问题。我建议按以下步骤来:
- 安装 Keil MDK:去官网下载最新版,安装时选好器件包(STM32F1 系列对应 Keil.STM32F1xx_DFP)。
- 安装 STM32CubeMX:同样官网下载,注意 Java 环境要配好。我遇到过 Java 版本不对导致 CubeMX 打不开的情况。
- 配置调试器:ST-Link 驱动要装好,Keil 里选对调试器型号。
避坑指南:我曾经装完 Keil 后发现编译报错,折腾半天才发现是器件包版本和芯片型号不匹配。所以,装完先建个空工程试试编译。
1.4 第一个 LED 闪烁工程
理论说再多,不如动手点个灯。咱们用 CubeMX 生成一个工程,控制 PB0 引脚上的 LED 闪烁。
CubeMX 配置步骤:
- 新建工程,选择 STM32F103C8
- 在 Pinout 视图里,将 PB0 设置为 GPIO_Output
- Clock Configuration 里,HCLK 设为 72 MHz
- Project Manager 里,选择 MDK-ARM V5,生成代码
代码实现:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
HAL_Delay(500);
}
}
这段代码很简单:初始化 HAL 库、配置时钟、初始化 GPIO,然后在主循环里每隔 500ms 翻转一次引脚电平。
小技巧:HAL_Delay 依赖 SysTick 中断,如果你在中断里调用了 HAL_Delay,会导致死锁。我一般用定时器做延时,或者自己写一个非阻塞延时函数。
1.5 本章知识体系
下面这张图概括了本章的核心内容,方便你对照复习:
好了,环境搭好、LED 点亮,咱们就正式入门了。后面的章节会逐步深入,从 GPIO 到定时器、从串口到中断,一步步把 HAL 库用熟。记住,动手是最好的学习方式。