OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3516|回复: 20

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

[复制链接]

24

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2016-1-15
在线时间
64 小时
发表于 2017-7-19 11:10:45 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 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)
    {  *****}





最佳答案

查看完整内容[请看2#楼]

应该有问题,你可以再中断函数里检测PB6是不是高电平然后执行代码,我觉得可能不会执行。 你把PB6配置成浮空输入吧
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2017-7-14
在线时间
25 小时
发表于 2017-7-19 11:10:46 | 显示全部楼层
Anthony_brave 发表于 2017-7-19 15:34
是的,中断程序里面已经加了检测PB6是不是低电平。

另外PB6这个管脚硬件电路上有个上拉,我程序配置里 ...

应该有问题,你可以再中断函数里检测PB6是不是高电平然后执行代码,我觉得可能不会执行。
你把PB6配置成浮空输入吧
回复

使用道具 举报

24

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2016-1-15
在线时间
64 小时
 楼主| 发表于 2017-7-19 12:42:17 | 显示全部楼层
自己顶一发
回复

使用道具 举报

10

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2017-4-20
在线时间
102 小时
发表于 2017-7-19 13:47:42 | 显示全部楼层
有可能是抖动的原因  CPU处理太快  
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2017-7-19 13:58:41 | 显示全部楼层
如果是检测按键计数,是要消抖的
回复

使用道具 举报

24

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2016-1-15
在线时间
64 小时
 楼主| 发表于 2017-7-19 14:20:08 | 显示全部楼层
wxjhby 发表于 2017-7-19 13:58
如果是检测按键计数,是要消抖的

外部触发脉冲是7.5hz。
我尝试在中断内部加10ms延时,但是整个程序都被影响的不能正常工作了。
回复

使用道具 举报

24

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2016-1-15
在线时间
64 小时
 楼主| 发表于 2017-7-19 14:57:51 | 显示全部楼层
564646396 发表于 2017-7-19 13:47
有可能是抖动的原因  CPU处理太快

加上延时消抖 影响其他程序运行
回复

使用道具 举报

11

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2017-7-14
在线时间
25 小时
发表于 2017-7-19 15:21:45 | 显示全部楼层
触发中断的时候检测PB6是不是低电平试试。
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2017-7-19 15:26:58 | 显示全部楼层
你从哪里得出 PB6的上升下降沿都会触发中断?  然后PB6接的是什么?按键? 作用是什么
回复

使用道具 举报

24

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2016-1-15
在线时间
64 小时
 楼主| 发表于 2017-7-19 15:34:18 | 显示全部楼层
PsychoZy 发表于 2017-7-19 15:21
触发中断的时候检测PB6是不是低电平试试。

是的,中断程序里面已经加了检测PB6是不是低电平。

另外PB6这个管脚硬件电路上有个上拉,我程序配置里面也是配的上拉输入,有问题吗?
因为我看到正常的PF7,没有上拉和下拉,程序配置的是GPIO_Mode_IN_FLOATING就没有问题
回复

使用道具 举报

24

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2016-1-15
在线时间
64 小时
 楼主| 发表于 2017-7-19 15:36:31 | 显示全部楼层
wxjhby 发表于 2017-7-19 15:26
你从哪里得出 PB6的上升下降沿都会触发中断?  然后PB6接的是什么?按键? 作用是什么

示波器看波形,PB6外接的是7.5HZ脉冲,不是按键。用来做中断,给另外接口发其他脉冲。
回复

使用道具 举报

24

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2016-1-15
在线时间
64 小时
 楼主| 发表于 2017-7-19 15:50:50 | 显示全部楼层
PsychoZy 发表于 2017-7-19 15:42
应该有问题,你可以再中断函数里检测PB6是不是高电平然后执行代码,我觉得可能不会执行。
你把PB6配置成 ...

试过了。只在程序里面配制成浮空输入依然没用,还是上升沿和下降沿都触发。

我现在在改硬件,把电路上的上拉去掉。一会看结果。
回复

使用道具 举报

11

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2017-7-14
在线时间
25 小时
发表于 2017-7-19 15:55:25 | 显示全部楼层
Anthony_brave 发表于 2017-7-19 15:50
试过了。只在程序里面配制成浮空输入依然没用,还是上升沿和下降沿都触发。

我现在在改硬件,把电路上 ...

Good luck.
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2017-7-19 16:13:32 | 显示全部楼层
EXTI9_5_IRQn   5-9共用一个中断服务程序,所以肯定会上升下降沿一起触发,因为你一个配置了上升沿,一个配置了下降沿
回复

使用道具 举报

24

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2016-1-15
在线时间
64 小时
 楼主| 发表于 2017-7-19 21:13:53 | 显示全部楼层

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);
  }

}
回复

使用道具 举报

24

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2016-1-15
在线时间
64 小时
 楼主| 发表于 2017-7-19 21:15:21 | 显示全部楼层
wxjhby 发表于 2017-7-19 16:13
EXTI9_5_IRQn   5-9共用一个中断服务程序,所以肯定会上升下降沿一起触发,因为你一个配置了上升沿,一个配 ...

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

中断函数在本帖已回复,详见16楼
回复

使用道具 举报

24

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2016-1-15
在线时间
64 小时
 楼主| 发表于 2017-7-19 21:15:51 | 显示全部楼层
yklstudent 发表于 2017-7-19 16:44
楼主为什么配置设置不一样?

配置一样也不行
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2017-7-20 08:59:43 | 显示全部楼层
啊,不会有这么奇怪吧,你把PF7的程序都注释掉,单试PB6看正常么
回复

使用道具 举报

11

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2017-7-14
在线时间
25 小时
发表于 2017-7-20 18:23:28 | 显示全部楼层
Anthony_brave 发表于 2017-7-19 21:13
PF7设置的是上升沿触发(下降沿触发也没有问题)
尝试把PB6硬件电路上的上拉去掉,并且把程序里面改为PB ...

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

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2017-7-20
在线时间
15 小时
发表于 2017-7-20 19:01:06 | 显示全部楼层
把6脚和7脚对换测试一遍
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165359
金钱
165359
注册时间
2010-12-1
在线时间
2110 小时
发表于 2017-7-21 01:14:52 | 显示全部楼层
仿真看寄存器差异
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-12-22 21:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表