STM32控制LED灯亮灭实验指南
一、硬件准备
硬件清单
- 主控芯片:STM32F103C8T6(或其他类似型号)
- 开发板:STM32最小系统板
- LED灯:1个(建议加220Ω限流电阻)
- 杜邦线:若干
- USB转TTL模块:用于程序烧录(如CH340)
电路连接
- LED正极 → PA0(或其他GPIO引脚)
- LED负极 → GND
- USB转TTL模块 → STM32的UART1(PA9-TX, PA10-RX)
二、软件环境配置
工具安装
- STM32CubeMX:图形化配置工具(官网下载)
- Keil MDK/STM32CubeIDE:代码编写与调试工具
- 串口驱动:CH340驱动(确保电脑识别USB转TTL模块)
创建工程
- 打开STM32CubeMX,选择芯片型号(STM32F103C8)。
配置时钟源:
- RCC → High Speed Clock (HSE) 选择外部晶振(若开发板无外部晶振,使用内部时钟HSI)。
配置GPIO:
- 选择PA0引脚 → GPIO_Output。
- 设置引脚模式:推挽输出(Push-Pull),无上拉下拉。
生成代码:
- Project → Generate Code → 选择IDE(Keil或CubeIDE)。
三、代码实现
主函数逻辑(main.c)
#include "main.h"
int main(void) {
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟
MX_GPIO_Init(); // 初始化GPIO
while (1) {
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); // 翻转PA0电平
HAL_Delay(500); // 延时500ms
}
}
GPIO初始化函数(自动生成)
void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟
// 配置PA0为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上拉下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速模式
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
四、代码烧录与验证
编译工程
- Keil中点击 Build(F7) → 生成hex或bin文件。
烧录程序
- 使用FlyMCU、STM32CubeProgrammer或Keil自带的烧录工具。
- 连接USB转TTL模块,选择对应串口,烧录程序。
现象观察
- LED以1秒间隔闪烁(亮500ms → 灭500ms)。
五、关键知识点解析
GPIO工作模式
- 推挽输出(Push-Pull):可输出高/低电平,驱动能力强。
- 开漏输出(Open-Drain):需外部上拉电阻,适合总线通信。
HAL库函数
- HAL_GPIO_WritePin():直接设置引脚电平(高/低)。
- HAL_GPIO_TogglePin():翻转当前电平(常用在闪烁场景)。
- HAL_Delay():基于系统时钟的毫秒级延时。
时钟配置
- STM32外设需先使能时钟(__HAL_RCC_GPIOA_CLK_ENABLE())。
- 系统时钟频率影响HAL_Delay()的精度(默认72MHz)。
六、扩展实验
1. 按键控制LED
- 添加按键电路(接PA1,配置为输入模式)。
代码逻辑:
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 按键按下时点亮LED }
2. PWM调光
- 配置TIM2通道1(PA0复用为PWM输出)。
- 使用
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
启动PWM。
七、常见问题排查
LED不亮
- 检查硬件连接:LED极性是否接反,限流电阻是否损坏。
- 验证GPIO配置:引脚是否使能时钟,模式是否为输出。
程序无法烧录
- BOOT0引脚是否接地(启动模式为Flash)。
- USB转TTL模块驱动是否安装成功。
延时不准
- 检查系统时钟配置(如HSI精度较低,可改用HSE)。
八、总结
通过点灯实验掌握STM32的GPIO配置与HAL库基础使用。后续可继续学习定时器、中断、串口通信等外设开发。