1. 项目概述:STM32入门第一课
作为一名嵌入式开发老鸟,我深知新手第一次接触STM32时的迷茫。市面上大多数教程一上来就讲寄存器、时钟树、中断向量表,直接把初学者吓跑。其实STM32入门完全可以像搭积木一样简单——这就是我写这篇保姆级教程的初衷。
我们将使用STM32CubeMX和Keil MDK这两个工具,通过最直观的图形化操作完成第一个STM32项目:点亮LED灯。整个过程你只需要:
- 用CubeMX点鼠标配置硬件(零代码)
- 在Keil里添加一行控制代码
- 点击烧录按钮
不需要理解底层原理,不需要研究寄存器,甚至不需要懂C语言(当然懂更好)。只要跟着步骤做,30分钟内你就能看到STM32开发板上的LED灯亮起,完成嵌入式开发的"Hello World"。
2. 准备工作
2.1 硬件准备清单
对于初学者,我强烈推荐以下硬件组合,性价比高且资料丰富:
-
核心板:STM32F103C8T6(又称"蓝色药丸")
- 价格约15-20元
- 内置LED连接在PC13引脚
- 支持SWD调试接口
- 64KB Flash + 20KB RAM完全够入门学习
-
下载器:ST-Link V2
- 价格约15元
- 支持SWD接口调试
- 自带USB转TTL功能(后续串口通信会用到)
注意:购买时确认店家提供配套的4线杜邦线(SWDIO、SWCLK、GND、3.3V)
2.2 软件安装指南
STM32CubeMX安装
- 访问ST官网下载页面(需注册账号)
- 选择对应操作系统的版本(Windows推荐.exe安装包)
- 安装时勾选"Install required embedded software packages"
- 安装完成后打开软件,在Help > Updater Settings中配置镜像源为国内服务器(下载速度更快)
Keil MDK安装
- 下载MDK-ARM安装包(最新版为V5.37)
- 安装时选择默认路径(避免中文路径)
- 安装完成后运行
Keil_Lic.exe注册机(需关闭杀毒软件) - 在File > License Management中添加生成的LIC码
驱动安装
- 连接ST-Link到电脑USB口
- 设备管理器中出现"STMicroelectronics STLink dongle"
- 右键更新驱动,指向Keil安装目录下的
\ARM\STLink\USBDriver
3. CubeMX工程配置详解
3.1 创建新工程
- 打开CubeMX,点击"New Project"
- 在MCU Selector选项卡搜索"STM32F103C8"
- 选择"STM32F103C8Tx"型号(注意尾缀Tx表示LQFP48封装)
- 点击"Start Project"进入配置界面
3.2 关键外设配置
SYS调试接口配置
- 左侧导航栏选择"SYS"
- 在"Debug"下拉菜单选择"Serial Wire"
- 这是ST-Link使用的标准调试接口
- 配置后PA13(SWDIO)和PA14(SWCLK)引脚会自动分配
RCC时钟配置
- 左侧导航栏选择"RCC"
- 在"HSE"选项选择"Crystal/Ceramic Resonator"
- HSE表示外部高速时钟(通常接8MHz晶振)
- 蓝色药丸开发板已内置8MHz晶振
- 在时钟配置图中将HCLK设置为72MHz(STM32F103的最大主频)
GPIO配置
- 在芯片引脚图上找到PC13(开发板LED连接引脚)
- 右键选择"GPIO_Output"
- 在左侧GPIO配置中:
- 修改用户标签为"LED"
- GPIO output level选择"High"(初始状态灯灭)
- GPIO mode选择"Output Push Pull"
- 不启用上拉/下拉电阻
3.3 工程生成设置
- 点击"Project Manager"选项卡
- 设置项目名称(建议英文无空格)
- 在"Toolchain/IDE"选择"MDK-ARM V5"
- 勾选"Generate peripheral initialization as a pair of .c/.h files"
- 点击"GENERATE CODE"生成工程
提示:首次生成可能需要下载F1系列HAL库,建议提前在CubeMX库管理中下载好
4. Keil工程开发实战
4.1 工程结构解析
CubeMX生成的Keil工程包含以下关键文件:
code复制LED/
├── Core/
│ ├── Inc/ // 头文件目录
│ │ └── main.h // 用户代码保护区域
│ └── Src/
│ └── main.c // 主程序文件
├── Drivers/ // HAL库驱动
└── MDK-ARM/
└── LED.uvprojx // Keil工程文件
4.2 添加用户代码
在main.c中找到以下代码段:
c复制/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
在while循环内添加LED控制代码:
c复制HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
HAL_Delay(500);
这段代码实现了LED每隔500ms闪烁一次:
GPIO_PIN_RESET将引脚拉低(LED亮)GPIO_PIN_SET将引脚拉高(LED灭)HAL_Delay()提供毫秒级延时
4.3 编译与下载
-
点击工具栏"Build"按钮(或F7键)编译工程
- 观察Build Output窗口应显示"0 Error(s), 0 Warning(s)"
- 若报错请检查代码是否放在USER CODE区域内
-
连接硬件:
- ST-Link的SWD接口连接开发板(SWDIO→DIO,SWCLK→DCLK)
- 开发板供电可选择:
- ST-Link的3.3V供电(适合低功耗调试)
- USB口供电(需安装CH340驱动)
-
点击"Load"按钮下载程序
- 观察Output窗口显示"Verify OK"
- 按开发板复位键(RST)运行程序
5. 进阶调试技巧
5.1 使用调试模式
- 点击"Debug"按钮进入调试界面
- 常用功能:
- 单步执行(F11)
- 添加变量监视窗口
- 设置断点(F9)
- 在调试状态下可以实时查看GPIO引脚状态
5.2 常见问题排查
下载失败
- 检查ST-Link驱动是否安装正确(设备管理器无感叹号)
- 确认SWD连接线序正确(GND必须连接)
- 尝试降低下载速度(在Debug配置中修改)
LED不闪烁
- 用万用表测量PC13引脚电压是否变化
- 检查开发板原理图确认LED连接方式
- 部分板子是低电平点亮(共阳接法)
- 有些是高电平点亮(共阴接法)
程序跑飞
- 在startup_stm32f103xb.s中检查堆栈大小
- Stack_Size建议设置为0x400
- Heap_Size建议设置为0x200
- 检查是否开启了看门狗(本示例应关闭)
6. 工程优化建议
6.1 代码结构化
建议将LED操作封装成独立函数:
c复制/* USER CODE BEGIN 0 */
void LED_Toggle(void)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}
/* USER CODE END 0 */
然后在main循环中调用:
c复制while (1)
{
LED_Toggle();
HAL_Delay(500);
}
6.2 添加用户按钮
大多数开发板带有用户按钮(通常接PA0):
- 在CubeMX中配置PA0为GPIO_Input
- 添加消抖处理代码:
c复制if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
{
HAL_Delay(50); // 消抖延时
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
{
LED_Toggle();
}
}
6.3 低功耗优化
对于电池供电设备,可添加睡眠模式:
c复制/* 进入停止模式 */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
/* 唤醒后重新配置时钟 */
SystemClock_Config();
7. 学习路线建议
完成LED控制后,建议按以下顺序继续学习:
- GPIO输入(按键检测)
- 外部中断
- 定时器PWM(调节LED亮度)
- USART串口通信
- ADC采样(电位器读取)
每个阶段都可以在现有工程上添加新功能,逐步构建完整的知识体系。记住嵌入式开发的关键是:先让东西动起来,再研究为什么能动。
