STM32——外部中断感应灯的应用

本文介绍了如何使用STM32进行外部中断配置,通过GPIO和EXTI初始化实现震动传感器的中断功能。当传感器检测到震动时,中断服务函数控制LED灯闪烁,延时1秒后熄灭。主要涉及GPIO初始化、EXTI设置、NVIC中断控制器配置及中断服务函数编写。
摘要由CSDN通过智能技术生成

STM32——外部中断感应灯的应用

项目概述:

环境概述:

Windows10 专业版

MDK—Lite 5.25

步骤:

配置相关文件

image-20220212110858714

前提:配置相关结构体

	GPIO_InitTypeDef shake_init;
	EXTI_InitTypeDef exti_init;
	NVIC_InitTypeDef nvic_init;

配置IO口、外部中断时钟、复用的时钟

//配置外部中断时钟
	//复用
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,  GPIO_PinSource1);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

image-20220211204446634

image-20220211203540369

1、初始化用来中断的GPIO口

shake_init.GPIO_Mode = GPIO_Mode_IPD;
shake_init.GPIO_Pin  = GPIO_Pin_1;
shake_init.GPIO_Speed= GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&shake_init);

这是初始化传感器的IO口

2、初始化EXTI外部中断

	//中断线与引脚口一致
	exti_init.EXTI_Line		= EXTI_Line1;
	exti_init.EXTI_LineCmd  = ENABLE;
	exti_init.EXTI_Mode     = EXTI_Mode_Interrupt;
	exti_init.EXTI_Trigger  = EXTI_Trigger_Falling;
	EXTI_Init(&exti_init);

image-20220212112852491

image-20220212113114385

3、配置NVIC中断控制器

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

image-20220211203540369

里面的参数,我们怎么去找呢?

image-20220211203626594

如图所示:

image-20220211203720426


nvic_init.NVIC_IRQChannel 					= EXTI1_IRQn;
nvic_init.NVIC_IRQChannelSubPriority		=  1;
nvic_init.NVIC_IRQChannelPreemptionPriority =  1;
nvic_init.NVIC_IRQChannelCmd      		    = ENABLE;
NVIC_Init(&nvic_init);

4、编写中断服务函数

void EXTI1_IRQHandler(void)
{
	
	if(EXTI_GetITStatus(EXTI_Line1) != RESET)//判断是否发生了中断
		{
			GPIO_ResetBits(GPIOA, GPIO_Pin_3);
			delayTime(1000);
			GPIO_SetBits(GPIOA, GPIO_Pin_3);

		
	}
	EXTI_ClearFlag( EXTI_Line1);

}

image-20220211211455867

判断是否发生了中断

image-20220211211616110

image-20220211211918887

image-20220211230334398

代码:

exti.c代码:

#include "exti.h"
#include "stm32f10x.h"
void Exti_Init(void){
	//配置结构体
	GPIO_InitTypeDef shake_init;
	EXTI_InitTypeDef exti_init;
	NVIC_InitTypeDef nvic_init;
	//配置外部中断时钟
	//复用
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,  GPIO_PinSource1);

	
	//1、初始化用来中断的GPIO口
	shake_init.GPIO_Mode = GPIO_Mode_IPD;
	shake_init.GPIO_Pin  = GPIO_Pin_1;
	shake_init.GPIO_Speed= GPIO_Speed_10MHz;
	
	GPIO_Init(GPIOA,&shake_init);
	//2、初始化EXTI外部中断
	//中断线与引脚口一致
	exti_init.EXTI_Line			= EXTI_Line1;
	exti_init.EXTI_LineCmd  = ENABLE;
	exti_init.EXTI_Mode     = EXTI_Mode_Interrupt;
	exti_init.EXTI_Trigger  = EXTI_Trigger_Falling;
	EXTI_Init(&exti_init);
	
	//3、配置NVIC中断控制器
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	nvic_init.NVIC_IRQChannel 									= EXTI1_IRQn;
	nvic_init.NVIC_IRQChannelSubPriority				=  1;
	nvic_init.NVIC_IRQChannelPreemptionPriority =  1;
	nvic_init.NVIC_IRQChannelCmd      				  = ENABLE;
	NVIC_Init(&nvic_init);
	
	//4、编写中断服务函数
	
}



exti.h代码:

#include "stm32f10x.h"

void Exti_Init(void);

main.c代码:

#include "stm32f10x.h"
#include "led.h"
#include "Relay.h"
#include "Shake.h"
#include "exti.h"
int main(void)
{ 
	LED_Init();//灯
	Relay_Init();//继电器
	Shake_Init();//震动传感器
	Exti_Init();

	GPIO_SetBits(GPIOA, GPIO_Pin_3);//是引脚3j继电器高电平——关灯
	
	while(1){

		}
	

}

void EXTI1_IRQHandler(void)
{
	
	if(EXTI_GetITStatus(EXTI_Line1) != RESET)//判断是否发生了中断
		{
			GPIO_ResetBits(GPIOA, GPIO_Pin_3);
			delayTime(1000);
			GPIO_SetBits(GPIOA, GPIO_Pin_3);

		
	}
	EXTI_ClearFlag( EXTI_Line1);

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑桃鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值