STM32-笔记9-电动车报警器

news/2024/12/26 20:33:17/
1、项目前期准备

 

接线如图所示:

2、这里主要用到07、08、09项目工程文件,复制09项目工程文件,重命名为10-电动车报警器项目

把08-继电器定时开闭项目中的alarm文件夹复制到10项目中

将alarm文件夹中的内容加载到项目文件中

3、代码:

exti.c

#include "exti.h"
#include "sys.h"
#include "delay.h"
#include "led.h"uint8_t buttonA_flag = FALSE;                               // 按键A按下的标志位
uint8_t buttonB_flag = FALSE;                               // 按键B按下的标志位
uint8_t vibrate_flag = FALSE;                               // 检测到震动标志位void exti_init(void)
{GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOA_CLK_ENABLE();                           // 使能GPIOA时钟__HAL_RCC_GPIOB_CLK_ENABLE();//按键B中断配置gpio_initstruct.Pin = GPIO_PIN_12;                      // 按键B对应的引脚gpio_initstruct.Mode = GPIO_MODE_IT_RISING;             // 上升沿触发gpio_initstruct.Pull = GPIO_PULLDOWN;                   // 下拉HAL_GPIO_Init(GPIOA, &gpio_initstruct);HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);             // 设置EXTI15_10中断线的优先级HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);                     // 使能中断//按键A中断配置gpio_initstruct.Pin = GPIO_PIN_5;                       // 按键A对应的引脚gpio_initstruct.Mode = GPIO_MODE_IT_RISING;             // 上升沿触发gpio_initstruct.Pull = GPIO_PULLDOWN;                   // 下拉HAL_GPIO_Init(GPIOB, &gpio_initstruct);HAL_NVIC_SetPriority(EXTI9_5_IRQn, 2, 0);               // 设置EXTI9_5中断线的优先级HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);                       // 使能中断//震动传感器中断配置gpio_initstruct.Pin = GPIO_PIN_4;                       // 震动传感器对应的引脚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);                 // 设置EXTI0中断线的优先级HAL_NVIC_EnableIRQ(EXTI4_IRQn);                         // 使能中断
}void EXTI15_10_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
}void EXTI9_5_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
}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_12)                                    //检测到B键按下{if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == GPIO_PIN_SET)//led2_toggle();buttonB_flag = TRUE;}else if (GPIO_Pin == GPIO_PIN_5)                                //检测到A键按下{if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == GPIO_PIN_SET)//led1_toggle();buttonA_flag = TRUE;}else if (GPIO_Pin == GPIO_PIN_4)                                //检测到震动{if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET)//led1_toggle();vibrate_flag = TRUE;}
}uint8_t buttonA_flag_get(void)
{uint8_t temp = buttonA_flag;buttonA_flag = FALSE;return temp;
}void buttonA_flag_set(uint8_t value)
{buttonA_flag = value;
}uint8_t buttonB_flag_get(void)
{uint8_t temp = buttonB_flag;buttonB_flag = FALSE;return temp;
}void buttonB_flag_set(uint8_t value)
{buttonB_flag = value;
}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;
}

exti.h

#ifndef __EXTI_H__
#define __EXTI_H__#include "stdint.h"#define TRUE    1
#define FALSE   0void exti_init(void);
uint8_t buttonA_flag_get(void);
void buttonA_flag_set(uint8_t value);
uint8_t buttonB_flag_get(void);
void buttonB_flag_set(uint8_t value);
uint8_t vibrate_flag_get(void);
void vibrate_flag_set(uint8_t value);#endif

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "exti.h"
#include "alarm.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */led_init();                         /* 初始化LED灯 */exti_init();                        /* 初始化EXTI */alarm_init();                       /* 初始化继电器 */uint8_t alert_mode = FALSE;         //警戒模式标志while(1){ //A按键是否按下?if(buttonA_flag_get() == TRUE){alarm_on();delay_ms(2000);alarm_off();alert_mode = TRUE;}//B按键是否按下?if(buttonB_flag_get() == TRUE){if(alarm_status_get() == ALARM_STATUS_ON)alarm_off();else{alarm_on();delay_ms(1000);alarm_off();}alert_mode = FALSE;}//如果处于警戒模式if(alert_mode == TRUE){if(vibrate_flag_get() == TRUE)alarm_on();}elsevibrate_flag_set(FALSE);}
}


http://www.ppmy.cn/news/1558346.html

相关文章

vscode写python,遇到问题:ModuleNotFoundError: No module named ‘pillow‘(已解决 避坑)

1 问题: ModuleNotFoundError: No module named pillow 2 原因: 原因1:安装Pillow的pip命令所处的python版本与vscode调用的python解释器版本不同。 如: 原因2:虽然用的是pillow,但是写代码的时候只能用…

谷歌浏览器的网络安全检测工具介绍

作为全球最受欢迎的浏览器之一,谷歌浏览器不仅提供了快速、便捷的浏览体验,还内置了一系列强大的网络安全检测工具,帮助用户识别潜在的网络威胁,保护个人隐私和数据安全。本文将详细介绍谷歌浏览器中的几项关键网络安全检测功能&a…

CUDA11.4版本的Pytorch下载

由于CUDA11.4版本找不到对应的pip下载,可以用CUDA11.3版本 解决方案: 可以在对应环境输入: pip install torch1.11.0cu113 torchvision0.12.0cu113 torchaudio0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113

spring boot的配置文件属性注入到类的静态属性

假设我们有一个名为some.property的属性,它在Spring配置文件中定义了值,例如application.properties或application.yml。 1. 非静态字段 为什么推荐? 简单直接:不需要额外的配置或复杂的逻辑。符合Spring的设计理念&#xff1a…

Diffusers使用笔记

Diffusers 是用于生成图像、音频等最先进预训练扩散模型的库。它既支持推理解决方案,也支持训练自己的扩散模型,Diffusers 是一个支持这两者的模块化工具箱。区别与ComfyUI与webUI这类UI类的应用,Diffusers实际上是更底层的库,可以…

【STM32 Modbus编程】-作为从设备写入寄存器

作为从设备写入寄存器 文章目录 作为从设备写入寄存器1、硬件准备与连接1.1 RS485模块介绍1.2 硬件配置与接线1.3 软件准备2、写入单个寄存器3、写入多个寄存器本文将介绍STM32作为ModBus从设备如何发送对写入单个和多个寄存器的查询的响应。 1、硬件准备与连接 1.1 RS485模块…

PrimeVue菜单模块(Menu),看api的重要性

以下是对PrimeVue菜单模块(Menu)的API属性的中文详解: 一、整体概述 PrimeVue的菜单(Menu)是一个支持动态和静态定位的导航/命令组件,其API通过定义一些辅助的属性(props)、事件等&…

PHP 新手教程:从入门到构建简单网页

PHP 是一种服务器端脚本语言,广泛用于 Web 开发。今天教大家从零基础学习 PHP,并通过实际代码示例,帮助你理解核心概念并构建一个简单的网页。 一、准备工作 在开始学习之前,你需要: 文本编辑器: 任何文本编辑器都可…