通过STM32F103C8T6外部中断完成小灯的震动感应开与关

通过STM32外部中断完成小灯的震动感应开与关

1.所需硬件:

STM32F103C8T6,USB灯,继电器,震动传感器

2.硬件接线:

在这里插入图片描述

3.代码编写

(1)配置继电器结构体

#include "relay.h"
#include "stm32f10x.h"

void Relay_Init(void)
{
		GPIO_InitTypeDef Relay_init;//定义继电器结构体
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//打开串口时钟

	    Relay_init.GPIO_Mode  = GPIO_Mode_Out_PP;//输出模式配置成推挽输出
	    Relay_init.GPIO_Pin   = GPIO_Pin_3;//端口选择A3
	    Relay_init.GPIO_Speed = GPIO_Speed_10MHz;//配置引脚传输速度为10MHz
	
		GPIO_Init(GPIOA,&Relay_init);//初始化串口

}

(2)中断配置

#include "exti.h"
#include "stm32f10x.h"

void Exti_Init(void)
{
      GPIO_InitTypeDef Shake_Init;//定义震动传感器结构体
	   EXTI_InitTypeDef exti_init;//定义EXTI中断结构体
	   NVIC_InitTypeDef nvic_init;//定义NVIC中断结构体

   	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOB的APB2
   	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//使能AFIO的APB2
	  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9);//选择GPIO管脚用作外部中断线路


      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置优先级组为第二组
    
	   GPIO_InitTypeDef Shake_Init;//定义震动传感器结构体
	   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//打开串口时钟
	   Shake_Init.GPIO_Mode   =  GPIO_Mode_IPD;//输入模式配置成下拉输入模式 
	   Shake_Init.GPIO_Pin    =  GPIO_Pin_9;//端口选择B9
	   Shake_Init.GPIO_Speed  =  GPIO_Speed_10MHz;//配置引脚传输速度为10MHz
	
	   GPIO_Init(GPIOB,&Shake_Init);//初始化串口
	   
	   exti_init.EXTI_Line    = EXTI_Line9;//选择中断线9
	   exti_init.EXTI_Mode    = EXTI_Mode_Interrupt;//设置为中断请求
	   exti_init.EXTI_Trigger = EXTI_Trigger_Falling;//触发方式下降沿触发
	   exti_init.EXTI_LineCmd = ENABLE;//中断线使能
	
	   EXTI_Init(&exti_init);//中断初始化
         
         nvic_init.NVIC_IRQChannel                   = EXTI9_5_IRQn;//中断通道  指定IRQ通道 这里指定外部中断线9-5中断  因为使用的是EXTI9
		 nvic_init.NVIC_IRQChannelCmd                = ENABLE;//设定指定IRQ通道中断使能
		 nvic_init.NVIC_IRQChannelPreemptionPriority = 1;//设定指定IRQ通道的先占优先级
		 nvic_init.NVIC_IRQChannelSubPriority        = 1;//设定指定IRQ通道的从优先级
		 
		 NVIC_Init(&nvic_init);//初始化NVIC中断

}

(3)主函数编写

#include "stm32f10x.h"
#include "relay.h"
#include "exti.h"


void delay(uint16_t time)//延时程序
{
	   uint16_t i=0;
	   while(time--)
		 {
						i=12000;
						while(i--);
		 }
}


int  main()
{
	   Relay_Init();//初始化函数
	   Exti_Init();
	   

	   GPIO_SetBits(GPIOA,GPIO_Pin_3);//初始化一直高电平
		 while(1)//无限循环
		 {
 
		 }

}

void EXTI9_5_IRQHandler(void)//外线路5-9的中断处理程序
{
	  if (EXTI_GetITStatus(EXTI_Line9) != RESET)//检测制定的EXTI9线路触发请求是否发生。
	  {//发生输出低电平并延时1000ms再输出高电平并延时1000ms
		  GPIO_ResetBits(GPIOA,GPIO_Pin_3);
      delay(1000);
			GPIO_SetBits(GPIOA,GPIO_Pin_3);
	    delay(1000);

		}	
			
      EXTI_ClearFlag(EXTI_Line9);//清除中断标志位

	
}

  初学小白,请多指教
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值