注:STM32F407VGT6 with STM32F4 DSP and standard peripherals library v1.8.0
外部中断源码
//中断服务函数 void EXTI2_IRQHandler(void) { delay_ms(10); if (KEY==0) { LED=~LED; } EXTI_ClearITPendingBit(EXTI_Line2); } //中断初始化函数 void EXTIX_Init(void) { EXTI_InitTypeDef EXTI_InitStructure; //中断初始化结构体定义 NVIC_InitTypeDef NVIC_InitStructure; //中断优先级结构体定义 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOE,ENABLE); //使能IO口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); //使能SYSCFG时钟 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2); //配置GPIO与中断线的映射关系 //中断初始化结构体配置 EXTI_InitStructure.EXTI_Line=EXTI_Line2; //选定为中断线2 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //配置为中断模式 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //配置中断触发方式 EXTI_InitStructure.EXTI_LineCmd=ENABLE; //使能中断线 EXTI_Init(&EXTI_InitStructure); //初始化外部中断 //中断优先级结构体配置 NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn; //选定为中断通道2 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00; //配置抢占优先级(主优先级) NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00; //配置响应优先级(从优先级) NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中断通道 NVIC_Init(&NVIC_InitStructure); //初始化中断优先级 }
还需在主函数中加入
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置优先级分组 EXTIX_Init(); //初始化外部中断
外部中断的一般配置步骤:
1.使能SYSCFG时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
2.初始化IO口为输入
GPIO_Init();
3.设置IO口与中断线的映射关系
大专栏 STM32 一个初始化EXTI的例子s="highlighter-rouge">SYSCFG_EXTILineConfig();
4.初始化线上中断,设置触发条件等
EXTI_Init();
5.配置中断分组(NVIC),并使能中断
NVIC_Init();
6.编写中断服务函数
EXTIx_IRQHandler();
7.清除中断标志位
EXTI_ClearITPendingBit();