嵌入式STM32入门——基于keil5、STM32CubeMX HAL库和中断的LED流水灯
在嵌入式开发学习中,STM32 的中断机制与 HAL 库应用是核心技能,而电路仿真与版本控制则是保障项目高效推进的关键环节。本文围绕 STM32F103 核心板展开实验,先通过 HAL 库实现 LED 流水灯周期闪烁,再进阶设计 GPIO 中断控制逻辑 —— 用杜邦线模拟开关,通过高低电平切换流水灯工作状态,并观察开关抖动引发的中断响应问题;同时借助 Proteus8.15 绘制电路并加载 Kei
该实验以STM32F103C8T6为例
文章目录
- 前言
- 一、搭建STM32实验环境(安装下载 STM32CubeMX)
-
- 1. STM32CubeMX 官网下载
- 二、实现LED流水灯(无中断)
-
- 1. 在STM32CubeMX中配置
- 2. 实验现象
- 三、实现有中断的LED流水灯
-
- 1.设置中断
- 2. 设计函数
- 3. 实验结果
- 四、Proteus8.17实现stm32流水灯仿真
-
- 1. 新建Proteus工程
- 2. 设计仿真
- 3. 导入HEX文件
- 4. 仿真结果
- 五、将代码上传到Gitee
-
- 1. 完成网页版Gitee的注册
- 2. 网页版Gitee新建仓库
- 3. 建立本地仓库与代码上传
- 总结
前言
在嵌入式开发学习中,STM32 的中断机制与 HAL 库应用是核心技能,而电路仿真与版本控制则是保障项目高效推进的关键环节。本文围绕 STM32F103 核心板展开实验,先通过 HAL 库实现 LED 流水灯周期闪烁,再进阶设计 GPIO 中断控制逻辑 —— 用杜邦线模拟开关,通过高低电平切换流水灯工作状态,并观察开关抖动引发的中断响应问题;同时借助 Proteus8.15 绘制电路并加载 Keil 生成的 hex 文件仿真验证;最后通过 Git 工具将项目代码提交至 GitHub/Gitee,完成从硬件编程到项目管理的完整实践。以下为实验相关内容分享。
一、搭建STM32实验环境(安装下载 STM32CubeMX)
1. STM32CubeMX 官网下载
官网下载地址链接: https://www.st.com/en/development-tools/stm32cubemx.html
具体安装过程请参考:https://blog.csdn.net/Brendon_Tan/article/details/107685563
二、实现LED流水灯(无中断)
1. 在STM32CubeMX中配置
在右上角搜索栏里面搜索芯片类型STM32F103C8T6
跳转后,分别选择PA0、PB5、PC13为LED发光的端口,点击GPIO_Output
生成代码后,在while函数中写入程序,注意要在注释的BEGIN和END之间
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
HAL_Delay(1000);
2. 实验现象
VID_20250926_140632
三、实现有中断的LED流水灯
用stm32F103核心板的GPIOA端的PA8管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作。
1.设置中断
将PA8引脚设置为GPIO_EXIT8
使能中断

保存后重新生成代码
2. 设计函数
打开keil工程,先进行全局编译,以便我们进行函数跳转。编译后,找到并打开我们的stm32f1xx_it.c文件,在其中找到我们的中断控制服务函数
点击或双击 HAL_GPIO_EXTI_IRQHandler,然后右键选择跳转函数定义处或者直接F12,我们就会直接跳转到函数定义的位置。在这个函数下方,我们能发现这样一个函数
这个就是我们的中断反馈函数,因为该函数定义前有_weak,我们需要在主函数内进行重定义。在main.c里面,我们在主函数main上方定义一个中断标志并且重定义中断反馈。
int led_flag=0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)==1)//当PA8置于高电平时,将标志置为1
{
led_flag=1;
}
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)==0)//当PA8置于低电平时,将标志置为0
{
led_flag=0;
}
}
主函数改为以下
while (1)
{
if(led_flag==1)//当中断标志位为1时,流水灯工作
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
HAL_Delay(1000);
}
else if(led_flag==0)//当中断标志位为0时,流水灯停止
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET); // 灯1灭
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET); // 灯2灭
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET); // 灯3灭
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
3. 实验结果
VID_20251006_150557
四、Proteus8.17实现stm32流水灯仿真
一定要确保Proteus是8.15及以上版本,如果用8.9版本会发现没有STM32F103C8T6,且安装路径最好不要有中文!
若没有安装的小伙伴可以在B站上看这位UP主的教学视频【最简单】Proteus最详细安装教程【免费分享 下载链接】】
1. 新建Proteus工程
打开软件,点击新建工程
起名以及选择一个路径
创建固件项目
2. 设计仿真
创建好工程之后,点击设计,配置供电网

点击右侧工具栏的第二个元件模式,然后点击小括号P
搜索LED,找到红色,蓝色和黄色LED
然后连线
加入按钮

3. 导入HEX文件
双击图中的STM32芯片,找到自己的基础版流水灯.hex,导入,配置频率,这里我设置为了72M。
随后点击左下角,开始仿真
电脑上ESC可关闭仿真
4. 仿真结果
VID_20251007_202111
五、将代码上传到Gitee
详细的操作步骤请参考这位博主:
https://blog.csdn.net/weixin_50470247/article/details/133585369
注意name是@后的名称,你的账号名称可能和@后的名称不同
右键空白处,如果出现下图的Open Git与Git Clone等图标说明已经装好了

1. 完成网页版Gitee的注册
在浏览器上搜索Gitee,完成注册并绑定邮箱

2. 网页版Gitee新建仓库
移动鼠标到右上角的加号,点击新建仓库
填写名称和路径

这里要记下网页地址:
3. 建立本地仓库与代码上传
新建一个文件夹当做本地仓库:
然后点进去,右键,选择Git Clone(我这里已经创建了,你们当做是空的)
上面的就是之前复制的网页地址,下面的是你文件的路径
点击OK,创建完毕后,将要上传的代码放入里面,我这里的是LED
然后选中右键,点击ADD
文件上传本地仓库成功,随后点击“Commit”,填写“Message”,然后点击“Commit”,传输成功后,点击“Push”,完成后点击OK,会跳出来一个框框填用户名和密码,一定要填写正确。用户名一定是@后面的名称。
可以看见上传成功了:
总结
本次STM32实验围绕“开发-仿真-管理”形成完整闭环,从STM32CubeMX环境搭建起步,先后实现了无中断的LED流水灯周期闪烁、基于GPIO中断的流水灯启停控制(通过PA8管脚与杜邦线模拟开关),再到Proteus8.17的电路绘制与程序仿真验证,最后尝试通过Git将代码提交至Gitee,全面实践了STM32 HAL库开发、中断原理应用及软件版本控制流程。
实验过程中,Gitee代码上传环节曾因细节疏忽遇阻——起初未注意用户名需填写Gitee账号中“@”后的名称,误填其他信息导致上传失败。反复核对仓库地址、回顾教程提示后,才发现账号信息对应错误,修正用户名后成功完成提交。这一插曲让我深刻体会到嵌入式开发与代码管理中“细节决定成败”:无论是中断程序中标志位的逻辑设计、Proteus仿真时的电路供电配置,还是版本控制中的账号信息填写,任何微小疏漏都可能导致功能异常。
此外,中断实验中观察到的杜邦线抖动引发的中断多次响应、仿真与实物实验的效果对比,也让我意识到理论知识需结合实践调试才能真正掌握。本次实验不仅夯实了STM32开发基础,更培养了问题排查能力与严谨的开发习惯,为后续更复杂的嵌入式项目积累了宝贵经验。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)