新手提问:关于EXTI问题

2019-08-14 20:26发布

大神们,麻烦指点下:以下是我的EXIT代码,代码执行后,灯一直亮,按下按键,也不会触发中断;                                另外这个函数(EXTI15_10_IRQHandler)有什么用,一定要这样命名吗?
电路:PB15按键按下是接GND,没有按的时候是7.5K上拉:
IC:STM32F107VET6
代码:

void EXTI_GPIO_Config(void)
{      
       //初始化相应的GPIO管脚  

        //GPIO的复用功能必须打开
       //打开GPIOB端口时钟,并且打开复用时钟
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

       //GPIO结构体
       GPIO_InitTypeDef GPIO_InitStructure;


       //配置GPIO
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //选择输入模式为浮空输入
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_Init(GPIOB, &GPIO_InitStructure);

       //配置外部中断源并进行中断源和GPIO的连接

       EXTI_InitTypeDef  EXTI_InitStructure;

       //清空中断标志
       EXTI_ClearITPendingBit(EXTI_Line15);
       GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource15);

       EXTI_InitStructure.EXTI_Line = EXTI_Line15;//选择中断线路15
       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置为中断请求,非事件请求
       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设置中断触发方式为上下降沿触发
       EXTI_InitStructure.EXTI_LineCmd = ENABLE;//外部中断使能
       EXTI_Init(&EXTI_InitStructure);

       //配置NVIC
       NVIC_InitTypeDef   NVIC_InitStructure;
       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
       NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;  //选择中断通道5
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为1
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //响应式中断优先级设置为1
       NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;  //使能中断
       NVIC_Init(&NVIC_InitStructure);


}




/*键盘中断(EXTI15)服务程序*/
void EXTI15_10_IRQHandler(void)
{  
    if (EXTI_GetITStatus(EXTI_Line15) == SET)  
    {  
        EXTI_ClearITPendingBit(EXTI_Line15);//清除标志  
        LED3(OFF);

    }  
}  


#endif



大神们,麻烦指点下:以下是我的EXIT代码,代码执行后,灯一直亮,按下按键,也不会触发中断;                                另外这个函数(EXTI15_10_IRQHandler)有什么用,一定要这样命名吗?
电路:PB15按键按下是接GND,没有按的时候是7.5K上拉:
IC:STM32F107VET6
代码:

void EXTI_GPIO_Config(void)
{      
       //初始化相应的GPIO管脚  

        //GPIO的复用功能必须打开
       //打开GPIOB端口时钟,并且打开复用时钟
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

       //GPIO结构体
       GPIO_InitTypeDef GPIO_InitStructure;


       //配置GPIO
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //选择输入模式为浮空输入
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_Init(GPIOB, &GPIO_InitStructure);

       //配置外部中断源并进行中断源和GPIO的连接

       EXTI_InitTypeDef  EXTI_InitStructure;

       //清空中断标志
       EXTI_ClearITPendingBit(EXTI_Line15);
       GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource15);

       EXTI_InitStructure.EXTI_Line = EXTI_Line15;//选择中断线路15
       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置为中断请求,非事件请求
       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设置中断触发方式为上下降沿触发
       EXTI_InitStructure.EXTI_LineCmd = ENABLE;//外部中断使能
       EXTI_Init(&EXTI_InitStructure);

       //配置NVIC
       NVIC_InitTypeDef   NVIC_InitStructure;
       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
       NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;  //选择中断通道5
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为1
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //响应式中断优先级设置为1
       NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;  //使能中断
       NVIC_Init(&NVIC_InitStructure);


}




/*键盘中断(EXTI15)服务程序*/
void EXTI15_10_IRQHandler(void)
{  
    if (EXTI_GetITStatus(EXTI_Line15) == SET)  
    {  
        EXTI_ClearITPendingBit(EXTI_Line15);//清除标志  
        LED3(OFF);

    }  
}  


#endif



10条回答
muzi2017   
  • 119  
  • 263  实习生
    1楼-- · 2019-08-14 20:35
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); 这句话表示0位抢占优先级 好像是没有分配抢占优先级把 你改个非零数字试试
    查看更多
    泥团   
  • 95  
  • 597  实习生
    2楼-- · 2019-08-15 01:29
    muzi2017 发表于 2017-7-29 08:56
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); 这句话表示0位抢占优先级 好像是没有分配抢占优先级把  ...

    改了,还是不行,我把中断函数改为LED灯变化,一样不行
    查看更多
    泥团   
  • 95  
  • 597  实习生
    3楼-- · 2019-08-15 02:54
    泥团 发表于 2017-7-31 17:03
    改了,还是不行,我把中断函数改为LED灯变化,一样不行

    中断函数:/*键盘中断(EXTI15)服务程序*/
    void EXTI15_10_IRQHandler(void)
    {  
        //if (EXTI_GetITStatus(EXTI_Line15) == SET)
        //if(key0=0)

            LED3(OFF);
            delay_ms(1000);
            EXTI_ClearITPendingBit(EXTI_Line15);//清除标志  


    }  



    主函数:
    /*键盘中断(EXTI15)服务程序*/
    void EXTI15_10_IRQHandler(void)
    {  
        //if (EXTI_GetITStatus(EXTI_Line15) == SET)
        //if(key0=0)

            LED3(OFF);
            delay_ms(1000);
            EXTI_ClearITPendingBit(EXTI_Line15);//清除标志  


    }  

    查看更多
    泥团   
  • 95  
  • 597  实习生
    4楼-- · 2019-08-15 06:01
    有没有大神帮忙看看什么问题
    查看更多
    NIDO   
  • 104  
  • 364  实习生
    5楼-- · 2019-08-15 11:22
    1:如果就只有一个抢占中断就试一下
    里面配置抢占2,响应2的这种模式,可能初始化里面少了这句
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    2:
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

    3:按键初始化出现错误,设置成上拉输入或者下拉输入,我不清楚你的按键电路图是怎么样的,但不应该是浮空

    4:不要在分享贴提问
    查看更多
    JaysonVon   
  • 56  
  • 364  实习生
    6楼-- · 2019-08-15 15:07
    把这条语句去掉
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    查看更多
    泥团   
  • 95  
  • 597  实习生
    7楼-- · 2019-08-15 18:45
    JaysonVon 发表于 2017-7-31 21:42
    把这条语句去掉
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    还是不行,我发现我的工程文件里面没有中断函数EXTI15_10_IRQHandler,这个函数一般在哪个文件里面,是不是我漏了
    查看更多
    泥团   
  • 95  
  • 597  实习生
    8楼-- · 2019-08-15 19:09
    问题解决了,原来是因为我没有加启动文件startup_stm32f10x_hd.s,谢谢各位帮忙
    查看更多
    泥团   
  • 95  
  • 597  实习生
    9楼-- · 2019-08-15 23:06
    问题解决了,原来是因为我没有加启动文件startup_stm32f10x_hd.s,谢谢各位帮忙
    查看更多