该实验以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开发基础,更培养了问题排查能力与严谨的开发习惯,为后续更复杂的嵌入式项目积累了宝贵经验。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐