stm32第十一天外部中断按键控制灯

发布于:2025-04-01 ⋅ 阅读:(27) ⋅ 点赞:(0)

一:软件流程设计
•初始化系统
。 初始化GPIO、EXTI外设时钟
。 初始化按键和LED引脚
。 初始化EXTI外部中断条件
。 初始化NVIC嵌套中断控制器及分组
·编写外部中断函数
。 判断中断发生控制LED火
weak:弱定义;如果用户没有自己定义的中断函数,则系统默认执行系统自定义的中断函数,如果用户有定义中断函数则优先执行用户的中断函数。

1:exti_key.c工程

#include "stm32f10x.h"
#include "exti_key.h"


void Exti_key_Init(void)//外部中断按键的初始化函数
{
	
	//有4个步骤 初始化系统 1:初始化GPIO、EXTI外设时钟 2:初始化按键和LED引脚 
	// 3:初始化EXTI外部中断条件 4:初始化NVIC嵌套中断控制器及分组
	GPIO_InitTypeDef Exti_key_Initstruct;//初始化外部中断按键的GPIO的结构体
	EXTI_InitTypeDef EXTIInitstruct;//初始化EXTI外部中断的结构体
	NVIC_InitTypeDef NVICInitstruct;//初始化NVIC嵌套中断控制器的结构体
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//打开APB2总线下的GPIOA和EXTI外设的时钟
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC分组
	
	Exti_key_Initstruct.GPIO_Pin=GPIO_Pin_0  ;//配置A0引脚
	Exti_key_Initstruct.GPIO_Mode= GPIO_Mode_IPU;//配置引脚输入模式为上拉输入

	GPIO_Init(GPIOA, &Exti_key_Initstruct);//初始化GPIOA的结构体
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//IO口加上外部中断的功能
	
	EXTIInitstruct.EXTI_Line=EXTI_Line0 ;//选择外部中断线0
	EXTIInitstruct.EXTI_Mode=EXTI_Mode_Interrupt ;//配置触发方式为下降沿触发
	EXTIInitstruct.EXTI_Trigger= EXTI_Trigger_Falling ;//配置为中断模式
	EXTIInitstruct.EXTI_LineCmd=ENABLE;//使能外部中断线
	EXTI_Init(&EXTIInitstruct);//初始化EXTI外部中断的结构体
	
	NVICInitstruct.NVIC_IRQChannel=EXTI0_IRQn ;//使能外部中断0的中断通道
	NVICInitstruct.NVIC_IRQChannelPreemptionPriority=0;//设置主优先级
	NVICInitstruct.NVIC_IRQChannelSubPriority=0;//设置子优先级
	NVICInitstruct.NVIC_IRQChannelCmd=ENABLE;//使能中断通道
	NVIC_Init(& NVICInitstruct);//初始化NVIC嵌套中断控制器的结构体
	
	
}


 2:exti_key.h工程

#ifndef EXTI_KEY_H_
#define EXTI_KEY_H_

void Exti_key_Init(void);

#endif

3:main.c工程

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "Bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"
#include "wireless.h"
#include "exti_key.h"

void delay(uint16_t time)//延时1ms  软件延时粗延时
{
	uint16_t i=0;
	while(time --)
	{
		i=12000;
		while(i --);
	}
	
}


int  main()
{
	Exti_key_Init();
	LED_Init();//初始化灯的时钟和引脚配置
	
	GPIO_SetBits(GPIOA, GPIO_Pin_1);//初始化灯灭


   while(1)
	 {
		
		 
		
	 }
		 
   
} 


 void EXTI0_IRQHandler()//EXTI0线中断服务函数(PA0引脚触发)
 {
	if(EXTI_GetITStatus(EXTI_Line0) != RESET)//检查EXTI0线是否触发了中断
	{
		 GPIO_ResetBits(GPIOA, GPIO_Pin_1);
		 delay(1000);
		 GPIO_SetBits(GPIOA, GPIO_Pin_1);
		 delay(1000);
	}
	EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI0的中断标志位(必须操作)
	 
	 
 }