STM32外部中断震动传感器控制小灯亮灭(包含中断原理)

目录

一、什么是外部中断

 二、STM32外部中断概述

1. 相关控制器(EXTI外设)​编辑

1.1 其主要特性

1.2 使用过程

1.3 中断服务函数

二、NVIC(内核中的中断总控制)

三、STM32外部中断震动传感器控制小灯亮灭源码

1. exti.c外部中断配置源码

2. shake.c  震动传感器SW-18010P模块配置源码

3. led.c源码

4.主函数main.c


ps:第一次发文,如有错误请大家指出,感谢大家啦,大家一起加油努力吧!

一、什么是外部中断

可以想象一个场景:一个人在屋内看书,此时有人敲门,这个人停止看书去开门,后继续回来看书。这个过程就可以看成一个中断过程。将此人看成一个单片机系统,看书看成CPU正在处理的主任务,将始终执行。而有人敲门,需要此人去开门,就是外部改变,需要CPU暂时中断主要任务,去处理中断任务(开门),处理完后继续回到主任务(看书)。                                                  

 二、STM32外部中断概述

1. 相关控制器(EXTI外设)

1.1 其主要特性

1.2 使用过程

要使用并产生中断,必须首先配置好并使能中断线,中断线与IO口对应关系如下:

通过上如可以观察到,二者映射过程用到了AFIO复用IO寄存器,因此在配置过程中必须使能AFIO复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE)。1.041

1.3 中断服务函数

外部中断线与中断函数对应关系如下:

EXTI0_IRQHandler          

EXTI1_IRQHandler

EXTI2_IRQHandler          

EXTI3_IRQHandler          

EXTI4_IRQHandler          

EXTI9_5_IRQHandler        

EXTI15_10_IRQHandler 

二、NVIC(内核中的中断总控制)

STM32的NVIC详解_stm32 nvic-CSDN博客

三、STM32外部中断震动传感器控制小灯亮灭源码

1. exti.c外部中断配置源码

#include "stm32f10x.h"
#include "exti.h"
void exti_Init(void)
{
		//1.配置GPIO
	EXTI_InitTypeDef exti_Init;
	NVIC_InitTypeDef nivc_Init;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//AFIO为片上外设,将gpio口与extiline通道进行联通,开启其时钟
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2);//pa2->EXTI2
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置中断优先级分组

	
	//2.配置EXTI外部中断初始化,EXTI不需要开启时钟,默认开启
	exti_Init.EXTI_Line= EXTI_Line2;  //中断通道选择
	exti_Init.EXTI_Mode= EXTI_Mode_Interrupt;//模式选择中断,另一种为事件
	exti_Init.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿触发
	exti_Init.EXTI_LineCmd= ENABLE;//使能
	EXTI_Init(&exti_Init);
	
	//EXTI产生中断源,进去NVIC,配置NVIC中断控制器     在misc里
	//1.设置中断通道 2.设置抢占优先级 3.设置子优先级 4.控制是否能用 或否
	nivc_Init.NVIC_IRQChannel=EXTI2_IRQn;
	nivc_Init.NVIC_IRQChannelPreemptionPriority=0;
	nivc_Init.NVIC_IRQChannelSubPriority=0;
	nivc_Init.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&nivc_Init); 

}

2. shake.c  震动传感器SW-18010P模块配置源码

#include "stm32f10x.h"
#include "shake.h"
void shake_Init(void)
{
	 GPIO_InitTypeDef shake_Init;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	shake_Init.GPIO_Pin=GPIO_Pin_2;
	shake_Init.GPIO_Speed=GPIO_Speed_10MHz;
	shake_Init.GPIO_Mode=GPIO_Mode_IPD;//设置下拉输入
	
	GPIO_Init(GPIOA,&shake_Init);

}

3. led.c源码

#include "stm32f10x.h"
#include "led.h"

//初始化LED灯的函数---定义,声明,调用
void Led_init(void)
{
	//初始化LED引脚GPIOA1
	
	GPIO_InitTypeDef led_init;//定义GPIO的结构体
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//初始化时钟,使能APB2下的外设GPIOA的时钟使能

	
	led_init.GPIO_Pin=GPIO_Pin_1;//配置GPIOA1的引脚
  led_init.GPIO_Speed=GPIO_Speed_2MHz;//配置引脚输出速度为2MHZ
	led_init.GPIO_Mode=GPIO_Mode_Out_PP;//配置引脚的模式为推挽输出
	
	GPIO_Init(GPIOA,&led_init);//初始化GPIO结构体

}

4.主函数main.c

#include "stm32f10x.h"
#include "led.h"
#include "main.h"
#include "shake.h"
#include "exti.h"

void delay(uint16_t  time)//延时1ms函数
{
    uint16_t i = 0;
	 while(time --)
	 {
		 i=12000;
		 while(i--);
	 }
	 
}
//编写中断响应函数
//1.在.s文件中找到中断响应函数
//2.写一个同名函数覆盖它
void EXTI2_IRQHandler(void)
{	 
	if(EXTI_GetITStatus(EXTI_Line2)!=RESET)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
		delay(500);
		GPIO_SetBits(GPIOA, GPIO_Pin_1);
	}
  EXTI_ClearFlag(EXTI_Line2);
}
int  main()
{
	  Led_init();
	  Bear_Init();
	  Key_Init();
    Relay_Init();
	  shake_Init();
	  exti_Init();
    GPIO_SetBits(GPIOA, GPIO_Pin_1);//先初始化灯为关闭状态
	  while(1)
	  {
			
		}
}

  • 29
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值