提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

随着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的开关控制,具体总结如下:

  1. 实验收获

CubeMX快速生成代码:
通过CubeMX配置GPIO、时钟以及工程管理,能够自动生成标准化的初始化代码,大大减少了手动配置寄存器的工作量。

HAL库操作GPIO:
掌握了 HAL_GPIO_WritePin()、HAL_GPIO_ReadPin()、HAL_Delay() 等基本函数,理解了GPIO高低电平控制的实现原理。

LED流水灯设计思路:
通过顺序点亮和熄灭LED,配合延时实现视觉上的流水效果,理解了单片机中循环控制的应用。

外部中断控制实现:
学习了如何使用外部中断 HAL_GPIO_EXTI_Callback() 响应按钮操作,掌握软件消抖及状态判断方法,实现LED的高低电平控制。

Proteus仿真验证:
通过Proteus进行电路连接和.hex文件烧录验证,理解了单片机工程从软件到硬件的完整流程,降低了实验风险。

  1. 技术要点

GPIO配置:输出模式控制LED,输入模式结合中断检测按钮。

延时控制:使用 HAL_Delay() 进行简单延时实现流水灯效果。

中断处理:软件消抖保证按键状态准确,防止误触发。

工程管理:CubeMX项目管理和Keil生成的.hex文件直接用于仿真或烧录,方便调试。

  1. 优化与扩展

流水灯效果优化:
可以使用数组或循环控制多个LED,实现更加灵活的流水灯模式,例如“回旋灯”“闪烁灯”。

中断功能扩展:
可在中断中实现更多复杂功能,例如按钮短按/长按区分、多按键组合控制LED等。

定时器结合LED控制:
使用定时器替代 HAL_Delay(),实现非阻塞延时,提高程序效率,避免影响其他功能。

实际硬件调试经验:
本实验让初学者熟悉了STM32开发板引脚连接、电源配置和调试流程,为后续更多传感器或外设的实验打下基础。

  1. 总结体会

通过本次实验,不仅掌握了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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐