外部中断实验四个按键,三个按键进不了中断

2019-07-20 12:35发布

经测试KEY_UP能进入中断,其余进不了中断#include "exti.h"
#include "stm32f4xx.h"
#include "delay.h"
#include "key.h"
#include "led.h"
#include "beep.h"

void My_EXTI_Init(void)
{
        EXTI_InitTypeDef EXTI_st;
        NVIC_InitTypeDef NVIC_st;
       
        delay_init(168);
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG,ENABLE);//使能SYSCFG时钟
        RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOE,ENABLE);//使能GPIO时钟
        RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA,ENABLE);
       
//GPIOE4 KEY0       
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);
       
        EXTI_st.EXTI_Line = EXTI_Line4;
        EXTI_st.EXTI_LineCmd = ENABLE;
        EXTI_st.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_st.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_Init(&EXTI_st);//初始化中断4
       
        NVIC_st.NVIC_IRQChannel = EXTI4_IRQn;
        NVIC_st.NVIC_IRQChannelCmd = ENABLE;
        NVIC_st.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级0
        NVIC_st.NVIC_IRQChannelSubPriority = 2;//响应优先级2
        NVIC_Init(&NVIC_st);

//GPIOE3 KEY1       
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource3);
       
        EXTI_st.EXTI_Line = EXTI_Line3;
        EXTI_st.EXTI_LineCmd = ENABLE;
        EXTI_st.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_st.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_Init(&EXTI_st);//初始化中断3
       
        NVIC_st.NVIC_IRQChannel = EXTI3_IRQn;
        NVIC_st.NVIC_IRQChannelCmd = ENABLE;
        NVIC_st.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级1
        NVIC_st.NVIC_IRQChannelSubPriority = 2;//响应优先级2
        NVIC_Init(&NVIC_st);//配置分组

//GPIOE2 KEY2       
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2);
       
        EXTI_st.EXTI_Line = EXTI_Line2;
        EXTI_st.EXTI_LineCmd = ENABLE;
        EXTI_st.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_st.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_Init(&EXTI_st);//初始化中断2
       
        NVIC_st.NVIC_IRQChannel = EXTI2_IRQn;
        NVIC_st.NVIC_IRQChannelCmd = ENABLE;
        NVIC_st.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级2
        NVIC_st.NVIC_IRQChannelSubPriority = 2;//响应优先级2
        NVIC_Init(&NVIC_st);//配置分组

//GPIOA0 KEY_UP       
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
       
        EXTI_st.EXTI_Line = EXTI_Line0;
        EXTI_st.EXTI_LineCmd = ENABLE;
        EXTI_st.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_st.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_Init(&EXTI_st);//初始化中断0
       
        NVIC_st.NVIC_IRQChannel = EXTI0_IRQn;
        NVIC_st.NVIC_IRQChannelCmd = ENABLE;
        NVIC_st.NVIC_IRQChannelPreemptionPriority = 3;//抢占优先级3
        NVIC_st.NVIC_IRQChannelSubPriority = 2;//响应优先级2
        NVIC_Init(&NVIC_st);//配置分组
}

void EXTI4_IRQHandler()//中断4服务函数
{
        delay_ms(10);
        if(KEY0 == 0)
        {
                LED0 = !LED0;
                LED1 = !LED1;
        }
         EXTI_ClearITPendingBit(EXTI_Line4);
}
       
void EXTI3_IRQHandler()//中断3服务函数
{
        delay_ms(10);
        if(KEY1 == 0)
        {
                LED1 = !LED1;
        }
         EXTI_ClearITPendingBit(EXTI_Line3);
}

void EXTI2_IRQHandler()//中断2服务函数
{
        delay_ms(10);
        if(KEY2 == 0)
        {
                LED0 = !LED0;
        }
         EXTI_ClearITPendingBit(EXTI_Line2);
}

void EXTI0_IRQHandler()//中断1服务函数
{
        delay_ms(10);
        if(KEY_UP == 1)
        {
                BEEP = !BEEP;
        }
         EXTI_ClearITPendingBit(EXTI_Line0);
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
止天
1楼-- · 2019-07-20 15:31
 精彩回答 2  元偷偷看……
crystal_66
2楼-- · 2019-07-20 20:50
楼主,不知道你解决了没。我也遇到这个问题,我有个两个中断,红外引发的就可以进入中断程序,但是按键还需要控制一个,按键的就进不去,如果解决了,烦请指教。
206820245
3楼-- · 2019-07-21 01:50
止天 发表于 2016-3-7 13:46
引脚配置呢

是那几个引脚啊

键盘所对的引脚上面有写
206820245
4楼-- · 2019-07-21 04:05
 精彩回答 2  元偷偷看……
crystal_66
5楼-- · 2019-07-21 07:24
楼主,我刚才解决这个问题了,总共有这些问题可能在的地方,你可以看看,仅供参考
crystal_66
6楼-- · 2019-07-21 12:01
crystal_66 发表于 2016-3-7 23:07
楼主,我刚才解决这个问题了,总共有这些问题可能在的地方,你可以看看,仅供参考

1、按键的输入方式是IPU,我的设置错了
2、需要的LED,BEEP没有初始化
3、中断之间设了优先级就不会冲撞
不知道有没有用,希望能帮到你

一周热门 更多>