stm32exti外部中断按键控制功能无法充分问题

stm32使用外部中断按键控制led时可和k2无法起作用,请帮我指出问题?

#include "EXTI.h"
#include "stm32f10x.h"                  // Device header
#include "SysTick.h"
#include "key.h"
#include "led.h"
#include "beep.h"
void Xc_EXTI_Init(void)
{
        NVIC_InitTypeDef NVIC_InitStructure ;
        EXTI_InitTypeDef EXTI_InitStructure ;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);

        NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
        NVIC_Init(&NVIC_InitStructure);
    
        
        
        NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
        NVIC_Init(&NVIC_InitStructure);
        
        NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_InitStructure);
        
        NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_Init(&NVIC_InitStructure);
     
     EXTI_InitStructure.EXTI_Line=EXTI_Line0;
     EXTI_InitStructure.EXTI_LineCmd=ENABLE;
     EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
     EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_Init(&EXTI_InitStructure);
        
        EXTI_InitStructure.EXTI_Line=EXTI_Line2|EXTI_Line3|EXTI_Line4;
     EXTI_InitStructure.EXTI_LineCmd=ENABLE;
     EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
     EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_Init(&EXTI_InitStructure);

}
        EXTI0_IRQHandler(void)
{
        if(EXTI_GetFlagStatus(EXTI_Line0)==1)
        {int i;
            delay_ms(10);
                if(KEY_UP==1)
                {LED2=0;
                    
                for(i=0;i<5;i++)
                    {
                    LED2=0;
                        delay_ms(500);
                    LED2=1;
                        delay_ms(500);
                    }
                }        
        }
        EXTI_ClearITPendingBit(EXTI_Line0);
}        
        EXTI2_IRQHandler(void)
{
        if(EXTI_GetFlagStatus(EXTI_Line2)==0)
        {int i;
            delay_ms(10);
                if(KEY1==0)
                {
                    LED2=0;
                for(i=0;i<5;i++)
                    {
                    LED2=0;
                        delay_ms(1000);
                    LED2=1;
                        delay_ms(1000);
                    }
                }
        }
        EXTI_ClearITPendingBit(EXTI_Line2);
}

        EXTI3_IRQHandler(void)
{
        if(EXTI_GetFlagStatus(EXTI_Line3)==0)
        {int i;
            delay_ms(10);
                if(KEY2==0)
                {
                    LED1=0;    
                for(i=0;i<1000000;i++)
                    {
                    LED1=0;
                        delay_ms(500);
                    LED1=1;
                        delay_ms(500);
                    }
                }
        }
        EXTI_ClearITPendingBit(EXTI_Line3);
}
    EXTI4_IRQHandler(void)
{
        if(EXTI_GetFlagStatus(EXTI_Line3)==0)
        {int i;
            delay_ms(10);
            if(KEY0==0)
            {
                LED1=0;
                for(i=0;i<1000000;i++)
                {LED1=0;
                    delay_ms(1000);
                    LED1=1;
                    delay_ms(1000);
                }
            }
        }
        EXTI_ClearITPendingBit(EXTI_Line4);
}
        

中断处理函数里面不要加延时和过多的处理,这样程序会死掉,你应该在中断函数里面设置标志位,处理应该在main函数中去做。你这个延时是致命的
还有你的EXTI4_IRQHandler里面if(EXTI_GetFlagStatus(EXTI_Line3)==0 应该是if(EXTI_GetFlagStatus(EXTI_Line4)==0吧
初始化的时候EXTI_InitStructure.EXTI_Line=EXTI_Line2|EXTI_Line3|EXTI_Line4;这里怎么没有或上EXTI_Line0|EXTI_Line1