一、前序
1.1 项目需求
点击遥控器 A 按键,系统进入警戒模式,一旦检测到震动(小偷偷车),则喇叭发出声响报警,吓退小偷。
点击遥控器 B 按键,系统退出警戒模式,再怎么摇晃系统都不会报警,否则系统一直发出尖叫,让车主尴
尬
1.2 硬件清单
1.3 硬件接线
1.4 项目流程图
二、内容
2.1 exti.c
设置中断优先级分组后,中断服务函数固定写法
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); //中断服务公共函数
}
中断服务函数后写,回调函数,给433M A,B和震动传感器写一个标志位
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)
//led1_toggle();
buttonB_flag = TRUE;
}
else if(GPIO_Pin == GPIO_PIN_5)
{
//检测到A键按下
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == GPIO_PIN_SET)
//led2_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;
}
}
若不调用全局变量,此种写法,B和振动类似写法
uint8_t buttonA_flag_get(void)
{
uint8_t tmp = buttonA_flag;
buttonA_flag = FALSE;
return tmp;
}
void buttonA_flag_set(uint8_t value)
{
buttonA_flag = value;
}
2.2 exti.h
#ifndef _EXTI_H_
#define _EXTI_H_
#include "stdint.h"
#define TRUE 1
#define FALSE 0
void exti_init(void);
uint8_t buttonB_flag_get(void);
void buttonB_flag_set(uint8_t value);
uint8_t buttonA_flag_get(void);
void buttonA_flag_set(uint8_t value);
uint8_t vibrate_flag_get(void);
void vibrate_flag_set(uint8_t value);
#endif
2.3 alarm.c
继电器类似led写法
uint8_t alarm_status_get(void)
{
return (uint8_t)HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7);
}