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

2024-04-26 07:20

本文主要是介绍【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);
}

 

 

这篇关于【stm32】swjtu西南交大嵌入式实验三 外部中断实验:按键中断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936934

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

嵌入式方向的毕业生,找工作很迷茫

一个应届硕士生的问题: 虽然我明白想成为技术大牛需要日积月累的磨练,但我总感觉自己学习方法或者哪些方面有问题,时间一天天过去,自己也每天不停学习,但总感觉自己没有想象中那样进步,总感觉找不到一个很清晰的学习规划……眼看 9 月份就要参加秋招了,我想毕业了去大城市磨练几年,涨涨见识,拓开眼界多学点东西。但是感觉自己的实力还是很不够,内心慌得不行,总怕浪费了这人生唯一的校招机会,当然我也明白,毕业

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类