XYU

Engineering Cybernetics.                    

STM32 一个初始化EXTI的例子

23 May 2017 » Hardware

注: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口与中断线的映射关系
SYSCFG_EXTILineConfig();
4.初始化线上中断,设置触发条件等
EXTI_Init();
5.配置中断分组(NVIC),并使能中断
NVIC_Init();
6.编写中断服务函数
EXTIx_IRQHandler();
7.清除中断标志位
EXTI_ClearITPendingBit();

© 2019 XYU.