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原始方法刷新 缺点: 出现闪白 目录 一、通过js原始方法刷新 二、通过Vue自带的路由进行跳转 三、通过在APP页面进行demo进行刷新(推荐) 1.vue2写法 2. vue3.2写法 <template><div><div class"header"><button clic…...
【Shell】脚本
Shell脚本脚本格式第一个Shell脚本:hello.sh脚本常用执行方式1. bash或sh脚本的相对路径或绝对路径2. 输入脚本的绝对路径或相对路径3. 在脚本的路径前加上.或者source脚本格式 脚本以#!/bin/bash开头(指定解析器) #! 是一个约定的标记&…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
