震动传感器
发生震动的时候是低电平状态;
不发生震动的时候是高电平状态
所以
IO口的输入模式选择 下拉输入
来监测是否受到的震动
#include "shakeLight.h"
#include "stm32f10x.h"
void shakeLight_demo(void)
{
GPIO_InitTypeDef shakeLight;//GPIO口的结构体设置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//APB2总线下的GPIOA口的使能
shakeLight.GPIO_Mode=GPIO_Mode_IPD;//设置为下拉输入模式
shakeLight.GPIO_Pin=GPIO_Pin_1;//因为震动器连接了Pin_1口,进行配置
shakeLight.GPIO_Speed=GPIO_Speed_10MHz;//频率
GPIO_Init(GPIOA,&shakeLight);//初始化
}
继电器
低电平 ---- 接通 GPIO_ResetBits
高电平 ---- 断开
#include "jidianqi.h"
#include "stm32f10x.h"
void jidianqi_demo(void)
{
GPIO_InitTypeDef jidianqi;//GPIO口的结构体设置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//APB2总线下的GPIOA口的使能
jidianqi.GPIO_Mode= GPIO_Mode_Out_PP;//设置推挽输出
jidianqi.GPIO_Pin= GPIO_Pin_3;//因为震动器连接了Pin_3口,进行配置
jidianqi.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &jidianqi);//初始化
}
中断函数的配置
- 准备工作
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能要用的GPIO口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//启动GPIO口的复用功能;使能‘AFIO’模式
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);//配置GPIOA中的GPIO1口为外部中断源
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置NVIC中断控制器的抢占优先级
- 初始化配置用来中断的GPIO口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
shakeLight.GPIO_Mode=GPIO_Mode_IPD;
shakeLight.GPIO_Pin=GPIO_Pin_1;
shakeLight.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&shakeLight);
- 初始化配置EXIT外部中断
exti_init.EXTI_Line =EXTI_Line1;//因为使用GPIO1口,所以使用外部中断线LINE1
exti_init.EXTI_Mode =EXTI_Mode_Interrupt;//中断模式
exti_init.EXTI_Trigger =EXTI_Trigger_Falling;//震动时从高电平跳到低电平,所以采用下降沿触发
exti_init.EXTI_LineCmd =ENABLE;//使能
EXTI_Init(&exti_init);
- 配置NVIC中断控制器;控制优先级的
nvic_init.NVIC_IRQChannel=EXTI1_IRQn;//使用了GPIO1口,先用EXTI1中断通道了
nvic_init.NVIC_IRQChannelCmd=ENABLE;//使能
nvic_init.NVIC_IRQChannelPreemptionPriority=1;//优先级为1
nvic_init.NVIC_IRQChannelSubPriority =1;//优先级为1
NVIC_Init(&nvic_init);
-
在MIAN.C函数里编写中断服务函数
EXTI_GetFlagStatus是中断标志函数,标志位为**‘RESET’**;
如果外部中断的标志位不是等于RESET就是产生了中断EXTI_ClearFlag是清除中断标志函数;如果执行不清除,中断标志会一直存在;中断反复执行
void EXTI1_IRQHandler(void)//使用EXTI1中断通道的中断函数
{
if(EXTI_GetFlagStatus(EXTI_Line1) != RESET)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3);//给继电器低电平,开灯
delay(2000);
GPIO_SetBits(GPIOA, GPIO_Pin_3); //给继电器高电平,关灯
}
EXTI_ClearFlag(EXTI_Line1);//清除中断标志函数;如果不清除,中断标志会一直存在;中断反复执行
}
因为在这个项目中,只用到了一个中断,所以外部中断线暂时先用第一条,中断通道类同;优先级均设为1