1. STM32简介与开发环境搭建
大家好,欢迎来到这门实战课。我是你们的讲师,一个在嵌入式圈子里摸爬滚打了十几年的老工程师。
第一节课,咱们不急着写代码。先把家伙事儿备齐,把路数摸清楚。你想想看,盖房子得先看图纸、备砖头,搞嵌入式也是一样的道理。
1.1 为什么是STM32?
市面上微控制器那么多,51、AVR、MSP430,为什么我偏偏推荐STM32?
说白了,就三个字:生态好。
STM32是意法半导体(ST)基于ARM Cortex-M内核推出的32位MCU系列。从低功耗的Cortex-M0+到高性能的Cortex-M7,覆盖了你能想到的绝大多数应用场景。
核心优势一览:
- 性能强悍:主频从48MHz到480MHz不等,处理复杂算法不在话下
- 外设丰富:USART、SPI、I2C、CAN、USB、以太网……应有尽有
- 开发工具成熟:Keil MDK、STM32CubeIDE、IAR,随便挑
- 社区庞大:遇到问题,网上搜一搜,八成有人踩过坑
- 价格亲民:几块钱到几十块钱,性价比极高
我个人习惯把STM32按性能分成几个梯队,方便选型时快速定位:
| 系列 | 内核 | 主频 | 典型应用 |
|---|---|---|---|
| STM32F0/F1 | Cortex-M0/M3 | 48-72 MHz | 工业控制、传感器节点 |
| STM32F4 | Cortex-M4F | 168-180 MHz | 电机控制、音频处理 |
| STM32H7 | Cortex-M7 | 400-480 MHz | 人机界面、机器视觉 |
| STM32L0/L4 | Cortex-M0+/M4 | 32-80 MHz | 电池供电、物联网终端 |
我在项目中遇到过不少选型翻车的案例。有人用F0跑复杂的图形界面,结果卡成PPT;也有人用H7做简单的LED控制,纯属大炮打蚊子。选型这事,够用就好,别盲目追高。
1.2 开发环境怎么选?
目前主流的STM32开发环境有两个:Keil MDK 和 STM32CubeIDE。
我个人的建议是:
- 如果你做工业项目、商业产品,或者公司有现成的Keil授权,那就用Keil MDK。它编译效率高,调试稳定,老工程师用得最多。
- 如果你是学生、个人开发者,或者想省点钱,那就用STM32CubeIDE。它是ST官方基于Eclipse打造的免费IDE,功能一点不差,还集成了CubeMX配置工具。
我的小建议: 初学者我推荐从STM32CubeIDE入手。免费、开箱即用、官方持续更新,省去破解的麻烦。等你真正上手了,再根据项目需求切换工具也不迟。
1.3 安装与配置:手把手来一遍
咱们以STM32CubeIDE为例,走一遍安装流程。别嫌啰嗦,这一步出问题,后面全白搭。
1.3.1 下载与安装
- 去ST官网搜索"STM32CubeIDE",下载最新版本(目前是1.15.x)。
- 双击安装包,一路Next。注意安装路径不要有中文和空格。
- 安装过程中会自动下载一些固件包,保持网络畅通就行。
- 安装完成后,启动IDE,它会自动检测你的开发板。
注意: 安装路径和工程路径都不要出现中文!我曾经有个学生,工程放在"桌面/新建文件夹"里,结果编译死活报错,折腾了两小时才发现是中文路径的问题。
1.3.2 创建第一个工程
打开STM32CubeIDE,我们来创建一个新工程:
- 点击 File → New → STM32 Project
- 在芯片选择界面,输入你的芯片型号。比如我手头的是STM32F103C8T6,直接搜"STM32F103C8"。
- 选中芯片,点击Next。给工程起个名字,比如"LED_Blink"。
- IDE会自动生成初始化代码,并打开CubeMX图形化配置界面。
1.4 点亮LED:嵌入式世界的"Hello World"
好了,环境搭好了,工程建好了。咱们来干点正事——点亮一个LED。
你想想看,嵌入式工程师的仪式感,就是从点亮一颗LED开始的。我第一次点亮LED的时候,那个小灯一亮,心里那个激动啊,比后来调通复杂的通信协议还开心。
1.4.1 硬件连接
先搞清楚你的LED接在哪个GPIO上。以最常见的STM32F103C8T6最小系统板为例:
- 板载LED通常接在 PC13(对应GPIOC的第13脚)
- LED另一端通过电阻接地,所以输出高电平点亮,低电平熄灭
如果你是自己外接LED,记得串一个220Ω-1kΩ的限流电阻,别直接把LED怼在GPIO上。我曾经见过有人不接电阻,结果LED烧了,GPIO也烧了,板子直接报废。
1.4.2 代码实现
在CubeMX中配置好PC13为推挽输出模式后,IDE会自动生成初始化代码。我们只需要在main函数里添加控制逻辑:
/* main.c - LED闪烁示例 */
#include "main.h"
int main(void)
{
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟
MX_GPIO_Init(); // 初始化GPIO
while (1)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 点亮LED
HAL_Delay(500); // 延时500ms
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // 熄灭LED
HAL_Delay(500); // 延时500ms
}
}
代码很简单,对吧?HAL_GPIO_WritePin 控制引脚电平,HAL_Delay 做毫秒级延时。编译下载,你应该能看到LED以1秒的周期闪烁。
避坑指南: 如果你下载后LED没反应,先检查这几项:
- 开发板供电是否正常?USB线是不是只能充电不能传数据?
- 芯片型号选对了没有?F103C8和F103C6的Flash大小不同,选错可能无法下载。
- GPIO引脚号对不对?PC13不是所有板子都一样的,有些板子用的是PA0或PB12。
1.5 知识体系总览
这一章的内容虽然基础,但它是整个课程的基石。我画了一张图,帮你理清脉络:
这张图把本章的核心内容串起来了。从芯片选型到环境搭建,从外设基础到动手实践,再到调试验证,每一步都环环相扣。后面的课程,我们会沿着这条主线,一步步深入下去。
1.6 写在最后
嗯,第一章的内容就到这里。内容不多,但都是实打实的干货。你可能会觉得点亮LED太简单了,但请相信我,这个简单的过程背后,藏着整个嵌入式开发的底层逻辑:配置外设 → 调用API → 控制硬件。后面的所有复杂功能,都是在这个基础上叠加的。
把开发环境搞定,把第一个LED点亮,你就已经迈出了坚实的第一步。剩下的,咱们慢慢来。