PB6设置的下降沿,但是PB6上升沿和下降沿都触发中断。请帮忙看看配置有问题吗?

2019-08-16 21:43发布

本帖最后由 Anthony_brave 于 2017-7-24 16:24 编辑

PB6上升沿和下降沿都触发中断。PF7上升沿和下降沿都正常

void EXTI_Config(void)
{        
        EXTI_InitTypeDef EXTI_InitStructure;                /*¶¨òåò»¸öEXTI_InitTypeDef ààDíμĽá11ì壬Ãû×Ö½DEXTI_InitStructure*/
        NVIC_InitTypeDef NVIC_InitStructure;
        GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//ía2¿ÖD¶Ï£¬Dèòaê1ÄüAFIOê±Öó
        
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF,ENABLE);
   //======================================================         
         GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_6;                       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);                          
        EXTI_InitStructure.EXTI_Line = EXTI_Line6;                                                
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                              
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                             
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                                                                      
        EXTI_Init(&EXTI_InitStructure);                        
//---------------------------------------
         GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_7;                        
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                  
        GPIO_Init(GPIOF, &GPIO_InitStructure);

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOF, GPIO_PinSource7);                          
        EXTI_InitStructure.EXTI_Line = EXTI_Line7;                                               
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                                                   
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;                       
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                                                                      
        EXTI_Init(&EXTI_InitStructure);                     

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                                               
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                                    
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                    
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                                    
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                             
        NVIC_Init(&NVIC_InitStructure);                                                                           
}

问题已经解决,现将解决方案分享一下1、第一个问题是PB6设置的是上升沿/下降沿,结果上升沿和下降沿都触发中断。原因是:PB6处有个上拉,上拉电阻原来是100K,电阻值太大导致的,应该改为2K。
2、第二个问题是把PB6处的上拉去掉,设置下降沿触发没问题,但是设置上升沿触发,就不行。
     原因:中断函数写的有问题。
void EXTI9_5_IRQHandler(void)
{   
  unsigned char temp;
  if(EXTI_GetITStatus(EXTI_Line7) != RESET)
  {
     EXTI_ClearFlag(EXTI_Line7);                                       
     if((GPIOF->IDR & 0x0080)==0) {  return;}
     else
     {  xxxxxxxxxxxx;  }        
     EXTI_ClearITPendingBit(EXTI_Line7);
   }               
   if(EXTI_GetITStatus(EXTI_Line6) != RESET)                        
   {
     EXTI_ClearFlag(EXTI_Line6);                                       
     temp=(GPIOB->IDR & 0x0040)&0xff;                                
     if(temp==0)
    {
         XXXXXXXXX;
    }         
   EXTI_ClearITPendingBit(EXTI_Line6);
  }

}
当上升沿触发时,中断函数里的
temp=(GPIOB->IDR & 0x0040)&0xff;                                
if(temp==1)
    {  *****}

应改为
temp=(GPIOB->IDR & 0x0040)&0xff;                                
if(temp&0x0040)
    {  *****}





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
20条回答
wxjhby
1楼-- · 2019-08-18 13:43
EXTI9_5_IRQn   5-9共用一个中断服务程序,所以肯定会上升下降沿一起触发,因为你一个配置了上升沿,一个配置了下降沿
Anthony_brave
2楼-- · 2019-08-18 19:42
PsychoZy 发表于 2017-7-19 15:55
Good luck.

PF7设置的是上升沿触发(下降沿触发也没有问题)
尝试把PB6硬件电路上的上拉去掉,并且把程序里面改为PB6配置为浮空输入。
当使用下降沿触发时,中断程序里面判断PB6(即temp)是否为低电平才运行中断里的程序,能够正常工作。
但是使用上升沿触发时,根本无法进入PB6的中断。可以确定外部触发信号是个脉冲。

代码如下:
void EXTI9_5_IRQHandler(void)
{   
  unsigned char temp;
  if(EXTI_GetITStatus(EXTI_Line7) != RESET)
  {
     EXTI_ClearFlag(EXTI_Line7);                                       
     if((GPIOF->IDR & 0x0080)==0) {  return;}
     else
     {  xxxxxxxxxxxx;  }       
     EXTI_ClearITPendingBit(EXTI_Line7);
   }               
   if(EXTI_GetITStatus(EXTI_Line6) != RESET)                       
   {
     EXTI_ClearFlag(EXTI_Line6);                                       
     temp=(GPIOB->IDR & 0x0040)&0xff;                               
     if(temp==0)
    {
         XXXXXXXXX;
    }         
   EXTI_ClearITPendingBit(EXTI_Line6);
  }

}
Anthony_brave
3楼-- · 2019-08-19 00:53
wxjhby 发表于 2017-7-19 16:13
EXTI9_5_IRQn   5-9共用一个中断服务程序,所以肯定会上升下降沿一起触发,因为你一个配置了上升沿,一个配 ...

那怎么解释PF7能够正常工作,但是PB6完全无法正常工作呢?

中断函数在本帖已回复,详见16楼
Anthony_brave
4楼-- · 2019-08-19 01:09
yklstudent 发表于 2017-7-19 16:44
楼主为什么配置设置不一样?

配置一样也不行
wxjhby
5楼-- · 2019-08-19 05:43
 精彩回答 2  元偷偷看……
PsychoZy
6楼-- · 2019-08-19 10:54
Anthony_brave 发表于 2017-7-19 21:13
PF7设置的是上升沿触发(下降沿触发也没有问题)
尝试把PB6硬件电路上的上拉去掉,并且把程序里面改为PB ...

你不要都用GPIOX。5~9,分开来看看

一周热门 更多>