打印
[STM32F1]

相互干扰

[复制链接]
407|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kangzj|  楼主 | 2017-10-28 10:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F103 设置6个外部按键中断 相互干扰
沙发
juventus9554| | 2017-10-28 10:21 | 只看该作者
楼主详细说说怎么回事啊,这么说太笼统了

使用特权

评论回复
板凳
kangzj|  楼主 | 2017-10-28 10:22 | 只看该作者


如题。
我设置GPIOG 0-5一共6个按键做外部中断,5K电阻上拉到3.3V。现在的问题是按下其中一个按键时,除了该按键的中断响应以外,其他按键的中断有时候也被响应

使用特权

评论回复
地板
dingy| | 2017-10-28 10:24 | 只看该作者
然后呢?你是怎么应对这个的呢

使用特权

评论回复
5
kangzj|  楼主 | 2017-10-28 10:25 | 只看该作者

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

使用特权

评论回复
6
xxrs| | 2017-10-28 10:26 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
7
kangzj|  楼主 | 2017-10-28 10:28 | 只看该作者


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

使用特权

评论回复
8
pangb| | 2017-10-28 10:32 | 只看该作者
可能板子画的不好,有互相干扰吧;

使用特权

评论回复
9
ousj| | 2017-10-28 10:33 | 只看该作者
我也遇到过同样的问题,不过我没有外拉的电阻

使用特权

评论回复
10
morrisk| | 2017-10-28 10:34 | 只看该作者
硬件问题的可能性比较大,我的一点干扰都没有

使用特权

评论回复
11
dengdc| | 2017-10-28 10:35 | 只看该作者

先检测一下硬件电路,看看有没有问题

使用特权

评论回复
12
kangzj|  楼主 | 2017-10-28 10:57 | 只看该作者

1.硬件上面,外部接了5K的上拉电阻。
2.软件上面设置成上拉

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

使用特权

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

使用特权

评论回复
14
chuxh| | 2017-10-28 11:11 | 只看该作者
为什么是一直相应?

使用特权

评论回复
15
juventus9554| | 2017-10-28 11:12 | 只看该作者
上升沿和高电平不是一回是吧? 没用过STM32

使用特权

评论回复
16
stly| | 2017-10-28 11:18 | 只看该作者
我遇到过类似情况,当时GPIO设置的是上拉输入,我测了一下管脚一直是高电平。

使用特权

评论回复
17
huangchui| | 2017-10-28 13:39 | 只看该作者
然后呢?你是怎么应对这个的呢

使用特权

评论回复
18
stly| | 2017-10-28 13:43 | 只看该作者
后将GPIO设置为下拉输入。硬件上io管脚啥也没接。结果OK了。

使用特权

评论回复
19
kangzj|  楼主 | 2017-10-28 13:44 | 只看该作者
还是没有解决这个问题啊   我用示波器观察了输入引脚   电平没有变化

使用特权

评论回复
20
pengf| | 2017-10-28 13:46 | 只看该作者
上升沿和高电平当然不一样了

使用特权

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

本版积分规则

672

主题

7007

帖子

2

粉丝