手把手教你STM32开发:LED流水灯+外部中断控制全流程解析
随着STM32单片机在嵌入式开发中的广泛应用,掌握CubeMX快速建工程、GPIO控制、外部中断配置及仿真调试是每位初学者的必修课。本文将通过LED流水灯实验和外部中断控制LED实验,带你完整了解STM32开发流程,从软件配置到硬件仿真全覆盖。实验收获CubeMX快速生成代码:通过CubeMX配置GPIO、时钟以及工程管理,能够自动生成标准化的初始化代码,大大减少了手动配置寄存器的工作量。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
随着STM32单片机在嵌入式开发中的广泛应用,掌握CubeMX快速建工程、GPIO控制、外部中断配置及仿真调试是每位初学者的必修课。本文将通过LED流水灯实验和外部中断控制LED实验,带你完整了解STM32开发流程,从软件配置到硬件仿真全覆盖。
一、STM32CubeMX安装
1. jdk安装
由于STM32CubeMX是Java实现的,需要安装jdk环境。
jdk官网下载链接:
https://www.oracle.com/java/technologies/javase-downloads.html
2. STM32CubeMX安装
安装网址:
https://www.st.com/zh/development-tools/stm32cubemx.html
安装好后右键.exe文件,以管理员身份运行







安装完成后回到桌面,双击打开CubeMX,进入后会弹出一个选项界面,选择第三个

点击右上角CHECK FOR UPDATES,等待检查更新完就可以正常开关该软件了,至此安装完成。
二、实验CubeMX完成LED流水灯
1.Cube MX新建工程文件
左上角File,点击New Project File
先在左上角Commercial Part Number中搜索自己stm32板子的型号,然后在右边双击出来的型号
选择自己要点亮的流水灯,我这里选择的是PA0,PA2,PA4和PC13,设置为GPIO_OUTPUT
设置sys
设置GPIO
Clock Configuration设置
Project Manager设置

然后点击右上角GENERATE CODE,Open Project
2. 工程代码
将下面代码添加到生成的main.c中的while(1)中
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 灯1亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOBA, GPIO_PIN_0, GPIO_PIN_SET); // 灯1灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); // 灯2亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); // 灯2灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 灯3亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // 灯3灭
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // 灯4亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 灯4灭

3. 实验现象:
三、外部中断控制LED灯亮灭
1. 工程文件创建
创建过程和 二. 1 差不多,我这里引脚选择用PB5配置SWITCH,模拟开关,控制PA4的亮灭
配置NVIC
2. 工程代码
将下面的代码插入到/* USER CODE BEGIN 0 // USER CODE END 0 */之间,
volatile uint8_t btn_flag = 0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_5)
{
// 软件消抖
static uint32_t last_tick = 0;
uint32_t now = HAL_GetTick();
if ((now - last_tick) < 50) return; // 50ms消抖
last_tick = now;
// 读取 PB5 电平
GPIO_PinState state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5);
// 按键未按下(高电平) → LED 亮
// 按键按下/拔下线(低电平) → LED 灭
if (state == GPIO_PIN_SET)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // LED 亮
else
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // LED 灭
}
}
将下面的代码插入到主函数中的while(1)中
// 读取 PB5 电平,控制 PA4 LED
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == GPIO_PIN_SET) // 插上 → 高
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // LED 亮
else // 拔下 → 低
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // LED 灭
HAL_Delay(10); // 10ms 循环
3.实验现象
四、Proteus仿真
1. 实验一仿真图
打开Proteus,找到相应原件连接好
点击左上角的设计(N),点击配置供电网
名称选择GND,将VSSA添加过去
名称选择VCC/VDD,将VDDA添加过去
双击stm32,在Program File中选择keil中生成的.hex文件
2. 实验一仿真效果
3. 实验二仿真图

4. 实验二仿真效果
五、总结
本次实验通过STM32CubeMX及HAL库,实现了LED流水灯的点亮控制和外部中断对LED的开关控制,具体总结如下:
- 实验收获
CubeMX快速生成代码:
通过CubeMX配置GPIO、时钟以及工程管理,能够自动生成标准化的初始化代码,大大减少了手动配置寄存器的工作量。
HAL库操作GPIO:
掌握了 HAL_GPIO_WritePin()、HAL_GPIO_ReadPin()、HAL_Delay() 等基本函数,理解了GPIO高低电平控制的实现原理。
LED流水灯设计思路:
通过顺序点亮和熄灭LED,配合延时实现视觉上的流水效果,理解了单片机中循环控制的应用。
外部中断控制实现:
学习了如何使用外部中断 HAL_GPIO_EXTI_Callback() 响应按钮操作,掌握软件消抖及状态判断方法,实现LED的高低电平控制。
Proteus仿真验证:
通过Proteus进行电路连接和.hex文件烧录验证,理解了单片机工程从软件到硬件的完整流程,降低了实验风险。
- 技术要点
GPIO配置:输出模式控制LED,输入模式结合中断检测按钮。
延时控制:使用 HAL_Delay() 进行简单延时实现流水灯效果。
中断处理:软件消抖保证按键状态准确,防止误触发。
工程管理:CubeMX项目管理和Keil生成的.hex文件直接用于仿真或烧录,方便调试。
- 优化与扩展
流水灯效果优化:
可以使用数组或循环控制多个LED,实现更加灵活的流水灯模式,例如“回旋灯”“闪烁灯”。
中断功能扩展:
可在中断中实现更多复杂功能,例如按钮短按/长按区分、多按键组合控制LED等。
定时器结合LED控制:
使用定时器替代 HAL_Delay(),实现非阻塞延时,提高程序效率,避免影响其他功能。
实际硬件调试经验:
本实验让初学者熟悉了STM32开发板引脚连接、电源配置和调试流程,为后续更多传感器或外设的实验打下基础。
- 总结体会
通过本次实验,不仅掌握了STM32CubeMX快速生成工程和HAL库GPIO操作方法,还通过外部中断和Proteus仿真加深了对嵌入式硬件与软件联动的理解。整个实验过程从软件配置、代码实现到仿真验证,覆盖了嵌入式系统开发的完整流程,是入门STM32学习的实用案例。
六、参考资料
https://blog.csdn.net/weixin_56102526/article/details/120877293
https://blog.csdn.net/m0_64167498/article/details/131921339
https://b23.tv/K4XUf9N
更多推荐



所有评论(0)