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

实验内容:

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);
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阶跃星辰:探索智能科技的星辰大海

引言 在当今快速发展的科技时代&#xff0c;人工智能已经成为推动社会进步的重要力量。阶跃星辰&#xff0c;正是在这一背景下诞生的。 阶跃星辰是一家专注于通用人工智能探索的公司&#xff0c;成立于2023年4月。该公司的创始团队由一群对人工智能充满热情和渴望的人组成&am…

LM1875L-TB5-T 音频功率放大器 PDF中文资料_参数_引脚图

LM1875L-TB5-T 规格信息&#xff1a; 商品类型音频功率放大器 音频功率放大器的类型- 输出类型1-Channel (Mono) 作业电压16V ~ 60V 输出功率25W x 1 4Ω 额外特性过流保护,热保护 UTC LM1875是一款单片功率放大器&#xff0c;可为消费类音频应 用提供极低失真和高品质的…

物联网鸿蒙实训解决方案

一、建设背景 在数字化浪潮汹涌的时代&#xff0c;华为鸿蒙系统以其前瞻的技术视野和创新的开发理念&#xff0c;成为了引领行业发展的风向标。 据华为开发者大会2023&#xff08;HDC. Together&#xff09;公布的数据&#xff0c;鸿蒙生态系统展现出了强劲的发展动力&#x…

【论文浅尝】Phi-3-mini:A Highly Capable Language Model Locally on Your Phone

Phi-3-mini phi-3-mini&#xff0c;一个3.8亿个参数的语言模型&#xff0c;训练了3.3万亿个token&#xff0c;其总体性能&#xff0c;通过学术基准和内部测试进行衡量&#xff0c;可以与Mixtral 8x7B和GPT-3.5等模型相媲美(在MMLU上达到69%&#xff0c;在MT-bench上达到8.38)&…

深圳证券交易所Binary行情数据接口规范

对接深圳证券交易所Binary行情数据接口其实并不难&#xff0c;你需要具备以下知识。 1、需要了解Binary报文设计结构&#xff0c;消息头消息体消息尾。 消息体&#xff1a; 如果是纯map结构的比较简单&#xff0c;字段平铺开来即可。如{"id":"1","…

WEB服务的配置与使用 Apache HTTPD

服务端&#xff1a;服务器将发送由状态代码和可选的响应正文组成的 响应 。状态代码指示请求是否成功&#xff0c;如果不成功&#xff0c;则指示存在哪种错误情况。这告诉客户端应该如何处理响应。较为流星的web服务器程序有&#xff1a; Apache HTTP Server 、 Nginx 客户端&a…

bugfix: com.alibaba.druid.sql.parser.EOFParserException: EOF

前言 在日常的开发工作中&#xff0c;我们经常会遇到各种各样的问题&#xff0c;其中涉及数据库操作的接口联调尤其容易出现意想不到的状况。今天我就遇到了一个关于Druid SQL解析异常的问题&#xff0c;具体表现为com.alibaba.druid.sql.parser.EOFParserException: EOF。通过…

基于SpringBoot开发的同城租房系统租房软件APP小程序源码

项目背景 一、市场前景 随着城市化进程的加快和人口流动性的增强&#xff0c;租房市场正逐渐成为一个不可忽视的巨大市场。传统的租房方式往往存在着信息不对称、效率低下等问题&#xff0c;而同城租房软件的出现&#xff0c;则有效地解决了这些问题&#xff0c;为租房市场注…

k8s日常动手实践 ~~ pod访问 pod请求 k8s api ~ 含新版带curl的busybox镜像

前言&#xff1a; 可以使用 Kubernetes API 获取集群信息。使用 Service Account&#xff08;SA&#xff09;进行身份验证&#xff0c;可以以安全的方式访问 Kubernetes API&#xff0c;而无需在 Pod 中使用明文凭据。 以下是一个使用 Service Account 访问 Kubernetes API 获…

每日OJ题_DFS回溯剪枝①_力扣46. 全排列(回溯算法简介)

目录 回溯算法简介 力扣46. 全排列 解析代码 回溯算法简介 回溯算法是一种经典的递归算法&#xff0c;通常⽤于解决组合问题、排列问题和搜索问题等。 回溯算法的基本思想&#xff1a;从一个初始状态开始&#xff0c;按照⼀定的规则向前搜索&#xff0c;当搜索到某个状态无…

【韩国】UE5的MetaHuman确实可以导入Blender进行编辑。

UE5的MetaHuman确实可以导入Blender进行编辑。根据网络上的信息&#xff0c;你可以将MetaHuman模型导出为FBX文件&#xff0c;然后在Blender中进行修改。修改完成后&#xff0c;你可以将其重新导入到Unreal Engine 5中4。请注意&#xff0c;当你在Blender中编辑模型时&#xff…

虚拟线程的定义及使用

0.前言 长期以来&#xff0c;虚拟线程是 Java 中最重要的创新之一。 它们是在 Project Loom 中开发的&#xff0c;自 Java 19 作为预览功能以来一直包含在 JDK 中&#xff0c;自 Java 21 作为最终版本 (JEP 444) 以来&#xff0c;它们已包含在 JDK 中。 1.虚拟线程的作用 任…

Docker——开源的应用容器的引擎

目录 一、前言 1.虚拟化产品有哪些 1.1寄居架构 1.2源生架构 2.虚拟化产品对比/介绍 2.1虚拟化产品 2.1.1仿真虚拟化 2.1.2半虚拟化 2.1.3全虚拟化 2.2重点 2.2.1KVM——Linux内核来完成的功能和性能 2.2.2ESXI——用的比较多 二、Docker概述 1.Docker定义 2.Do…

BGP的基本配置

l 按照以下步骤配置BGP协议&#xff1a; 第1步&#xff1a;设备基本参数配置&#xff0c;AS内配置IGP确保内部网络连通性&#xff1b; l 配置IGP&#xff08;OSPF协议等&#xff09;路由解决peer对等体的源和目标IP之间连通性&#xff0c;确保peer之间TCP&#xff08;179&a…

怎样把PDF分割成多个文件?有哪些方法可以分割PDF文件?这几个方法成功率很高!

一&#xff0c;引言 PDF分割&#xff0c;即将一个完整的PDF文档拆分为多个较小的部分&#xff0c;是许多用户在处理 PDF文件时经常需要执行的操作。无论是为了单独提取某个章节、创建电子书章节、还是为了在多个设备间轻松共享&#xff0c;PDF分割都显得非常实用。本文将详细介…

动手学深度学习——矩阵

1. 基本概念 1.1 标量 标量由只有一个元素的张量表示。 所以标量计算与程度开发中的普通变量计算没有差异。 import torchx torch.tensor(3.0) y torch.tensor(2.0)x y, x * y, x / y, x**y(tensor(5.), tensor(6.), tensor(1.5000), tensor(9.))1.2 向量 向量泛化自标量…

IDEA 中如何通过连接数据库自动生成代码

目录 1、IDEA 中安装 MyBatisX 插件 2、点击 IDEA 右侧的 database 数据库按钮&#xff0c;点击新建数据源 Data Source 3、编辑数据库连接信息 4、选择你要生成代码的数据库表 5、编辑你代码生成的基本路径以及一些配置项 6、选择annotation&#xff1a;mybatis-plus3&a…

华为数字化转型与数据管理实践介绍(附PPT下载)

华为作为全球领先的信息与通信技术&#xff08;ICT&#xff09;解决方案提供商&#xff0c;在数字化转型和数据管理领域拥有丰富的实践经验和技术积累。其数字化转型解决方案旨在帮助企业通过采用最新的ICT技术&#xff0c;实现业务流程、组织结构和文化的全面数字化&#xff0…

SpringBoot+RabbitMQ实现MQTT协议通讯

一、简介 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上&#xff0c;是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议&#xff0c;为此&#xff0c;它需要一个消息中间件 。此…

一文解读:阿里云 AI 基础设施的演进与挑战

云布道师 2024 年 4 月 18-19 日&#xff0c;2024 中国生成式 AI 大会在北京 JW 万豪酒店举行&#xff0c;阿里云高级技术专家、阿里云异构计算 AI 推理团队负责人李鹏受邀在【AI Infra】专场发表题为《AI 基础设施的演进与挑战》的主题演讲。李鹏从 AIGC 对云基础设施的挑战、…