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

1、项目前期准备

接线如图所示:

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

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

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

3、代码:

exti.c

cpp 复制代码
#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

cpp 复制代码
#ifndef __EXTI_H__
#define __EXTI_H__

#include "stdint.h"

#define TRUE    1
#define FALSE   0

void 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

cpp 复制代码
#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();
        }
        else
            vibrate_flag_set(FALSE);
    }
}
相关推荐
sunoo-2293 小时前
【ARM嵌入式学习笔记第十天】i.MX6ULL eLCDIF控制器驱动RGB LCD全解析(硬件原理+寄存器配置+裸机代码)
arm开发·笔记·学习
听风若依4 小时前
数据在内存中的存储-纸面笔记整理
c语言·笔记
xiaominngtongxue5 小时前
从中职技能节看实训教学的组织逻辑
笔记
杨逢昌工厂6S管理5 小时前
109-杨逢昌车间管理负熵循环:三环体系持续输出负熵的机制解析
经验分享·笔记·职场和发展·学习方法
inferno5 小时前
SVN学习笔记(二)
笔记·学习·svn
海绵宝宝转agent6 小时前
leetCode100算法开源笔记分享
笔记·算法
91刘仁德7 小时前
Linux网络编程从入门到实战:UDP/TCP协议与socket编程全解析
linux·网络·笔记·tcp/ip·udp
@Mike@7 小时前
13-数据库学习笔记(查询执行处理模型)
数据库·笔记·学习
Go Work7 小时前
实体类字段用 @Value 赋了默认值,取出来还是 null?
经验分享·笔记
白杨尚青7 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl