[STM32F1] 相互干扰

[复制链接]
 楼主| kangzj 发表于 2016-10-30 18:22 | 显示全部楼层 |阅读模式
STM32F103 设置6个外部按键中断 相互干扰
juventus9554 发表于 2016-10-30 18:27 | 显示全部楼层
楼主详细说说怎么回事啊,这么说太笼统了
 楼主| kangzj 发表于 2016-10-30 18:29 | 显示全部楼层

如题。
我设置GPIOG 0-5一共6个按键做外部中断,5K电阻上拉到3.3V。现在的问题是按下其中一个按键时,除了该按键的中断响应以外,其他按键的中断有时候也被响应
dingy 发表于 2016-10-30 18:30 | 显示全部楼层
然后呢?你是怎么应对这个的呢
 楼主| kangzj 发表于 2016-10-30 18:34 | 显示全部楼层
1.硬件上面,外部接了5K的上拉电阻。
2.软件上面我设置成上拉,同样也是没有效果。
3.我换了几个STM32,都有同样的问题。
4.请教,这个问题是不是STM32的BUG啊!
栩栩如生 发表于 2016-10-30 18:35 | 显示全部楼层
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
 楼主| kangzj 发表于 2016-10-30 18:38 | 显示全部楼层

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();
}
pangb 发表于 2016-10-30 18:40 | 显示全部楼层
可能板子画的不好,有互相干扰吧;
ousj 发表于 2016-10-30 18:42 | 显示全部楼层
我也遇到过同样的问题,不过我没有外拉的电阻
morrisk 发表于 2016-10-30 18:44 | 显示全部楼层
硬件问题的可能性比较大,我的一点干扰都没有
dengdc 发表于 2016-10-30 18:45 | 显示全部楼层
先检测一下硬件电路,看看有没有问题
 楼主| kangzj 发表于 2016-10-30 18:47 | 显示全部楼层
1.硬件上面,外部接了5K的上拉电阻。
2.软件上面设置成上拉

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; 上升沿响应
这样设定,应该一直响应!
zwll 发表于 2016-10-30 18:49 | 显示全部楼层
如果觉得软件设置的没有问题,那就怀疑硬件的确产生中断了,可以用示波器量一下那些管脚
chuxh 发表于 2016-10-30 18:52 | 显示全部楼层
为什么是一直相应?
juventus9554 发表于 2016-10-30 18:53 | 显示全部楼层
上升沿和高电平不是一回是吧? 没用过STM32
司徒老鹰 发表于 2016-10-30 18:55 | 显示全部楼层
我遇到过类似情况,当时GPIO设置的是上拉输入,我测了一下管脚一直是高电平。
huangchui 发表于 2016-10-30 18:58 | 显示全部楼层
然后呢?你是怎么应对这个的呢
司徒老鹰 发表于 2016-10-30 19:01 | 显示全部楼层
后将GPIO设置为下拉输入。硬件上io管脚啥也没接。结果OK了。
 楼主| kangzj 发表于 2016-10-30 19:04 | 显示全部楼层
还是没有解决这个问题啊   我用示波器观察了输入引脚   电平没有变化
pengf 发表于 2016-10-30 19:06 | 显示全部楼层
上升沿和高电平当然不一样了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

672

主题

7007

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

672

主题

7007

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部