【STM32单片机_(HAL库)】3-2-1【中断EXTI】【电动车报警器项目】震动点灯

news2024/11/16 23:50:37

1.硬件

  • STM32单片机最小系统
  • LED灯模块
  • 震动传感器模块

2.软件

  • exti驱动文件添加
  • GPIO常用函数
  • 中断配置流程
  • main.c程序
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "exti.h"

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
    led_init();                         /* 初始化LED灯 */
    exti_init();                        /* 初始化EXTI */

    while(1)
    { 
        //如果检测到震动
        if(vibrate_flag_get() == TRUE)
        {
            //那么就点亮LED1两秒,然后熄灭
            led1_on();
            delay_ms(2000);
            led1_off();
            vibrate_flag_set(FALSE);//震动传感器有抖动在led1灭之后立即将其置为FALSE
        }
    }
}




  • led.c程序
#include "led.h"
#include "sys.h"

//初始化GPIO函数
void led_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    //打开时钟
    __HAL_RCC_GPIOB_CLK_ENABLE();                           // 使能GPIOB时钟
    
    //调用GPIO初始化函数
    gpio_initstruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;          // 两个LED对应的引脚
    gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;             // 推挽输出
    gpio_initstruct.Pull = GPIO_PULLUP;                     // 上拉
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;           // 高速
    HAL_GPIO_Init(GPIOB, &gpio_initstruct);
    //关闭LED
    led1_off();
    led2_off();
}

//点亮LED1的函数
void led1_on(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);   // 拉低LED1引脚,点亮LED1
}

//熄灭LED1的函数
void led1_off(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);     // 拉高LED1引脚,熄灭LED1
}

//翻转LED1状态的函数
void led1_toggle(void)
{
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);
}

//点亮LED2的函数
void led2_on(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);   // 拉低LED2引脚,点亮LED2
}

//熄灭LED2的函数
void led2_off(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);     // 拉高LED2引脚,熄灭LED2
}

//翻转LED2状态的函数
void led2_toggle(void)
{
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
}

  • led.h程序
#ifndef __LED_H__
#define __LED_H__

void led_init(void);
void led1_on(void);
void led1_off(void);
void led1_toggle(void);
void led2_on(void);
void led2_off(void);
void led2_toggle(void);

#endif

  • exti.c程序
#include "exti.h"
#include "sys.h"
#include "delay.h"
#include "led.h"

uint8_t vibrate_flag = FALSE;                               // 检测到震动标志位

void exti_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    //打开时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();                           // 使能GPIOA时钟
    
    //调用GPIO初始化函数
    gpio_initstruct.Pin = GPIO_PIN_4;                       // 震动传感器对应的引脚PA4
    gpio_initstruct.Mode = GPIO_MODE_IT_FALLING;            // 下降沿触发
    gpio_initstruct.Pull = GPIO_PULLUP;                     // 上拉
    HAL_GPIO_Init(GPIOA, &gpio_initstruct);
    
    HAL_NVIC_SetPriority(EXTI4_IRQn, 2, 0);                 // PA4对应中断线EXTI4,设置中断线的优先级
    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)
{
    //delay_ms(20);//中断服务函数中不要使用延时函数
    if (GPIO_Pin == GPIO_PIN_4)
    {
        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET)
            //led1_toggle();
            vibrate_flag = TRUE;//标志位,检测到震动置为TRUE
    }
}

uint8_t vibrate_flag_get(void)//不管中断,先将vibrate_flag置为FALSE
{
    uint8_t temp = vibrate_flag;
    vibrate_flag = FALSE;
    return temp;
    
}

void vibrate_flag_set(uint8_t value)
{
    vibrate_flag = value;
}




  • exti.h程序
#ifndef __EXTI_H__
#define __EXTI_H__

#include "stdint.h"//包含uint8_t的头文件

#define TRUE    1
#define FALSE   0

void exti_init(void);
uint8_t vibrate_flag_get(void);
void vibrate_flag_set(uint8_t value);

#endif




3.实物效果

  • 硬件模块接线
    LED1正—>VCC(3.3V)
    LED1负—>PB8
    震动传感器I/O—>PA4
    震动传感器VCC—>3.3V或5V(3.3V)
    震动传感器GND—>GND
    ST-Link下载方式
  • 实验现象
    使用中断的方法,振动传感器检测到振动时,LED1 点亮 2 秒,之后熄灭。
    在这里插入图片描述

keil源文件

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux常用命令 ---- rmdir 命令[删除一个空目录]

rmdir 命令 功能:删除一个空目录 我们使用 mkdir 命令创建一个名为 test 空文件夹,如下图所示。 现在使用 rmdir 命令将 test 文件夹进行删除,如下图所示。 注意:rmdir 命令只能删除一个空目录,如果这个目录中有其他文…

【云原生】Kubernetes中的名称空间和资源配额详细用法与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

医疗器械维修其实没有想的那么难

在很多人的印象中,医疗器械维修是一项极其复杂且神秘的工作,似乎只有专业的技术精英才能胜任。然而,事实并非如此,医疗器械维修其实并没有想象中那么难。 首先,现代医疗器械的设计越来越注重人性化和可维护性。制造商…

迎接开学新生活!高三开学必备物品推荐~

步入高三,意味着每一位学子都将面临人生中重要的转折点——高考。为了帮助高三学生们准备充分,让学习生活之路更加顺畅。今天小编综合了实用性、性价比以及学生需求的考量,精选了一系列必备物品,旨在为高三学生创造一个更为舒适、…

ICMP互联网控制报文协议

ICMP 互联网控制报文协议 ICMP ( Internet Control Message Protocol ,也就是互联⽹控制报⽂协议)。 ⽹络包在复杂的⽹络传输环境⾥,常常会遇到各种问题。 当遇到问题的时候,总不能死个不明不⽩,没头没脑…

4. kafka消息监控客户端工具

KafkaKing官网地址 : https://github.com/Bronya0/Kafka-King github下载地址 : Releases Bronya0/Kafka-King (github.com) (windows、macos、linux版本) 云盘下载地址 : https://pan.baidu.com/s/1dzxTPYBcNjCTSsLuHc1TZw?pwd276i (仅windows版本) 连接kafka 输入本地地址…

基于Java语言的私家车充电桩系统+私家车充电平台+充电桩系统项目

介绍 SpringBoot 框架,私家车充电桩平台充电桩系统充电平台充电桩云快充协议1.5-1.6协议新能源汽车二充电平台源码Java源码私家车充电系统 源码合作 提供无加密源代码和数据库,支持二次开发 SpringMVC架构完整充电桩系统源代码-充电桩系统-家充公充-新…

大数据报表如何免费设计?本攻略附赠强大报表工具!

在当今信息爆炸的时代,大数据跃升为企业战略决策的核心支撑点。如何有效地从浩瀚的数据海洋中精炼出富含洞察力的信息,并将其转化为直观易懂的报表,是每个数据分析师和决策者都需要面对的挑战。这需要掌握一定的技巧和经验,本文将…

C语言03--控制流

1.二路分支 逻辑:程序中某段代码需要在满足某个条件时才能运行形式: if 语句:表达一种 如果-则 的条件执行关系if-else 语句:表达一种 如果-否则 的互斥分支关系 语法: if ( 判断表达式 ) { // 代码块 } 解…

大学生最佳就业城市排行榜出炉!

最佳就业城市 随着秋招陆续开始,不少高校毕业生迎来了人生转折点。 其中一个需要重点考虑的点,是要前往哪座城市作为就业第一站。 不妨参考一下就业蓝皮书的统计数据: 可以发现,一线城市的就业人数正逐步减少,"新…

grid-template-columns: 1.833333rem 1fr;

问: grid-template-columns: 1.833333rem 1fr;这是什么属性? 回答: grid-template-columns: 1.833333rem 1fr; 定义了一个网格布局的列宽: 1.833333rem 表示第一列的宽度是相对于根元素字体大小的固定宽度, 1fr 是一个灵活单位,表示第二列会占据网…

【吊打面试官系列-Memcached面试题】memcached 最大的优势是什么?

大家好,我是锋哥。今天分享关于 【memcached 最大的优势是什么?】面试题,希望对大家有帮助; memcached 最大的优势是什么? Memcached 最大的好处就是它带来了极佳的水平可扩展性,特别是在一个巨大的系统中。…

[Python办公]Pandas创建透视表入门2

pivot_table 透视表在 Pandas 中是一个非常强大和灵活的工具,它支持许多高级功能,可以用于复杂的数据分析和报告生成。以下是一些更高级的用法和详细说明 1. 多级索引(MultiIndex) pivot_table 支持多级索引,这意味着…

iPhone16操作按钮大变样?引入快门拍摄按钮,提前告诉你它要干啥

随着智能手机摄影功能的不断升级,用户对于高质量照片和视频的需求也日益增长。苹果公司一直以来都在引领移动摄影技术的发展方向,而即将到来的iPhone 16系列更是备受瞩目。据多个消息来源透露,iPhone 16将引入一项创新功能——一个专门设计用…

【python实现修改所有可执行程序的图标】

实现效果: 图标在此 替换前: 吐槽:这原版看着也不像原版😃 替换后: 代码: 注:必须要.ico图标文件 import winreg import ctypes import sys import os# 使用管理员身份打开程序 ctypes.windll…

3万多育儿宝典育儿网站ACCESS\EXCEL数据库

找了下以前弄到的一些育儿数据,发现小数据的《育儿宝典育儿知识大全ACCESS数据库》《结构漂亮的怀孕手册ACCESS数据库》、《结构漂亮的亲子宝典ACCESS数据库》,大的数据有《3万妈妈说育儿百科知识ACCESS数据库》而今天又弄到了一个3万多的育儿宝典网站&a…

ArcGIS Pro基础:状态栏显示栏的比例尺设置和经纬度位置

上图所示,界面下方最左侧是显示的比例尺,可以进行选择设置,也可以进行自定义设置 上图所示,可以手动录入比例尺,同时也可以对比例尺设置别名,比如【实验1】作为特定比例尺的标记 如上图所示,可以…

火语言RPA流程组件介绍--变量持久化及读取

变量持久化及读取 对于一些常用变量在下次或其他流程需要继续使用时,可以将内存中的变量持久化保存到该组件格式化的特定本地文件中,在下次或其他流程使用时从文件读取数据输出至下一个组件或变量,常用来保存难以初始化或者在流程中进行特定…

解决方案上新了丨趋动科技牵手谐云,联合打造支持算力池化的边缘计算解决方案

得益于近些年发展得如火如荼的云原生技术、尤其是作为云原生技术底座的容器云技术的高速发展和产业化落地,业界发现,将GPU等算力资源容器化、资源池化,可以将算力的管理能力拓展到整个数据中心。 作为国内为数不多掌握底层核心技术的容器云产…

SpringBoot响应式编程(4)Spring Security Reactive

一、概述 1.1应用安全 防止攻击: ○ DDos、CSRF、XSS、SQL注入... 控制权限 ○ 登录的用户能干什么。 ○ 用户登录系统以后要控制住用户的所有行为,防止越权; 传输加密 ○ https ○ X509 认证: ○ OAuth2.0 ○ JW…