EXIT外部中断

image
image

一共有20条输入线可以被配置为中断源,对于输入线的检测就是上升沿或者下降沿检测,外部中断和软件中断被一起送到或门,只要有一个中断时间发生并且事件屏蔽寄存器输出为1就可产生事件,同理,上面那路也可以通过类似的配置产生中断


image
image
image
这是管脚至EXTI线上的映射图,注意,不能出现如PA3和PC3管脚同时使用EXTI3的情况,每个EXTI线一次只能使用一个管脚,但图上只有16条外部中断线,还有4条呢?
另外四个EXTI线的连接方式如下:
EXTI线16连接到PVD输出(可编程电压监测器,可实现掉电检测)
EXTI线17连接到RTC闹钟事件
EXTI线18连接到USB唤醒事件
EXTI线19连接到以太网唤醒事件(只适用于互联型产品)
以下是普中用EXTI实现的按键检测代码

点击查看代码
/*******************************************************************************
* 函 数 名         : My_EXTI_Init
* 函数功能		   : 外部中断初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void My_EXTI_Init(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	EXTI_InitTypeDef  EXTI_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//在这里需要开启端口复用的时钟
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);//选择GPIO管脚用作外部中断线路
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource4);//选择GPIO管脚用作外部中断线路
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource0);//选择GPIO管脚用作外部中断线路
	
	
	//EXTI0 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器	
	
	//EXTI3 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//EXTI3中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;		//子优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
	
	//EXTI4 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//EXTI4中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;		//子优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
	
	
	EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line3|EXTI_Line4; 
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	
}

可能有人疑惑了,在RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);中为什么要使能AFIO时钟呢?
因为跟 AFIO 相关的寄存器有:
事件控制寄存器(AFIO_EVCR)
复用重映射和调试I/O 配置寄存器(AFIO_MAPR)
外部中断配置寄存器1(AFIO_EXTICR1)
外部中断配置寄存器2(AFIO_EXTICR2)
外部中断配置寄存器3(AFIO_EXTICR3)
外部中断配置寄存器4(AFIO_EXTICR4)
看到这些寄存器大家就明白了为什么要使能AFIO的时钟了。
值得注意的是,如果按键按下接地则需要将相应的IO设置为上拉输入GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
同理按钮按下为高电平应设置为下拉输入
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
不要忘记使能相应的GPIOx时钟和配置端口,不然GPIO是不会工作的。

posted @ 2022-07-05 18:10  CottonTAT  阅读(155)  评论(0)    收藏  举报