如何配置EXTI外部中断
第一步:配置RCC,将涉及到的外设的时钟都打开
第二步:配置GPIO,选择端口为输入模式
第三步:配置AFIO,选择用到的GPIO,连接到后面的EXTI
第四步:配置ETXI,选择边沿触发方式,比如边沿触发方式,比如上升沿、下降沿或者双边沿。还需选择触发响应方式,可以选择中断响应和事件响应。
第五步:配置NVIC,给中断选择一个合适的优先级。最后通过NVIC,外部中断信号就能进入CPU(NVIC是内核外设不需要开启时钟)
以下是通过代码配置的EXTI外部中断(以PB14引脚为例)
第一步配置RCC时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
第二步配置GPIO:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
第三步配置AFIO:
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
第四步配置EXTI:
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
第五步配置NVIC:
NVIC_PriorityGroupConfig();//这个函数是配置优先级分组:先占优先级和从占优先级。先占优先级即抢占优先级,从占优先级即响应优先级。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
中断函数的编写:
void EXTI15_10_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line14) == SET)
{
/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0)
{
CountSensor_Count ++;
}
EXTI_ClearITPendingBit(EXTI_Line14);
}
}//中断程序结束后,一定要再调用一下清楚中断标志位的函数