目录

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

二、编程代码实现

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、用外部中断共用入口函数,来调用外部中断处理回调函数

外部中断共用入口函数:void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)

#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. 一,哞哞stm32项目——震动传感器控制继电器对条灯进行开关

    效果图片: 1.链接完毕,未触碰震动传感器,灯条不亮 2.手指触碰震动传感器,灯条亮 3.亮一秒后灯灭,下次触碰继续亮 硬件器材: 一路继电器,震动传感器,条灯,开发板,杜邦线,电脑 软件 keil, ...

  2. 单片机之震动传感器、继电器、433M无线发射接收等模块介绍及应用

    目录 一.震动传感器模块 二.继电器介绍 三.433M无线发射接收模块 1. 无线控制报警器代码 2.电动车简易防盗器代码实现 一.震动传感器模块 单片机供电VCC GND接单片机 产品不震动,输出高 ...

  3. 常用数字、模拟量输出传感器原理介绍

    哈喽,大家好,本期小飞哥带来的是常用的数字量输出传感器的原理与使用说明,希望能对伙伴们有帮助! 实现目标: 了解常用传感器的原理实现,达到举一反三的效果,学会如何操作: 硬件准备: 声音传感器(或者其 ...

  4. 详细介绍如何从零开始制作51单片机控制的智能小车(二)———超声波模块、漫反射光电管、4路红外传感器的介绍和使用

       我会通过本系列文章,详细介绍如何从零开始用51单片机去实现智能小车的控制,在本系列的上一篇文章中介绍了如何让小车动起来,本文作为本系列的第二篇文章,主要介绍让小车实现自动避障所涉及的一些传感器, ...

  5. 智能安全辅助驾驶系统 STM32——MQ3酒精传感器的应用(HAL库)

    智能安全辅助驾驶系统 STM32--MQ3酒精传感器的应用(HAL库) 准备: MQ3酒精传感器一个.STM32开发板(本实验采用F103RCT6,其他型号可参考本文同理设置) 一.MQ3酒精传感器的 ...

  6. 基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计

    目录 1 项目概述 1.1 项目介绍 1.2 项目开发环境 1.3 小组人员及分工 2 需求分析 2.1 系统需求分析 2.2 可行性分析 2.3 项目实施安排 3 系统硬件设计 3.1 系统整体硬件 ...

  7. Arduino压电震动传感器(二)

    Arduino压电震动传感器,前文有介绍模拟输出,用模拟输出可以检测震动的强弱. TTL电平输出 TTL电平输出可以理解为数字电平,共两种状态:高电平和低电平(即1和0).有效信号为高电平,输出控制电 ...

  8. Arduino 各种模块篇 震动模块 常开 震动传感器模块

    以下是店家提供的一部分资料 一共就需要3根线 ------------------分割线------------------------ 用途: 用于各种震动触发作用,报盗报警,智能小车,电子积木等. ...

  9. 震动传感器(模拟和数字)

    index 数字震动传感器 简介 产品参数 连线图 示例代码 结果 震动传感器2 用途: 模块特色: 模块使用说明: 实验器材:Arduino 168P 基础套件 互动媒体 实验目的: 实验电路: 实 ...

最新文章

  1. RGB-D对红外热像仪和毫米波雷达标定
  2. 过滤器在图纸上的符号_零基础秒懂,看了这份建筑符号清单,就能快速识别建筑图纸,收藏...
  3. javascript迭代器_JavaScript符号,迭代器,生成器,异步/等待和异步迭代器-全部简单解释...
  4. CenterFusion: 基于Radar和Camera融合的3D检测算法
  5. c语言一行代码太长,C语言修改一行代码,运行效率居然提升数倍,这个技巧你知道吗...
  6. python随机数比大小_1到范围内的随机数系统最大大小总是1模2^10
  7. Python3爬虫入门之Request库的使用
  8. DataTable数据集动态构造Table表结构
  9. R2017b-Matlab安装教程
  10. wpsoffice安卓历史版本_wps office移动版_wps office手机版下载-太平洋下载中心
  11. 伦敦银实时行情中的引爆点
  12. java丶对数组值按首字母进行排序
  13. 被国人误解了千年的七句话
  14. Nginx基础应用配置小结 - 运维笔记
  15. Android学习计划 Android学习总结
  16. chrome去广告插件
  17. Windows 无法连接到打印机.打印后台程序服务没有运行
  18. 参数估计:最大似然估计MLE
  19. http协议的状态码(statue) / readyState状态码
  20. PHP strtotime函数详解

热门文章

  1. 阿里正式启动2021届春季校招!2021Java不死我不倒,好文推荐
  2. 计算机二级python基础知识总结-江苏省计算机二级python样卷
  3. DG4V-5系列电磁阀配套线圈6033556-001
  4. 已知:Sn= 1+1/2+1/3+…+1/n。显然对于任意一个整数K,当n足够大的时候,Sn大于K。 现给出一个整数K(k大于等于1小于等于15),要求计算出一个最小的n;使得Sn大于K。
  5. android折叠布局,Android中FoldingLayout折叠布局的用法及实战全攻略
  6. php wiki搭建,Nginx+DokuWiki+PHP搭建自己的维基百科
  7. android saf写sd卡,使用SAF(存储访问框架)的Android SD卡写权限
  8. python 笔记--同时输入两个数字
  9. 放大电路中的反馈(电压串联负反馈,电流串联负反馈,电压并联负反馈,电压并联负反馈)
  10. Fergus的Removing Camera Shake from a Single Photograph的附录部分的一些推导