1.实验目的

使用中断的方法,震动传感器检测到震动时,LED1点亮2秒,之后熄灭。

2.硬件清单

  • 震动传感器
  • STM32开发板
  • ST-Link

3.硬件连接

STM32震动传感器
PA4DO
3V3VCC
GNDGND

4.代码

4.1exti.c

#include "exti.h"
#include "sys.h"
#include "delay.h"
#include "led.h"uint8_t vibrate_flag = FALSE;void exti_init(void)
{__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef gpio_initstruct;//初始化GPIOgpio_initstruct.Mode =GPIO_MODE_IT_FALLING;gpio_initstruct.Pin =GPIO_PIN_4;gpio_initstruct.Pull =GPIO_PULLUP;gpio_initstruct.Speed =GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &gpio_initstruct);//设置中断线HAL_NVIC_SetPriority(EXTI4_IRQn, 2, 0);HAL_NVIC_EnableIRQ(EXTI4_IRQn);}void EXTI4_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == GPIO_PIN_4){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == GPIO_PIN_RESET){vibrate_flag = TRUE;}}
}uint8_t vibrate_flag_get(void)
{uint8_t temp = vibrate_flag;vibrate_flag = FALSE;return temp;
}void vibrate_flag_set(uint8_t value)
{vibrate_flag = value;
}

4.2main.c

#include "sys.h"
#include "uart1.h"
#include "delay.h"
#include "exti.h"
#include "led.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();exti_init();while(1){ if(vibrate_flag_get() == TRUE){led1_on();delay_ms(2000);led1_off();vibrate_flag_set(FALSE);}}
}

4.3exti.h

#ifndef __HAL_EXTI_H
#define __HAL_EXTI_H#include "stdint.h"#define TRUE    1
#define FALSE   0void exti_init(void);
uint8_t vibrate_flag_get(void);
void vibrate_flag_set(uint8_t value);#endif

exti_init这个函数就是中断的相关配置,在之前的文章有讲。

因为在中断函数中最好不要出现延时函数,
所以这里是用了标志的方法,
在大型项目中一般就写两个函数uint8_t vibrate_flag_get(void);
和void vibrate_flag_set(uint8_t value);
来分别传出标志符和修改标志符。

然后我在.h文件中宏定义了两个符号TRUE和FALSE,使用vibrate_flag变量保存.
分别表示震动模块的打开和关闭。
但是因为当震动模块打开后,没有将vibrate_flag变量复位为FALSE,
这样就会造成main函数中的if一直成立灯就会一直亮,
所以就使用定义临时变量temp来将vibrate_flag变量复位为FALSE。

还有一个问题就是当碰一下震动模块,震动模块会触发很多上升沿和下降沿,
导致灯不会亮2秒,会亮很多秒,
所以在延时两秒后又通过vibrate_flag_set函数将vibrate_flag手动复位为FALSE。

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

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

相关文章

vcpkg: 一款免费开源的C++包管理器

目录 1.简介 2.安装 3.常用命令 4.与项目集成 5.vcpkg的工作原理 5.1.包索引:ports 系统(定义库的 “元信息”) 5.2.源码获取:从 “地址” 到 “本地缓存” 5.3.编译构建:按 “triplet” 定制目标 5.4.安装布…

WinCC通过无线Modbus TCP监控S7-1200/200SMT PLC实例详解

工业自动化系统中,车间内通常部署多台PLC设备并需通过中央监控平台实现集中管控。考虑到工业现场设备间距普遍在数十至数百米范围,传统有线以太网虽能保障传输速率,但其施工需面临电缆沟开挖或复杂布线工程,既增加线材采购、人力投…

【AI智能编程】Trae-IDE工具学习

什么是Trae? Trae与 AI 深度集成,提供智能问答、代码自动补全以及基于 Agent 的 AI 自动编程能力。使用 Trae 开发项目时,你可以与 AI 灵活协作,提升开发效率。提供传统的 IDE 功能,包括代码编写、项目管理、插件管理…

智能驾驶再提速!批量苏州金龙L4级自动驾驶巴士交付杭州临平区

近日,由苏州金龙海格客车研发的“清源”L4级自动驾驶巴士现身杭州市临平区并投入测试。这是临平区引进的首批L4级自动驾驶巴士,标志着临平区智能交通建设迈入新阶段。此次投入测试的“清源”小巴采用一级踏步设计,车身延续了海格蔚蓝巴士的经…

Spring_事务

在mysql阶段的文章中,已经介绍过事务了。本篇文章是对mysql事务的总结和对使用Spring框架来实现事务操作的讲解。事务回顾什么是事务事务时一组操作的集合,是一个不可分割的操作。事务会把所有操作作为一个整体,一起向数据库提交或者撤销操作…

事务管理介绍

为什么要用事务管理在我们同时操作两个或更多个数据库时,可能因为网络等各方面原因导致中间出现异常。造成像对第一个数据库的操作成功了,但是对第二个数据库的操作没有成功。这样数据的完整性就被破坏了。事务:是一组操作的集合,…

Android 之 ViewBinding 实现更安全、高效的视图绑定

​​一、配置说明​​​​作用位置​​需在模块级 build.gradle或 build.gradle.kts文件的 android {}块内添加:android {buildFeatures {viewBinding true // Kotlin DSL 语法} }android {buildFeatures {viewBinding true // Groovy 语法} }​​生成规则​​为每…

全球首款Java专用AI开发助手实测:一句话生成完整工程代码——飞算 JavaAI

🌟 嗨,我是Lethehong!🌟🌍 立志在坚不欲说,成功在久不在速🌍🚀 欢迎关注:👍点赞⬆️留言收藏🚀🍀欢迎使用:小智初学计算机…

Shader开发(七)创建第一个Shader项目

在前面的章节中,我们已经了解了Shader的基本概念和渲染管线的工作原理。现在,是时候动手实践了!本章将带您一步步创建第一个Shader项目,开启真正的Shader开发之旅。 为什么选择openFrameworks? 与其他文章不同&#x…

IAR软件中测量函数执行时间

通常在调试代码中需要直到某个函数或者某段代码的实际执行时间,在IAR中可以直接借助软件提供的工具来计算代码执行时间。 第一种方法 进入仿真调试界面,在需要测量的代码前面打断点。工具栏中选择 ST-LINK — Data Log Summary在 Data Log Summary 窗口中…

Java 字节码文件(.class)的组成详解

文章目录基础信息常量池字段方法属性字节码文件内容说明案例文件基本信息类的基本信息常量池字段信息构造方法实例方法主方法源文件信息字节码文件由五部分组成,分别是基础信息、常量池、字段、方法、属性。案例: public class Main implements Interfa…

C++之vector类的代码及其逻辑详解 (下)

1. insert()这个就是在指定位置插入一个元素,首先计算要插入的这个位置和开头之间的距离,接着判断那个_finish 有没有碰到_endofstorage 或者_endofstorage 是不是为0,如果满足条件,那就进行扩容,然后接着重新计算距离…

【自动化测试】Python Selenium 自动化测试元素定位专业教程

1. 引言:元素定位在 Selenium 中的核心地位 元素定位是 Selenium 自动化测试的基础,所有用户交互操作(如点击、输入、选择)都依赖于准确识别页面元素。Selenium WebDriver 提供了多种定位策略,从简单的 ID 定位到复杂…

通用代码自用

多文件上传public int save(Role role, RequestParam("nfile") MultipartFile nfile, HttpServletRequest request) {System.out.println(nfile.getOriginalFilename());String path request.getSession().getServletContext().getRealPath("/upload");Fi…

生成式AI如何颠覆我们的工作和生活

原问题: ​你觉得生成式AI未来会如何改变普通人的工作和生活?​ 做过一个对比国外和国内工业化产品制造的简单调研,类似一款定制化的台灯或者语音音响,从零到原型实物, 美国至少需要20万美刀,国内成本大概…

K8S、Docker安全漏洞靶场

1 介绍 一个脆弱基础设施自动化构建框架,主要用于快速、自动化搭建从简单到复杂的脆弱云原生靶机环境。 1.1 项目的缘起 在研究漏洞时,我们经常会发现“环境搭建”这一步骤本身就会占用大量的时间,与之相比,真正测试PoC、ExP的时间可能非常短。由于许多官方镜像在国内的…

使用Nginx部署前后端分离项目

使用Nginx部署前后端分离项目:用户中心系统实践指南 部署前的关键准备 在正式部署前,务必确保前后端在生产环境能正常运行: 前端:测试所有API请求路径和生产环境配置后端:验证数据库连接、环境变量和外部服务集成完整流…

当前就业形势下,软件测试工程师职业发展与自我提升的必要性

软件测试行业正处于深刻变革期,2025年的市场已超越400亿美元规模,预计2027年将增长7% 。在这个技术驱动、效率至上的时代,测试工程师若想保持竞争力,必须主动拥抱变革,系统性提升技能。通过深入分析行业现状与人才需求…

java 之 继承

一、继承 1.1 、什么是继承? 继承就是把所有的类的公共部分(相同的成员)提取出来,放到一个类中继承需要使用 extends 关键字 public class Animal{ public String name; } public class Dog extends Animal{}Dog 是 An…

强化应急通信生命线:遨游三防平板、卫星电话破局极端灾害救援

暴雨倾盆,山洪咆哮,城市陷入内涝。今年进入汛期以来,我国广东、福建、河南、陕西、京津冀等地相继遭遇暴雨、洪涝、山洪等灾害,道路损毁、基站断网、电力中断等次生问题为应急响应带来严峻挑战。如何保障极端场景下的通信畅通&…