一、EXTI外部中断配置:
(从GPIO>AFIO>EXTI>NVIC打通即可)
1.配置RCC,需要的时钟打开,需要开启的时钟有<GPIO,AFIO>。EXTI 和 NVIC 两个外设的时钟是一直打开着的,无需开启。
2.配置GPIO,选择端口为输入模式。
3.配置AFIO,选择用的那一路GPIO,连接到后面的EXTI。
4.配置EXTI,选择边沿触发方式,比如上升沿下降沿双边沿等,还有选择触发响应方式,中断响应或者事件响应。
5.配置NVIC,给我们这个中断选择一个合适的优先级。
这样,外部中断的信号,就能从GPIO到AFIO,再到EXTI,再到NVIC,最终通向CPU,这样才能让CPU由主程序跳转到中断程序执行。
二、外部中断配置程序如下
void CountSensor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启AFIO时钟
GPIO_InitTypeDef GPIO_InitStructure;//GPIO初始化的结构体
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置为上拉输入《可根据STM32中文手册的8.1.11外设的GPIO配置来配置》
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;//pin14脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速率
GPIO_Init(GPIOB, &GPIO_InitStructure);//传递结构体地址,指定GPIOB
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//AFIO外部中断引脚选择
EXTI_InitTypeDef EXTI_InitStructure;//EXTI初始化的结构体
EXTI_InitStructure.EXTI_Line = EXTI_Line14;// EXTI外部中断线选择
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能开启
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//配置为中断响应
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
EXTI_Init(&EXTI_InitStructure);//传递结构体地址,EXTI只有一个,无需指定
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置优先级分组
NVIC_InitTypeDef NVIC_InitStructure;//NVIC初始化的结构体
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//EXTI14属于这个通道
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能开启
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级《不能超出优先级分组范围》
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
NVIC_Init(&NVIC_InitStructure);//传递结构体地址,NVIC只有一个,无需指定
}
三、关于定时器中断和外部中断
问:定时器中断属于外部中断吗?
答:不属于。定时器中断不是外部中断。定时器中断是设定时间到了就处理一次,可以处理按键扫描、动态显示、时钟累加等。而外部中断是CPU的INT脚电平变化引发的中断,适合需要定时引发的事件,外部随机发生,需要快速处理的事件。两个中断是完全不同的硬件引发的,所以不能拿要不要重载初值来比较。外部中断一般是指由计算机外设发出的中断请求,如键盘中断、打印机中断、定时器中断等。
四、中断函数
在STM32中,中断函数的名字都是固定的,每个中断通道(EXTI1,EXTI2这种就是中断通道。由EXTI指向NVIC)都对应一个中断函数,中断函数都是无参无返回值的。步骤为:先进行中断标志位判断,保证是想要的中断源触发的函数。中断程序结束后,要调用清除标志位的函数,不清除会导致一直响应这个中断导致程序卡死。所以每次中断程序结束后,都应该清除一下中断标志位。