STM32外部中断封装函数

STM32外部中断:


外部中断的配置非常简单,只需要以下几步:

  1. 根据实际需要配置GPIO的模式
  2. 开启AFIO时钟
  3. 使用GPIO_EXTILineConfig函数选中GPIO口
  4. 初始化NVIC_InitTypeDef,EXTI_InitTypeDef结构体

但是呢,开启时钟,配置结构体等步骤我感觉还是有点繁琐,所以就封装了以下,哎,可是我还是个STM32新手,对寄存器并不太熟悉(或者说,对位运算不熟悉),所以只能用固件库来封装了

下面给出.h文件和.c文件


1.GuiStar_EXTI.h

#ifndef __EXTI_H__
#define __EXTI_H__

/**
  ****************************************************************************************
  * @file    GuiStar_EXTI.h
  * @author  GuiStar-李什么恩
  * @version V1.1.2
  * @date    2023-1-15
  * @brief   该文件仅含配置外部中断的函数        
  ****************************************************************************************
  */

void GuiStar_EXTI_Init(GPIO_TypeDef* GPIOx, u16 GPIO_Pin_x, EXTITrigger_TypeDef EXTITrigger);
void GuiStar_EXTI_SetEXTI0_IRQHandler(void (*Function)(void));
void GuiStar_EXTI_SetEXTI1_IRQHandler(void (*Function)(void));
void GuiStar_EXTI_SetEXTI2_IRQHandler(void (*Function)(void));
void GuiStar_EXTI_SetEXTI3_IRQHandler(void (*Function)(void));
void GuiStar_EXTI_SetEXTI4_IRQHandler(void (*Function)(void));
void GuiStar_EXTI_SetEXTI15_10_IRQHandler(void (*Function)(void));
void GuiStar_EXTI_SetEXTI9_5_IRQHandler(void (*Function)(void));

/****************************************************************************************
  * @attention
  * 所有中断函数在启动文件中都可以找到,但是为了
  * 方便使用,这里直接把外部中断的所有函数都列出来:
  *	实际上,您只需要调用本文件中的几个设置中断函数行为的几个函数即可设置中断行为 
  *	也可以选择直接去设置下列的函数的行为达到同样的效果!
  *
  * EXTI0_IRQHandler
  * EXTI1_IRQHandler
  * EXTI2_IRQHandler
  * EXTI3_IRQHandler
  * EXTI4_IRQHandler
  * EXTI15_10_IRQHandler
  * EXTI9_5_IRQHandler
  *
  *****************************************************************************************/
  
 /************************************************************************
						   外部中断函数模板
 *************************************************************************

void EXTI9_5_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line5)==SET)
	{
		
		此处写中断的相关操作。。。
		EXTI_ClearITPendingBit(EXTI_Line5);
	}
}

*/

#endif




2.GuiStar_EXTI.c

#include "stm32f10x.h"                  // Device header

void (*GuiStar_EXTI0_IRQHandler)(void);
void (*GuiStar_EXTI1_IRQHandler)(void);
void (*GuiStar_EXTI2_IRQHandler)(void);
void (*GuiStar_EXTI3_IRQHandler)(void);
void (*GuiStar_EXTI4_IRQHandler)(void);
void (*GuiStar_EXTI9_5_IRQHandler)(void);
void (*GuiStar_EXTI15_10_IRQHandler)(void);

/**
  * @brief  确定外部中断0处理器的行为
  * @param  *Function 它是一个指向定时器中断行为的指针
  * @retval 无
  */
void GuiStar_EXTI_SetEXTI0_IRQHandler(void (*Function)(void))
{
	GuiStar_EXTI0_IRQHandler=Function;
}

/**
  * @brief  确定外部中断1处理器的行为
  * @param  *Function 它是一个指向定时器中断行为的指针
  * @retval 无
  */
void GuiStar_EXTI_SetEXTI1_IRQHandler(void (*Function)(void))
{
	GuiStar_EXTI1_IRQHandler=Function;
}

/**
  * @brief  确定外部中断2处理器的行为
  * @param  *Function 它是一个指向定时器中断行为的指针
  * @retval 无
  */
void GuiStar_EXTI_SetEXTI2_IRQHandler(void (*Function)(void))
{
	GuiStar_EXTI2_IRQHandler=Function;
}

/**
  * @brief  确定外部中断3处理器的行为
  * @param  *Function 它是一个指向定时器中断行为的指针
  * @retval 无
  */
void GuiStar_EXTI_SetEXTI3_IRQHandler(void (*Function)(void))
{
	GuiStar_EXTI3_IRQHandler=Function;
}

/**
  * @brief  确定外部中断4处理器的行为
  * @param  *Function 它是一个指向定时器中断行为的指针
  * @retval 无
  */
void GuiStar_EXTI_SetEXTI4_IRQHandler(void (*Function)(void))
{
	GuiStar_EXTI4_IRQHandler=Function;
}

/**
  * @brief  确定外部中断15_10处理器的行为
  * @param  *Function 它是一个指向定时器中断行为的指针
  * @retval 无
  */
void GuiStar_EXTI_SetEXTI15_10_IRQHandler(void (*Function)(void))
{
	GuiStar_EXTI15_10_IRQHandler=Function;
}

/**
  * @brief  确定外部中断9_5处理器的行为
  * @param  *Function 它是一个指向定时器中断行为的指针
  * @retval 无
  */
void GuiStar_EXTI_SetEXTI9_5_IRQHandler(void (*Function)(void))
{
	GuiStar_EXTI9_5_IRQHandler=Function;
}

/**
  * @brief 外部中断配置函数
  * @param GPIOx 			选择GPIO端口(ABCDEFG)
  * @param GPIO_Pin_x  		选择GPIO引脚(0~16)
  * @param EXTITrigger		选择什么边沿触发
  *								EXTI_Trigger_Rising     	  上升沿触发;
  *								EXTI_Trigger_Falling  		  下降沿触发;
  *								EXTI_Trigger_Rising_Falling   双边沿触发;
  * @attention  此函数内部并没有配置GPIO的模式,请根据需要自行配置模式
  * @retval 
  */
void GuiStar_EXTI_Init(GPIO_TypeDef* GPIOx, u16 GPIO_Pin_x, EXTITrigger_TypeDef EXTITrigger)
{	
	u8 GPIO_PortSourceGPIOx;
	u8 GPIO_PinSourcex=0;
	for(;((1<<GPIO_PinSourcex) & (GPIO_Pin_x))==0;)
	{
		GPIO_PinSourcex++;
	};
	if(GPIOx==GPIOA)
	{
		GPIO_PortSourceGPIOx=GPIO_PortSourceGPIOA;
	}
	if(GPIOx==GPIOB)
	{
		GPIO_PortSourceGPIOx=GPIO_PortSourceGPIOB;
	}
	if(GPIOx==GPIOC)
	{
		GPIO_PortSourceGPIOx=GPIO_PortSourceGPIOC;
	}
	if(GPIOx==GPIOD)
	{
		GPIO_PortSourceGPIOx=GPIO_PortSourceGPIOD;
	}
	if(GPIOx==GPIOE)
	{
		GPIO_PortSourceGPIOx=GPIO_PortSourceGPIOE;
	}
	if(GPIOx==GPIOF)
	{
		GPIO_PortSourceGPIOx=GPIO_PortSourceGPIOF;
	}
	if(GPIOx==GPIOG)
	{
		GPIO_PortSourceGPIOx=GPIO_PortSourceGPIOG;
	}
	
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO的时钟
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOx,GPIO_PinSourcex);//配置外部引脚
	EXTI_InitTypeDef EXTI_InitStruct;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStruct;
	
	if(GPIO_PinSourcex==0)//选中外部中断线
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line0;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
	}
	
	
	if(GPIO_PinSourcex==1)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line1;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI1_IRQn;
	}
	
	
	if(GPIO_PinSourcex==2)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line2;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn;
	}
	
	if(GPIO_PinSourcex==3)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line3;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn;
	}
	
	if(GPIO_PinSourcex==4)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line4;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;
	}
	
	if(GPIO_PinSourcex==5)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line5;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
	}
	
	if(GPIO_PinSourcex==6)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line6;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
	}
	
	if(GPIO_PinSourcex==7)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line7;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
	}
	
	if(GPIO_PinSourcex==8)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line8;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
	}
	
	if(GPIO_PinSourcex==9)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line9;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
	}
	
	if(GPIO_PinSourcex==10)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line10;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
	}
	
	if(GPIO_PinSourcex==11)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line11;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
	}
	
	if(GPIO_PinSourcex==12)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line12;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
	}
	
	if(GPIO_PinSourcex==13)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line13;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
	}
	
	if(GPIO_PinSourcex==14)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line14;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
	}
	
	if(GPIO_PinSourcex==15)
	{
		EXTI_InitStruct.EXTI_Line = EXTI_Line15;
		NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
	}
	
	
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;//使能选中的外部中断线
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//选择中断事件
	EXTI_InitStruct.EXTI_Trigger = EXTITrigger;//选择触发源
	EXTI_Init(&EXTI_InitStruct);
	
	//配置NVIC中断
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);
	
	
}


void EXTI0_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line0)==SET)
	{
		GuiStar_EXTI0_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line0);
	}
}

void EXTI1_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line1)==SET)
	{
		GuiStar_EXTI1_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line1);
	}
}

void EXTI2_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line2)==SET)
	{
		GuiStar_EXTI2_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line2);
	}
}

void EXTI3_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line3)==SET)
	{
		GuiStar_EXTI3_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line3);
	}
}

void EXTI4_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line4)==SET)
	{
		GuiStar_EXTI4_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line4);
	}
}

void EXTI15_10_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line10)==SET)
	{
		GuiStar_EXTI15_10_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line10);
	}
	else if(EXTI_GetITStatus(EXTI_Line11)==SET)
	{
		GuiStar_EXTI15_10_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line11);
	}
	else if(EXTI_GetITStatus(EXTI_Line12)==SET)
	{
		GuiStar_EXTI15_10_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line12);
	}
	else if(EXTI_GetITStatus(EXTI_Line13)==SET)
	{
		GuiStar_EXTI15_10_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line13);
	}
	else if(EXTI_GetITStatus(EXTI_Line14)==SET)
	{
		GuiStar_EXTI15_10_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line14);
	}
	else if(EXTI_GetITStatus(EXTI_Line15)==SET)
	{
		GuiStar_EXTI15_10_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line15);
	}
}

void EXTI9_5_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line5)==SET)
	{
		GuiStar_EXTI9_5_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line5);
	}
	else if(EXTI_GetITStatus(EXTI_Line6)==SET)
	{
		GuiStar_EXTI9_5_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line6);
	}
	else if(EXTI_GetITStatus(EXTI_Line7)==SET)
	{
		GuiStar_EXTI9_5_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line7);
	}
	else if(EXTI_GetITStatus(EXTI_Line8)==SET)
	{
		GuiStar_EXTI9_5_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line8);
	}
	else if(EXTI_GetITStatus(EXTI_Line9)==SET)
	{
		GuiStar_EXTI9_5_IRQHandler();
		EXTI_ClearITPendingBit(EXTI_Line9);
	}
}



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GuiStar_李什么恩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值