借用江协科技的外部中断图:
通过这幅图我们很容易知道:配置外部中断函数,使用stm32先要打开时钟(GPIO,AFIO,EXIT,NVIC),再配置GPIO,再配置AFIO,再配置EXIT,再配置NVIC。最后写实现外部中断函数
#include "stm32f10x.h"
void CountSensor_Init()
{
//配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打开GPIOB的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开AFIO的时钟 //EXIT和NVIC自带时钟
//配置GPIO
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //上拉模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14 ;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
//配置AFIO
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
//选择用作EXTI线的GPIO引脚。
//配置EXIT
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line = EXTI_Line14; //根据GPIO
EXTI_InitStruct.EXTI_LineCmd = ENABLE ;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //外部中断模式
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_Init(&EXTI_InitStruct);
//配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置优先级分组,只能有一组
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;//指定通道来开启,10-15并在一个组里
NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE ;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1 ;//配置抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1 ; //配置响应优先级
NVIC_Init(&NVIC_InitStruct);
}
//外部中断函数
void EXTI15_10_IRQHandler(void)
{
//如果发生外部中断,状态标志位自动置1(set)执行外部中断函数
if(EXTI_GetITStatus(EXTI_Line14) == SET)
{
EXTI_ClearITPendingBit(EXTI_Line14);//清除状态标志位,跳出(结束当前)中断函数
}
}
中断函数中不能有太长时间的代码,比如delay()函数等比较消耗单片机时间的代码。会影响主函数的运行