【stm32】swjtu西南交大嵌入式实验三 外部中断实验:按键中断

项目源文件:https://download.csdn.net/download/qq_61814350/89222788?spm=1001.2014.3001.5501 

实验内容:

1、编写程序,设置主程序:跑马灯以 0.2s 的速度旋转;将 KB1 设置为外部中断,下 降沿触发,按下 KB1 则全彩灯的 R 灯闪烁 5 次。编译、下载程序到开发板,观察实 验现象;按下 KB1,观察实验现象。

2、编写程序,设置主程序:跑马灯以 0.2s 的速度旋转;将 KB1,KB2 设置为外部中断, 下降沿触发,按下 KB1 则 R 闪烁 5 次,按下 KB2 则 G 闪烁 5 次。编译、下载程序到 开发板,观察实验现象;分别先后按下 KB1、KB2,观察实验现象。

3、设置主程序:跑马灯以 0.2s 的速度旋转;将 KB1,KB2 设置为外部中断,下降沿触 发,按下 KB1 则 R 闪烁 5 次,按下 KB2 则 G 闪烁 5 次,设置 KB1 外部中断抢占先优 先级设置为 1,KB2 外部中断抢占先优先级设置为 2。编译、下载程序到开发板,先 按下 KB2,G 在闪烁过程中,再按下 KB1,观察实验现象。

4、设置 KB1 和 KB2 外部中断的抢占先优先级均为 1,KB1 外部中断的响应优先级为 1, KB2 外部中断响应优先级为 2。实验时先按下 KB2,LED1 在闪烁过程中,再按下 KB1, 观察实验现象。 

5、用短线连接 PE0 和 PE1,当 KB1 和 KB2 外部中断优先级设置不一致,按下 KB1 或 KB2 时,观察实验现象。

6、应用设计: 主程序为 RGB 循环点亮,外部中断 KB1,蜂鸣器播放门铃音,外部中断 KB2,电机顺 时针旋转开门;KB2 的优先级高于 KB1。

按键及外部中断输入口配置

6b534a6ed7274955b1d30ff458c78e2c.png

注意:该实验使用的是按键外部中断,涉及到按键就有抖动,这是个大坑......

使用CubeMX创建工程

 这里只说明按键(PE0、PE1)外部中断的配置:下降沿触发。按下为低电平故内部上拉。

cc0dd299cf734fc08d053fd0d29a5326.png

RCC和SYS和前面的实验相同。

这里要配置NVIC:

 将对应的外部中断通道的优先级设置成对应的数字,左是抢占,右边是响应优先级。

注意:如果要在中断程序里用hal_delay要把下面的定时器中断的抢占优先级设为比两个外部中断的优先级高

0c1621c5502745f9804ab82315a8ad0f.png

时钟树配置:

00079d7d783440448ea169447eae2bc7.png

2c5a9687c1fd413694b0f25116bb809c.png

在project manager里面勾选上面的选项,可以把代码分开成c和h文件,看起来更清楚。

生成代码,可以进行查看:

 先看gpio.c,setpriority配置外部中断的优先级,这里为了方便,前几个实验不重复建立工程,我直接在这里修改了代码,以修改优先级。这个函数的参数先是抢占,然后是响应

99ff3a9cac8841b999481c621763ba6b.png

stm32f1xx_it.c里两个外部中断线的中断处理函数:

edbfcaa932ea4f2e943a247793c73109.png 查看他们都调用的这个函数:

45d900dd12d64cd693cdba078bb973ca.png

在这个函数里面,先确定这个中断是否被挂起,挂起就清除标志位,调用回调函数,这个回调函数是我们需要自己重写,实现自己的功能的函数。 

2f37a642226f42cabe0da453091cca8d.png

可以在main.c里面重写:

 根据不同的引脚来判断是哪个中断,做不同的处理:

void Light_TOGGLE(GPIO_Pin)
{
   HAL_GPIO_WritePin(GPIOB,GPIO_Pin,0);
	 for(int k=0;k<2400000;k++);
	 HAL_GPIO_WritePin(GPIOB,GPIO_Pin,1);
	 for(int k=0;k<2400000;k++);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  //HAL_Delay(10);
  switch(GPIO_Pin)
	{
	  case KB1_Pin:for(int i=0;i<5;i++) Light_TOGGLE(L_RED_Pin);
		   break;
			//if(HAL_GPIO_ReadPin(KB1_GPIO_Port,KB1_Pin)==0){}
			 
		case KB2_Pin:for(int i=0;i<5;i++)  Light_TOGGLE(L_GREEN_Pin);
			break;
		//	if(HAL_GPIO_ReadPin(KB2_GPIO_Port,KB2_Pin)==0){}
			
	}
	
}

这里有个非常容易出错的地方,花了很久来排查。

在注释掉的地方,我是用来按键消抖的,思路是先延时一下,然后再确认按键是否为低电平,为低电平才做操作,这是很常见的一种消抖做法。但是,中断操作里面,灯的闪烁本身时间就很长了,处理完中断程序之后这个按键的抖动已经停止了,根本不用再消抖了。

这样导致做两个相同抢占优先级的按键中断实验的时候,比如第二个实验抢占都为3的时候,我先按KB1,在KB1对应的红灯闪烁时按下KB2,不会打断当前的中断,这是对的,但是当前的红灯闪烁五次,中断执行完毕后,就看不到绿灯闪烁了。但是按道理,绿灯中断应该排队在后面,红灯闪烁完他应该闪烁绿灯的。而问题就在这里,灯的闪烁本身时间就很长了,当你执行完红灯的中断之后,KB2的抖动都消失了,虽然它执行了KB2的中断程序,但是这个if判断为真时才执行灯闪烁的操作:

if(HAL_GPIO_ReadPin(KB2_GPIO_Port,KB2_Pin)==0){}

 此时KB2已经恢复成没被按下的样子,那么他肯定不会做绿灯闪烁的操作了。去除掉这个消抖的部分,就会看到绿灯排在后面闪烁了。

另外还有一个需要注意的地方,就是这样写,会发现红灯中断会执行两次,也就是,闪烁10次,

这里就需要修改之前所看到的调用回调函数的HAL_GPIO_EXTI_IRQHandler的内部,在这里面它先清掉标志位,再调用回调函数;这会导致按键的抖动又重新把标志位置位,又触发中断,于是需要调换一下两个语句的位置,也就是:

d6a1cb364ba04707938defae270e9177.png

先做完处理再清除标志位,这样按键抖动就不会影响了。所以,涉及到按键的外部中断需要特别处理这里的顺序,另外用CubeMX重新生成代码后,这里会恢复成原来的样子,要记得改。

如果还不明白,可以看下面视频的7.2节,

【【7.2】外部中断示例EXTI方式检测按键——Kevin带你读《STM32Cube高效开发教程基础篇》】 https://www.bilibili.com/video/BV1m8411L7eR/?share_source=copy_web&vd_source=9332b8fc5ea8d349a54c3989f6189fd3

再说一下第六个实验的电机(蜂鸣器前面实验已做过,不再赘述): 

dd1e0d9a467e4c60bc4e45dbd9ba785d.png

这个电机只要在电机两端,IA和IB加上不相同的电平,就能实现旋转,10或01,它们对应的旋转方向不同。

比如(先旋转一会儿再恢复静止):

void Rotate_Machine()
{
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,1);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,0);
	
	for(int k=0;k<5000000;k++);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,0);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,0);
}

  • 11
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: SWJTU计算机网络实验是指西南交通大学计算机网络课程的实践部分。该实验旨在帮助学生更好地理解和应用计算机网络理论知识,培养学生的实际动手能力和问题解决能力。 在SWJTU计算机网络实验中,学生需要完成一系列与计算机网络相关的实际操作和实验任务。这些任务包括网络配置、协议设置、网络性能测试等。学生将学习如何搭建和配置网络环境,理解网络协议的原理和实现方式,通过实际操作感受网络性能的变化和差异。 此外,SWJTU计算机网络实验还注重培养学生的团队合作精神和沟通能力。在实验中,学生通常需要分组合作完成任务,并要求进行组内交流和合作。通过协作完成任务,学生学会了如何与他人进行有效的沟通和协作,提高了解决问题的能力。 SWJTU计算机网络实验的目标是使学生在实践中深入理解计算机网络的原理和技术,并通过实验任务提升学生的实践能力和解决问题的能力。通过这些实验,学生可以更好地应用所学知识解决实际问题,为今后的学习和就业打下坚实的基础。 ### 回答2: SWJTU计算机网络实验是指西南交通大学计算机网络课程中的实践部分。该实验旨在让学生通过实际操作和调试,掌握计算机网络的基本原理和技术。 在SWJTU计算机网络实验中,学生将学习并实践诸如网络拓扑设计、网络设备配置、网络协议实现和网络故障排除等内容。实验中,学生将使用模拟器软件来创建和配置一个小型的计算机网络环境,通过模拟真实网络中的各种情况来进行实验实验内容包括但不限于以下几个方面:首先,学生需要了解和学习计算机网络的基本概念和原理,例如网络协议、TCP/IP模型、网络拓扑结构等。其次,学生需要了解如何使用模拟器软件来创建一个网络拓扑,并配置相应的网络设备,例如路由器、交换机等。然后,学生需要学习和实践网络协议的配置和实现,例如IP地址分配、路由设置、数据包转发等。最后,学生需要学习和实践网络故障排除的方法和技巧,例如使用命令行工具进行网络诊断和故障隔离。 通过SWJTU计算机网络实验,学生可以提升自己的实践能力和沟通能力。在实验过程中,他们会遇到各种网络问题和故障,需要自己进行分析和解决。此外,学生还可以与同学一起合作完成实验任务,共同解决实验中遇到的问题。 总之,SWJTU计算机网络实验是一项重要的实践环节,通过实际操作和调试,学生可以更好地掌握计算机网络的基本原理和技术。通过实验,学生可以提升自己的实践能力和团队合作能力,为今后的学习和工作打下良好的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guts350

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值