当前位置: 首页 > news >正文

STM32之震动传感器、继电器介绍及实战

目录

一、震动传感器介绍及实战

二、编程代码实现

1、gpio.c---------初始化GPIO口引脚函数

2、调用中断服务函数

3、中断服务函数

4、中断服务回调函数

5、把上述的中断服务回调函数,放入main主函数里

6、结果演示

三、继电器介绍及实战 


一、震动传感器介绍及实战

单片机供电VCC GND接单片机

产品不震动,输出高电平、模块上的DO口

产品震动,输出低电平,绿色指示灯亮

AO口不用

5V:代表正极

GND:代表负极

DO口:do是一种模拟信号或者数字信号接口

二、编程代码实现


需求:当振动传感器接收到振动信号时,使用中断方式点亮LED1。

1、gpio.c---------初始化GPIO口引脚函数

#include "gpio.h"
void MX_GPIO_Init(void)   //初始化GPIO口引脚函数
{GPIO_InitTypeDef GPIO_InitStruct = {0};  //初始化设置GPIO的结构体/* GPIO Ports Clock Enable */__HAL_RCC_GPIOD_CLK_ENABLE();      //使能GPIOD时钟__HAL_RCC_GPIOA_CLK_ENABLE();      //使能GPIOA时钟__HAL_RCC_GPIOB_CLK_ENABLE();      //使能GPIOB时钟/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);  //GPIO引脚输出1或者0的函数/*Configure GPIO pin : PA4 */GPIO_InitStruct.Pin = GPIO_PIN_4;             //配置GPIO口引脚:PA4GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;  //下降沿触发检测的外部中断模式GPIO_InitStruct.Pull = GPIO_NOPULL;           //内部电阻既不拉高也不拉低HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);       //根据上述内容,初始化GPIOA引脚/*Configure GPIO pin : PB8 */GPIO_InitStruct.Pin = GPIO_PIN_8;             //配置GPIO口引脚:PB8GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;   //推挽输出;推挽输出可以真正能真正的输出高电平GPIO_InitStruct.Pull = GPIO_NOPULL;           //内部电阻既不拉高也不拉低GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;  //GPIO引脚输出的频率HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);       //根据上述内容,初始化GPIOB引脚/* EXTI interrupt init*/HAL_NVIC_SetPriority(EXTI4_IRQn, 2, 0);       //配置EXTI4_IRQn中断,抢先优先级2,响应优先级0HAL_NVIC_EnableIRQ(EXTI4_IRQn);               //使能中断通道EXTI4_IRQn
}

2、调用中断服务函数


#include "main.h"
#include "stm32f1xx_it.h"void EXTI4_IRQHandler(void)               //中断服务函数
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);   //调用中断处理公用函数,根据输入的参数,来判断到底输入的是哪个按键
}

3、中断服务函数

#include "stm32f1xx_hal.h"
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{/* EXTI line interrupt detected */if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)  //确保是否产生了中断{__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);           //清除中断标志位HAL_GPIO_EXTI_Callback(GPIO_Pin);             //调用中断服务回调函数}
}

4、中断服务回调函数

void SystemClock_Config(void);     //因为这个函数在main函数中,如果想要使用这个函数,需要提前声明
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)   //中断服务函数,如果检测到EXTI中断请求,则进入此函数
{//一根中断线上接有多个中断源,判断中断源是否来自PA4if(GPIO_Pin == GPIO_PIN_4){//如果检测到PA4被拉低if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == GPIO_PIN_RESET)  //读取GPIOA4引脚输入是否为0{//则点亮LED1HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);  //指定GPIOB8引脚输出0HAL_Delay(3000);                                     //延时3000msHAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);    //指定GPIOB8引脚输出1}}else{//如果未检测到PA4,则关闭LED1HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);        //指定GPIOB8引脚输出1}
}

5、把上述的中断服务回调函数,放入main主函数里

#include "main.h"
#include "gpio.h"void SystemClock_Config(void);     //因为这个函数在main函数中,如果想要使用这个函数,需要提前声明
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)   //中断服务函数,如果检测到EXTI中断请求,则进入此函数
{//一根中断线上接有多个中断源,判断中断源是否来自PA4if(GPIO_Pin == GPIO_PIN_4){//如果检测到PA4被拉低if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == GPIO_PIN_RESET)  //读取GPIOA4引脚输入是否为0{//则点亮LED1HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);  //指定GPIOB8引脚输出0HAL_Delay(3000);                                     //延时3000msHAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);    //指定GPIOB8引脚输出1}}else{//如果未检测到PA4,则关闭LED1HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);        //指定GPIOB8引脚输出1}
}
int main(void)
{HAL_Init();                               //初始化HAL库函数SystemClock_Config();                     //初始化系统时钟函数HAL_NVIC_SetPriority(SysTick_IRQn,0,0);   //提高滴答定时器的中断优先级(提升至0)MX_GPIO_Init();                           //初始化GPIO引脚
}
void SystemClock_Config(void)               //配置系统时钟函数
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}

如果直接在中断服务函数里调用 HAL_Delay 函数,则会造成系统卡死。
原因:程序初始化时默认把滴答定时器的中断优先级设为最低,其它中断源很容易打断它导致卡
死。
解决:在 main 函数里使用以下函数提高滴答定时器的中断优先级(提升至0):

HAL_NVIC_SetPriority(SysTick_IRQn,0,0);  //提高滴答定时器的中断优先级(提升至0)

并且将 EXTI4 的中断优先级设置比滴答定时器的中断优先级低,比如 2 。

6、结果演示

三、继电器介绍及实战 

简单的说继电器就是小电流、小电压控制大电流、大电压。这就是常见的继电器,这个是一路的。

继电器的IN口:接到单片机的IO口

IN口连接的作用是:IN连接上,单片机会给IN一个低电平信号,这个低电平信号,会让继电器两端的COM口和NO口连接起来上电

接线方式:
VCC:接3.3V(不可以接5V,接5V会工作异常)

GND:接GND

IN:接任何一个通用GPIO口即可

 

 把继电器接到STM32开发板上,可以看到,一碰震动传感器,继电器上的绿灯会亮,而且STM32开发板上的LED小灯也会跟着亮

相关文章:

STM32之震动传感器、继电器介绍及实战

目录 一、震动传感器介绍及实战 二、编程代码实现 1、gpio.c---------初始化GPIO口引脚函数 2、调用中断服务函数 3、中断服务函数 4、中断服务回调函数 5、把上述的中断服务回调函数,放入main主函数里 6、结果演示 三、继电器介绍及实战 一、震动传感器介…...

RK3588平台开发系列讲解(显示篇)RK3588 平台 的DP介绍

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、功能特性二、 DP 输⼊三、DP 输出四、 代码路径沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 RK3588 平台 DP 的使⽤与调试⽅法。 一、功能特性 RK3588 的 DP ⽀持 1.4a 版本的 DP 协议,最…...

【Java】i++和++i的实现原理

文章目录 i++案例反编译分析扩展 x = x++我们接下来从字节码层面分析: 不了解字节码的可以参考这篇:【精通JVM】字节码指令全解 i++案例 package org.example;public class Main {public static void main...

第十四届蓝桥杯三月真题刷题训练——第 18 天

目录 第 1 题:排列字母 问题描述 运行限制 代码: 第 2 题:GCD_数论 问题描述 输入格式 输出格式 样例输入 样例输出 评测用例规模与约定 运行限制 第 3 题:选数异或 第 4 题:背包与魔法 第 1 题&#x…...

软件测试拿了几个20K offer,分享一波面经

1、你的测试职业发展是什么? 测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年积累测试经验,按如何做好测试工程师的要点去要求自己,不断…...

spring2

1.Spring配置数据源1.1 数据源(连接池)的作用 数据源(连接池)是提高程序性能如出现的事先实例化数据源,初始化部分连接资源使用连接资源时从数据源中获取使用完毕后将连接资源归还给数据源常见的数据源(连接池):DBCP、C3P0、BoneC…...

【Linux】网络编程套接字(中)

🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…...

手撕数据结构—队列

队列队列的话只允许在一端插入,在另外一端删除。插入数据的那一段叫做队尾,出数据的那一段叫做队头(从尾巴插入)。因此的话队列是先进先出的。入的顺序与出的顺序的话是一样的。这个与栈是不一样的,因为栈的话就是说如…...

gdb调试工具和makemakefile工具

gdb调试工具和make/makefile工具 文章目录gdb调试工具和make/makefile工具一、gdb调试工具1.debug/release2.使用二、make/makefile1.什么是make/makefile2.编写一、gdb调试工具 1.debug/release 程序有两种默认的发布方式debug和release。release是无法进行调试的。Linux中g…...

【进阶数据结构】平衡搜索二叉树 —— AVL树

🌈感谢阅读East-sunrise学习分享——[进阶数据结构]AVL树 博主水平有限,如有差错,欢迎斧正🙏感谢有你 码字不易,若有收获,期待你的点赞关注💙我们一起进步🚀 🌈我们上一篇…...

ROS使用(5)action学习

action消息的构建 首先进行功能包的创建 mkdir -p ros2_ws/src cd ros2_ws/src ros2 pkg create action_tutorials_interfaces action消息的类型 # Request --- # Result --- # Feedback 动作定义由三个消息定义组成,以---分隔。 从动作客户机向动作服务器发送…...

2023前端面试题集(含答案)之HTML+CSS篇(一)

在又到了金三银四的招聘季,不管你是刚入行的小白,亦或是混迹职场的老鸟,还在为面试前端工程师时不知道面试官要问什么怎么回答而苦恼吗?为了帮助你获得面试官的青睐,顺利通过面试,跳槽进入大厂,…...

设计模式2 - 观察者模式

定义: 观察者模式又叫发布订阅模式,它定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 组成: Subject(通知者/被观察者)&#…...

ini配置文件

ini配置文件 ini文件是initialization file的缩写,即初始化文件,是widows系统配置文件所采用的存储格式。 文件扩展名: .ini ini配置文件的后缀名也不一定必须是.ini, 也可以是.cfg, .conf或者是.txt ini文件格式 ini配置文件由参数, 节, 注解组成 参…...

蓝桥杯备赛经验 pythonA组(非科班选手)

个人2022 CA组江苏省一等奖,决赛成绩不理想,没有拿到一二等奖,但是因为自己是非科班的学生,所以能拿到这样的成绩自己其实也应该知足了 题外话: 很多ACMer嘲笑蓝桥杯非常水,但是据我观察CA组决赛一等奖获奖…...

C++实现通讯录管理系统

通讯录是一个可以记录亲人、好友信息的工具,本博客借助黑马程序员的项目进行修改,利用C实现一个通讯录管理系统,旨在复习C的语法。 一、系统需求 系统需要实现的功能如下: 添加联系人∶向通讯录中添加新人,信息包括…...

开关电源Y电容放置的位置

Y电容,是我们工程师做开关电源设计时都要接触到的一个非常关键的元器件,它对EMI的贡献是相当的大的,但是它是一个较难把控的元器件,原理上并没有那么直观易懂,在EMI传播路径中需要联系到很多的寄生参数才能够去分析。 …...

二叉树的最小深度——递归法、迭代法

1题目给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例 1:输入:root [3,9,20,null,null,15,7]输出:2示例 2:输入&…...

Vue中常使用的三种刷新页面的方式

一、通过js原始方法刷新 缺点&#xff1a; 出现闪白 目录 一、通过js原始方法刷新 二、通过Vue自带的路由进行跳转 三、通过在APP页面进行demo进行刷新(推荐) 1.vue2写法 2. vue3.2写法 <template><div><div class"header"><button clic…...

【Shell】脚本

Shell脚本脚本格式第一个Shell脚本&#xff1a;hello.sh脚本常用执行方式1. bash或sh脚本的相对路径或绝对路径2. 输入脚本的绝对路径或相对路径3. 在脚本的路径前加上.或者source脚本格式 脚本以#!/bin/bash开头&#xff08;指定解析器&#xff09; #! 是一个约定的标记&…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...