Led相关初始化:
void LED_init(void)
{
GPIO_InitTypeDef led_init;
//使能APB2 的时钟RCC
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE);
//结构体配置 ,led 低电平亮
led_init.GPIO_Pin=GPIO_Pin_13;
led_init.GPIO_Mode=GPIO_Mode_Out_PP;
led_init.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&led_init);
}
中断初始化(可以节省CPU):
void Exti_init(void)
{
GPIO_InitTypeDef Shake_init;
//使能GPIOA 的时钟RCC
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
//GPIOA是GPIO输出端口,又要当外部中断源
RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig( GPIO_PortSourceGPIOA, GPIO_PinSource1);
//结构体配置
Shake_init.GPIO_Pin=GPIO_Pin_1;
Shake_init.GPIO_Mode=GPIO_Mode_IPD;
Shake_init.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&Shake_init);
//配置外部中断
EXTI_InitTypeDef Exti_init;
Exti_init.EXTI_Line=EXTI_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_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置中断分组
NVIC_InitTypeDef nvic_init;
nvic_init.NVIC_IRQChannel=EXTI_Line1;
nvic_init.NVIC_IRQChannelPreemptionPriority=1;
nvic_init.NVIC_IRQChannelSubPriority=1;
nvic_init.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&nvic_init);
}
继电器相关配置:
使继电器连接stm32f103的GPIOA端口的GPIO_Pin_3;
void Relay_init(void)
{
//使能GPIOA 的时钟RCC
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
//结构体配置
GPIO_InitTypeDef Relay_init;
Relay_init.GPIO_Pin=GPIO_Pin_3;
Relay_init.GPIO_Mode=GPIO_Mode_Out_PP;
Relay_init.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&Relay_init);
}
震动传感器相关配置:
震动传感器没有发生震动时是高电平,发生震动时是低电平
震动传感器接stm32f103的GPIOA端口的GPIO_Pin_1;
void Shake_init(void)
{
GPIO_InitTypeDef Shake_init;
//使能GPIOA 的时钟RCC
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
//结构体配置
Shake_init.GPIO_Pin=GPIO_Pin_1;
/*
只是做初始化电平的作用,下拉输入模式:电平默认为低电平,可以检测由低到高的电平变化
*/
Shake_init.GPIO_Mode=GPIO_Mode_IPD;
Shake_init.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&Shake_init);
}
主函数逻辑及代码:
震动传感器因为没震动的时候 ,震动传感器输出的是高电平,所以可以通过去读引脚的电平来判断它是否发生震动,如果发生震动,亮灯持续一秒,关灯,如果没有发生震动则为关灯状态。
LED_init();
Relay_init();
Shake_init();
Exti_init();
GPIO_SetBits(GPIOA, GPIO_Pin_3); //初始化继电器为关闭状态,关灯状态
while(1)
{
/*
震动传感器:没有发生震动是高电平,发生震动是低电平 GPIOA GPIO_Pin_1
震动传感器:因为没震动的时候,震动传感器是输出高电平
*/
//使用了中断,下面这段代码就选择可以注释
if(GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_1)==0) //如果发生震动
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3); //亮灯
delay(1000); //持续一秒
GPIO_SetBits(GPIOA, GPIO_Pin_3);
}else{
GPIO_SetBits(GPIOA, GPIO_Pin_3);
}
}
void EXTI1_IRQHandler(void)
{
if(EXTI_GetITStatus( EXTI_Line1) !=RESET) //判断是否发生了中断,//发生中断则进入
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3); //亮灯
delay(1000);
GPIO_SetBits(GPIOA, GPIO_Pin_3);
}
EXTI_ClearITPendingBit( EXTI_Line1);
}