打印
[STM32F1]

STM32F103 设置6个外部按键中断 相互干扰

[复制链接]
5541|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wallwall1111|  楼主 | 2015-6-10 09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题。
我设置GPIOG 0-5一共6个按键做外部中断,5K电阻上拉到3.3V。现在的问题是按下其中一个按键时,除了该按键的中断响应以外,其他按键的中断有时候也被响应,求大师指导!

1.硬件上面,外部接了5K的上拉电阻。
2.软件上面我设置成上拉,同样也是没有效果。
3.我换了几个STM32,都有同样的问题。
4.请教,这个问题是不是STM32的BUG啊!

程序:
void EXTI_SetupNVIC(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);

        /*Configureonebitforpreemptionpriority*/
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);// 1bitsforpre-emptionpriority //3bitsforsubpriority*/)        
        /*EnabletheEXTI9_5Interrupt*/
        NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
//        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        /*EnabletheEXTI15_10Interrupt*/
        NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        
        /*EnabletheEXTI15_10Interrupt*/
        NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);        
        
        
        /*EnabletheEXTI15_10Interrupt*/
        NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);        
        
        
        /*EnabletheEXTI15_10Interrupt*/
        NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        /*EnabletheEXTI15_10Interrupt*/
        NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
}


void EXTI_SetupGPIO(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;/* ¶¨ÒåÒ»¸öGPIO³õʼ»¯½á¹¹Ìå */
/*ConfigurePB9asinputfloating(EXTILine9)*/
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOG,&GPIO_InitStructure);
        
        /*ConfigurePC13asinputfloating(EXTILine13)*/
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOG,&GPIO_InitStructure);

        /*ConfigurePC13asinputfloating(EXTILine13)*/
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOG,&GPIO_InitStructure);        
        
        /*ConfigurePC13asinputfloating(EXTILine13)*/
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOG,&GPIO_InitStructure);        
        
        /*ConfigurePC13asinputfloating(EXTILine13)*/
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOG,&GPIO_InitStructure);        
        
        /*ConfigurePC13asinputfloating(EXTILine13)*/
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOG,&GPIO_InitStructure);        

}
void EXTI_Configure(void)
{
        EXTI_InitTypeDef EXTI_InitStructure;

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource0);        
        EXTI_InitStructure.EXTI_Line=EXTI_Line0;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);
        
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource1);         
        EXTI_InitStructure.EXTI_Line=EXTI_Line1;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);
        
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource2);
        EXTI_InitStructure.EXTI_Line=EXTI_Line2;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
        
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource3);
        EXTI_InitStructure.EXTI_Line=EXTI_Line3;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
        
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource4);
        EXTI_InitStructure.EXTI_Line=EXTI_Line4;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
        
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource5);
        EXTI_InitStructure.EXTI_Line=EXTI_Line5;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
}
void EXTI_SETUP(void)
{
        EXTI_Clock();
        EXTI_SetupNVIC();
        EXTI_SetupGPIO();
        EXTI_Configure();
}
沙发
mmuuss586| | 2015-6-10 12:24 | 只看该作者

可能板子画的不好,有互相干扰吧;

使用特权

评论回复
板凳
Gerrard_8| | 2015-6-10 13:56 | 只看该作者
我也遇到过同样的问题,不过我没有外拉的电阻

使用特权

评论回复
地板
sjw1716094642| | 2015-6-10 14:02 | 只看该作者
硬件问题的可能性比较大,我的一点干扰都没有

使用特权

评论回复
5
可可球| | 2015-6-10 15:34 | 只看该作者
先检测一下硬件电路,看看有没有问题

使用特权

评论回复
6
sting_yang| | 2015-6-10 20:19 | 只看该作者
1.硬件上面,外部接了5K的上拉电阻。
2.软件上面设置成上拉

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; 上升沿响应
这样设定,应该一直响应!

使用特权

评论回复
7
zchong| | 2015-6-10 20:56 | 只看该作者
如果觉得软件设置的没有问题,那就怀疑硬件的确产生中断了,可以用示波器量一下那些管脚

使用特权

评论回复
8
wang198203| | 2015-6-10 21:47 | 只看该作者
sting_yang 发表于 2015-6-10 20:19
1.硬件上面,外部接了5K的上拉电阻。
2.软件上面设置成上拉

为什么是一直相应?上升沿和高电平不是一回是吧? 没用过STM32

使用特权

评论回复
9
sting_yang| | 2015-6-11 10:31 | 只看该作者
wang198203 发表于 2015-6-10 21:47
为什么是一直相应?上升沿和高电平不是一回是吧? 没用过STM32

Sorry,我理解错误,谢谢指正

使用特权

评论回复
10
Gerrard_8| | 2015-6-11 10:59 | 只看该作者
哥们你这是一个很好的帖子,解决了别忘记回来说一下,我会持续关注。要是解决不了,我可以跟你交流一下

使用特权

评论回复
11
墨染卿卿| | 2015-8-14 17:11 | 只看该作者
我遇到过类似情况,当时GPIO设置的是上拉输入,我测了一下管脚一直是高电平。
后将GPIO设置为下拉输入。硬件上io管脚啥也没接。结果OK了。

使用特权

评论回复
12
wallwall1111|  楼主 | 2015-8-28 10:10 | 只看该作者
Gerrard_8 发表于 2015-6-11 10:59
哥们你这是一个很好的帖子,解决了别忘记回来说一下,我会持续关注。要是解决不了,我可以跟你交流一下 ...

o(︶︿︶)o 唉   还是没有解决这个问题啊   我用示波器观察了输入引脚   电平没有变化

使用特权

评论回复
13
lwsn| | 2015-8-30 20:37 | 只看该作者
上升沿和高电平当然不一样了

使用特权

评论回复
14
lefeng| | 2015-8-30 20:49 | 只看该作者
测试结果线路有问题吗

使用特权

评论回复
15
yangxf1217| | 2015-12-7 10:34 | 只看该作者
去掉外部上啦试试把,内外都上拉会不稳定,我之前遇到的中断老是多一次。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

8

帖子

2

粉丝