实验2 -基于HAL库和中断的LED流水灯

一、前期准备—开发环境的搭建

1.安装JDK和MDK
jdk和mdk先前已经安装,不再描述
2.安装STM32CubeMX
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
安装完毕

二.HAL库函数开发—用GPIO完成3只LED红绿灯的周期闪烁

1.使用HAL库创建工程文件
(1)打开下载好的CubeMx,点击左上角的File文件选择“New Project”,创建工程
在弹出的界面中,下拉列表输入芯片名称“STM32F103C8T6”,右下角选中后,点击“Start Project”
在这里插入图片描述
(2)然后配置“.sys”,下拉debug模式 ,选中"Serial Wire"Timebase Source选择“SysTick”,
在这里插入图片描述
接着配置“.RCC”,HSE选中"Crystal/Ceramic Resonator"项,LSE选择Disable,界面如下。
在这里插入图片描述
(3)配置GPIO,先点击右侧芯片示意图,选择需要的端口,点击设置GPIO_OUTPUT,我选择的引脚是PA1,PB1,PC14,同时把GPIO output level置为高电平,引脚配置如下图所示:
在这里插入图片描述
(4)设置Clock Configuration,操作如下所示:
在这里插入图片描述
(5)设置Project Manager,这里特别注意,代码的生成路径不要有中文,否则后面可能会出错(至少我这里是不行的),文件名和自己的工程最好是有联系的(以免后续不知道工程内容)
在这里插入图片描述
点击“Code Generator”,勾选图示内容,再点击右上角"GENERATE CODE",生成文件。
在这里插入图片描述
注册邮箱
在这里插入图片描述
生成工程成功
在这里插入图片描述

2.使用Keil编写相关项目代码
(1)实验任务;掌握HAL库函数开发方法,安装 stm32CubeMX,配合Keil,使用HAL库方式完成下列任务:用GPIO端口完成3只LED红绿灯的周期闪烁。使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。请用此功能观察3个GPIO端口流水灯的输出波形,并分析时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。

(2)设计思路:通过逐个控制三个不同的GPIO引脚,实现了对三个LED灯的顺序控制。每个LED灯都会单独被点亮和熄灭,并且每个灯的点亮和熄灭之间有一个固定的延时,从而形成了一个简单的周期性闪烁模式。
(3)点开CubeMx中的项目,找到主函数main.c,在while(1)中写入代码:

while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE END WHILE */
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);  // PA1亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);  // PA1灭
		
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);  // PB1亮
	HAL_Delay(1000); //延时1s
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);  // PB1灭
	  
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);  // PC13亮
	HAL_Delay(1000); //延时1s
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);  //PC13灭
   /* USER CODE BEGIN 3 */
  }` 

在这里插入图片描述

编译成功
3.流水灯运行结果展示
在这里插入图片描述

4.使用软件仿真逻辑分析仪功能观察管脚时序波形
(1)设置Debug
在这里插入图片描述
(2)使用keil逻辑分析仪:
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
高电平持续时间为3.020151-1.020151=2s
低电平持续时间为4.000151-3.020151=0.98s
周期为2.98s,约为3s

三.HAL库函数开发—采用中断模式控制流水灯闪烁

1.重新配置工程
(3)配置“GPIO”端口输出

在这里插入图片描述

(4)配置"Clock Configuration"
在这里插入图片描述

(4)配置中断“EXIT”
在这里插入图片描述

(5)项目生成
2.通过KEil进行代码配置
(1)实验任务
了解并掌握STM32中断原理,HAL库函数开发方法,用stm32F103核心板的GPIO端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。
(2)中断机制的基本原理
STM32的中断机制是一种允许处理器在执行程序过程中,遇到需要立即处理的内外部紧急事件时,暂时中断当前任务,转而执行专门的处理程序(中断服务例程ISR)来应对这些事件的机制。

• 中断控制器(NVIC):NVIC是STM32中断管理系统的核心组件,负责管理和协调所有中断请求。它允许开发者通过编程配置中断的优先级、使能或禁用特定中断,从而实现对中断的灵活控制。

• 中断优先级管理:STM32的中断优先级管理非常灵活,支持优先级分组。优先级分组将优先级分为抢占优先级和响应优先级(或子优先级),以适应不同的应用需求。抢占优先级决定了中断能否打断其他中断服务程序的执行,而响应优先级则用于管理同级抢占优先级中断的执行顺序。
(3)基本设计思路
在main函数上方进行编写一个中断函数HAL_GPIO_EXTI_Callback()以及自定义一个中断的标识符号flag,代码如下:

uint32_t flag=0;//自定义中断标识符号
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == SWITCH_Pin)
	{
      //获取A10的电位
     GPIO_PinState pinState = HAL_GPIO_ReadPin(SWITCH_GPIO_Port,SWITCH_Pin);
 
      //高电位
      if(pinState==GPIO_PIN_SET)//PA10高电位流水灯亮
      {
		  flag=1;//PA10高电位标识
	  }
      //低电位
      else if(pinState==GPIO_PIN_RESET)//PA10低电位流水灯灭
	  {
		  flag=0;//PA10低电位标识
	  }
    } 
}

将main函数里的while(1)改为:

while (1)
  {
    /* USER CODE END WHILE */
if(flag==1)
	  {
		  HAL_GPIO_WritePin(led1_GPIO_Port,led1_Pin,GPIO_PIN_RESET);//PA1亮灯
          HAL_GPIO_WritePin(led2_GPIO_Port,led2_Pin,GPIO_PIN_SET);//PB1熄灯
		  HAL_GPIO_WritePin(led3_GPIO_Port,led3_Pin,GPIO_PIN_SET);//PC13熄灯
		  HAL_Delay(1000);//延时1s
		  HAL_GPIO_WritePin(led1_GPIO_Port,led1_Pin,GPIO_PIN_SET);//PA1熄灯
          HAL_GPIO_WritePin(led2_GPIO_Port,led2_Pin,GPIO_PIN_RESET);//PB1亮灯
		  HAL_GPIO_WritePin(led3_GPIO_Port,led3_Pin,GPIO_PIN_SET);//PC13熄灯
		  HAL_Delay(1000);//延时1s
		  HAL_GPIO_WritePin(led1_GPIO_Port,led1_Pin,GPIO_PIN_SET);//PA1熄灯
          HAL_GPIO_WritePin(led2_GPIO_Port,led2_Pin,GPIO_PIN_SET);//PB1熄灯
		  HAL_GPIO_WritePin(led3_GPIO_Port,led3_Pin,GPIO_PIN_RESET);//PC13亮灯
		  HAL_Delay(1000);//延时1s
	  }
	  else if(flag==0)
	  {
		  HAL_GPIO_WritePin(led1_GPIO_Port,led1_Pin,GPIO_PIN_SET);//PA1熄灯
          HAL_GPIO_WritePin(led2_GPIO_Port,led2_Pin,GPIO_PIN_SET);//PB1熄灯
		  HAL_GPIO_WritePin(led3_GPIO_Port,led3_Pin,GPIO_PIN_SET);//PC13熄灯
	  }

    /* USER CODE BEGIN 3 */
  }

在这里插入图片描述
编译成功
3.中断控制结果展示

中断

四.用Proteus8.15仿真任务1,2中的系统电路,观察运行效果

1、proteus8.15简介

(1)原理介绍
Proteus8.15是一款功能强大的电路设计软件,支持模拟、布局和PCB设计,主要面向电子工程师和学生等用户群体。该软件由Labcenter Electronics公司开发,具有易于使用的界面和丰富的元件库,使用户能够通过简单地拖拽组件在画布上创建电路图,并模拟其工作。
(2)增加的功能
新增了许多ARM Cortex-M微控制器,并支持在线仿真。
改进了路线编辑功能,特别是弯曲路线的编辑,使其工作方式与线性路线类似,可以拖动弯曲的角来放大或缩小它们的半径。
重新设计了分层系统,增加了更多的机械层和专用的开槽和装配层,提高了设计的灵活性和便利性。
提供了曲线之间的直线段拖动功能,以及分段拖动、节点拖动和小段删除的各种改进,有助于保持设计的整洁性和可编辑性。

2.仿真运行实验一led111

(1)新建工程
双击软件proteus8.15,点击start->New Project,编辑工程名和路径选择,点击next,界面如下:
在这里插入图片描述
然后跳出来的界面是有关“原理图设计”,勾选第二项,并且选择“DEFAULT”,点击next,
在这里插入图片描述
然后勾选第一项,即不生成PCB layout,点击next,
在这里插入图片描述
由于我们的操作是基于STM32F103C8T6,所以选择“Create Firmware Project”,即勾选第二项,,然后下拉三个选项框,选择系列如图所示:在这里插入图片描述

(2)元件配置及“.hex”文件添加
在这里插入图片描述
然后就是最重要的一步,给芯片烧入“.hex”文件,右键点击芯片,点击编辑属性
在这里插入图片描述
然后在弹出的窗口中选择program file,点击目录二中CubeMx生成的“.hex”文件,添加进来,另外晶振频率要选对,否则可能会出错,我这里是8MHZ,界面如下:
在这里插入图片描述
最后一步就是配置供电网,具体操作见下图
在这里插入图片描述
点击OK之后,单击左下角的运行按钮,效果如图:

(3)仿真效果展示
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
仿真速度很慢,并不是1s,而是10s左右,不再录制视频
(4)用Proteus8.15中进行示波器仿真
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

五.Github

1.github的注册以及git安装详解

(1)注册github账户
github官网网站:https://github.com/
然后点击连接,来到Github官网进行账号注册,没有账号点击 sign up 进行注册账号,输入自己的邮箱(可以使用QQ邮箱),填写账号密码及相关信息,到下面这个界面时,GitHub便创建好了。
在这里插入图片描述

(2)安装git客户端
登录进去以后,先创立一个自己的库,库分为两种,公有、私有,填好信息点击创建仓库即可,创建完成以后,界面如下:
在这里插入图片描述

2.Git 客户端和 GitHub 的绑定

(1)获取SSH keys
打开git bash,输入以下内容,邮箱为github注册邮箱
在这里插入图片描述
进入.ssh文件,存储的是两个ssh key的秘钥,id_rsa.pub文件里面存储的是公钥,id_rsa文件里存储的是私钥,打开id_rsa.pub文件,复制里面的内容:
在这里插入图片描述

(2)Githyb绑定ssh密钥
登录到GitHub网站添加刚刚复制密匙,具体步骤见下图:
在这里插入图片描述
填写名字以及复制的公钥(id_rsa.pub内容),添加后配置完成。
在这里插入图片描述
添加成功后可以看见下面的界面:在这里插入图片描述
到此密钥添加成功,Github绑定ssh成功!回到Git bash上,输入:ssh -T git@github.com,查看是否成功绑定,如果输入代码之后选择yes出现如下界面说明成功绑定:
在这里插入图片描述
3.使用Git命令将代码提交至GitHub

(1)克隆仓库
打开自己存放工程的文件,右键点击Git Bash Here:
在 git 上执行命令,输入指令 git init,可以看到这里生成一个文件,文件名就是github上的创建的库,并且自动生成了一个.git的文件,然后把需要管理的文件全部复制进与github创建的库名字一样的文件夹中,如下图:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

(2)上传所有项目文件至Github远程仓库

六.总结

在完成本次围绕 STM32 展开的综合性实验后,我收获颇丰,不仅在专业知识与技能方面得到了显著的提升,更在面对问题、解决问题的思维方式上有了新的感悟。
知识与技能层面
(一)深入理解 STM32 中断原理
通过这次实验,我对 STM32 的中断原理有了更为清晰且透彻的理解。此前,中断机制在我眼中只是一个抽象的概念,但在实际运用中,我看到了它如何让系统在面对外部事件(如开关电平变化)时能够迅速做出响应,暂停当前正在执行的任务,转而执行相应的中断服务程序,进而实现了诸如根据开关状态控制 LED 流水灯工作与停止这样灵活且实用的功能。这使我认识到中断机制在嵌入式系统中就如同一个精准的调度员,合理地调配着系统资源,保障各项任务有序且高效地执行。
(二)掌握 HAL 库函数开发方法
使用 HAL 库函数进行开发是本次实验的重点内容之一。一开始,面对众多的库函数以及其复杂的参数配置,我感到有些无从下手。然而,随着不断地查阅文档、参考示例代码,并亲手实践去配置 GPIO 端口、设置中断模式等操作,我逐渐掌握了 HAL 库函数的使用技巧。它极大地简化了开发流程,提高了开发效率,让我可以更专注于功能的实现,而不必在底层寄存器的繁琐操作上耗费过多精力。比如在实现 LED 流水灯的闪烁以及响应中断控制其启停的过程中,HAL 库提供的诸如 HAL_GPIO_WritePin() 这样方便的函数,只需简单传入相应参数就能轻松控制引脚电平状态,让代码编写变得简洁明了。
(三)熟练运用开发工具
在整个实验过程中,对 stm32CubeMX、Keil 和 Proteus8.15 这几个工具的使用也更加熟练了。stm32CubeMX 强大的图形化配置界面让芯片的初始化设置变得直观便捷,能够快速生成符合需求的工程框架,为后续编程打下良好基础;Keil 作为经典的嵌入式开发 IDE,其编译、调试功能为代码的开发与纠错提供了有力保障,尤其是软件仿真逻辑分析仪功能,让我在没有示波器的情况下依然能够观察管脚的时序波形,方便地对代码进行动态跟踪调试,准确地定位诸如 LED 闪烁周期不符合预期等代码故障点;而 Proteus8.15 则提供了一个虚拟的电路搭建与仿真平台,通过绘制系统电路并加载对应的.hex 程序,我可以直观地看到实际电路运行效果,提前验证设计的合理性,避免了在实际硬件搭建中可能出现的反复试错,大大节省了时间和成本。
(四)初识 git 版本控制
注册 git 账号并学习使用 git 客户端进行项目代码管理,是本次实验中接触到的又一重要内容。了解了如 git init、git add、git commit 等基本命令后,我认识到 git 在项目开发中的重要性。它能够帮助我记录项目的每一次修改和迭代,方便回溯历史版本,同时还能实现多人协作开发时代码的合并与管理,避免代码冲突带来的混乱,为项目的持续发展和维护提供了可靠的保障,让我初步踏入了规范的代码版本控制领域。
总的来说,这次 STM32 实验是一次充满挑战但又收获满满的学习经历。它让我将理论知识与实际操作紧密结合起来,真正做到学以致用,同时也培养了我解决实际问题的能力和自主学习的意识。然而,我也清楚地意识到自己在嵌入式开发领域还有很长的路要走,还有许多知识和技能需要进一步深入学习,比如更复杂的中断嵌套情况、更高效的代码优化技巧以及在多人协作的大型项目中如何更好地运用 git 进行版本管理等。未来,我希望能够继续深入探索 STM32 以及嵌入式开发的更多奥秘,通过更多的实践项目不断提升自己的专业素养,为今后从事相关领域的工作打下坚实的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值