当前位置:   article > 正文

外部中断配置

外部中断配置

外部中断配置

1、使能IO口时钟,配置IO口模式为输入

2、开启 AFIO 时钟,设置 IO 口与中断线的映射关系

每个 GPIO 端口均有16个管脚,因此把每个端口的 16 个 IO 对应那 16 根中断线 EXTI0-EXTI15 .
比如:GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线EXTI0-EXTI15,这样一来每个中断线就对应了最多 7 个 IO 口,
比如:GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。
但是中断线每次只能连接一个在IO口上,这样就需要通过 AFIO 的外部中断配置寄存器 1 的EXTIx[3:0]位来决定对应的中断线映射到哪个 GPIO 端口上,请添加图片描述

启用或禁用高速 APB (APB2) 外设时钟。

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
  • 1

参数:

#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
NewState:ENABLE 或 DISABLE。
  • 1
  • 2

选择用作 EXTI 线的 GPIO 引脚。

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
  • 1

参数:

GPIO_PortSource:选择用作 EXTI 线源的 GPIO 端口。此参数可以是 GPIO_PortSourceGPIOx
GPIO_PinSource:指定要配置的 EXTI 线。此参数可以是 GPIO_PinSourcex x->0~15

3、配置中断分组(NVIC),使能中断 中断优先级

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
  • 1

参数:

NVIC_PriorityGroup:指定优先级分组位长度。
此参数可以是以下值之一:
@arg NVIC_PriorityGroup_0:0 位用于抢占优先级,4 位用于子优先级
@arg NVIC_PriorityGroup_1:1 位用于抢占优先级,3 位用于子优先级
@arg NVIC_PriorityGroup_2:2 位用于抢占优先级,2 位用于子优先级
@arg NVIC_PriorityGroup_3:3 位用于抢占优先级,1 位用于子优先级
@arg NVIC_PriorityGroup_4:4 位用于抢占优先级,0 位表示子优先级

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
  • 1

根据指定初始化 NVIC 外设
参数:

typedef struct
{
  uint8_t NVIC_IRQChannel;  /*指定要启用或禁用的 IRQ 通道*/
  							/*EXTI0_IRQn*/ 
  uint8_t NVIC_IRQChannelPreemptionPriority; /*指定 IRQ 通道的抢占优先级在 NVIC_IRQChannel 中指定,0 和 15 之间*/   
  uint8_t NVIC_IRQChannelSubPriority;       /*指定 IRQ 通道的子优先级*/  
  FunctionalState NVIC_IRQChannelCmd; 		/* ENABLE or DISABLE */     
} NVIC_InitTypeDef;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4、初始化EXTI,选择触发方式

根据指定初始化EXTI外设:

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
  • 1

参数:

typedef struct
{
  uint32_t EXTI_Line;               /*指定要启用或禁用的EXTI行, 中断/事件线*/
   									/*EXTI_Line0*/
  EXTIMode_TypeDef EXTI_Mode;       /* 指定 EXTI 行的模式 */

  EXTITrigger_TypeDef EXTI_Trigger; /*指定 EXTI 线的触发信号有效边沿。*/

  FunctionalState EXTI_LineCmd;     /* ENABLE 或 DISABLE*/
}EXTI_InitTypeDef;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

EXTI 模式枚举:

typedef enum
{
EXTI_Mode_Interrupt = 0x00, //中断
EXTI_Mode_Event = 0x04 //事件
}EXTIMode_TypeDef;

EXTI 触发器枚举:

typedef enum
{
EXTI_Trigger_Rising = 0x08, //上升沿
EXTI_Trigger_Falling = 0x0C, //下降沿
EXTI_Trigger_Rising_Falling = 0x10 //上+下
}EXTITrigger_TypeDef;

5、编写EXTI中断服务函数

EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler

6、例:

void exitInit(){
	NVIC_InitTypeDef NVIC_InitStructure;
	EXTI_InitTypeDef EXTI_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);		//开启时钟

	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);		//选择用作 EXTI 线的 GPIO 引脚。 A0		E3		E4
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);	

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

	NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

	NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

	EXTI_InitStructure.EXTI_Line = EXTI_Line0;
	EXTI_InitStructure.EXTI_LineCmd =  ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising ;
	EXTI_Init(&EXTI_InitStructure);

	EXTI_InitStructure.EXTI_Line = EXTI_Line3|EXTI_Line4;
	EXTI_InitStructure.EXTI_LineCmd =  ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling  ;
	EXTI_Init(&EXTI_InitStructure);
}


void EXTI0_IRQHandler(void){
	if(EXTI_GetITStatus(EXTI_Line0)==1)
	{
		DelayMs(10);
		if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1)
		{
			LED(LED0,OFF);
			LED(LED1,OFF);
		}	
	}
	EXTI_ClearITPendingBit(EXTI_Line0);
}


void EXTI3_IRQHandler (void){
	if(EXTI_GetITStatus(EXTI_Line3)==1)
	{
		DelayMs(10);
		if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == 0)
		{
			LED(LED0,ON);
		}	
	}
	EXTI_ClearITPendingBit(EXTI_Line3);
}


void EXTI4_IRQHandler(void){
	if(EXTI_GetITStatus(EXTI_Line4)==1)
	{
		DelayMs(10);
		if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 0)
		{
			LED(LED1,ON);
		}	
	}
	EXTI_ClearITPendingBit(EXTI_Line4);
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/973217
推荐阅读
相关标签
  

闽ICP备14008679号