野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10849|回复: 11

同一条中断线的不同端口外部中断讨论

[复制链接]
发表于 2016-9-22 20:39:39 | 显示全部楼层 |阅读模式
平衡车今天遇到一个问题,编写按键驱动程序时候KEY1、KEY2只能使用其中一个按键,而且经查每个按键的配置单独使用都正常。三个按键分别为KEY1----PA12、KEY2----PC12、KEY3----PB5,那么有KEY1/KEY2两个按键在同一条中断线EXTI_Line12上。
配置时候后面一个总会覆盖前面的配置。例如:
       //KEY1----PA12
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource12);
        EXTI_InitStructure.EXTI_Line = EXTI_Line12;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);       
               
        //KEY2----PC12
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_Init(GPIOC,&GPIO_InitStructure);       
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC , GPIO_PinSource12);
        EXTI_InitStructure.EXTI_Line = EXTI_Line12;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);

那么上述的配置完毕后就只能进入key2的中断服务函数,key1按键将不能使用。


经查, GPIO_Port_Sources它并不像其它寄存器一样,每一个bit代表一个数据,而是如下:
/** @defgroup GPIO_Port_Sources
  * @{
  */


#define GPIO_PortSourceGPIOA       ((uint8_t)0x00)
#define GPIO_PortSourceGPIOB       ((uint8_t)0x01)
#define GPIO_PortSourceGPIOC       ((uint8_t)0x02)
#define GPIO_PortSourceGPIOD       ((uint8_t)0x03)
#define GPIO_PortSourceGPIOE       ((uint8_t)0x04)
#define GPIO_PortSourceGPIOF       ((uint8_t)0x05)
#define GPIO_PortSourceGPIOG       ((uint8_t)0x06)



也就是说GPIO_PortSourceGPIOB    |   GPIO_PortSourceGPIOC       它并不是开启两者信号源,而是变成了GPIO_PortSourceGPIOD      
因此,这里可以看出同一条中断线的不同中断源不能同时使用。不知道这个结论是否正确?






回复

使用道具 举报

发表于 2016-9-22 21:48:40 来自手机 | 显示全部楼层
不能同时使用的,按键也并不是同时按下的吧。在中断函数里面再通过读取IDR寄存器的值来判断是哪个io接的按键有效。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-22 22:03:43 | 显示全部楼层
fire 发表于 2016-9-22 21:48
不能同时使用的,按键也并不是同时按下的吧。在中断函数里面再通过读取IDR寄存器的值来判断是哪个io接的按 ...

嗯嗯,也就是帖子结论是对的。这个在STM32 的手册上没注意到相关注意事项,新手需要注意,尤其是在一些项目中使用多个按键时最好分开中断线
回复 支持 反对

使用道具 举报

发表于 2016-9-23 09:54:25 | 显示全部楼层
不懂,但我还是帮顶!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-23 15:09:24 | 显示全部楼层
落花笑彷徨ㄟ 发表于 2016-9-23 09:54
不懂,但我还是帮顶!!!

简单的说就是假如同时有几个外部中断PA0、PB0、PC0、PD0、PE0. 那么这几个中断都在一条中断线上EXTI_Line0,这几个外部中断只能使用其中一个,其它的不管你怎么电平变化都不会有效果,画原理图IO口选择上需要注意这一点咯
回复 支持 反对

使用道具 举报

发表于 2016-10-6 22:10:24 | 显示全部楼层
fire 发表于 2016-9-22 21:48
不能同时使用的,按键也并不是同时按下的吧。在中断函数里面再通过读取IDR寄存器的值来判断是哪个io接的按 ...

火哥!如果这个按键持续时间很短(毕竟还要有一个消抖的过程),当你读他的电平状态时,他已经是低电平了,那不是就不能分辨出来了?
回复 支持 反对

使用道具 举报

发表于 2016-10-17 20:36:49 来自手机 | 显示全部楼层
smtudou 发表于 2016-10-6 22:10
火哥!如果这个按键持续时间很短(毕竟还要有一个消抖的过程),当你读他的电平状态时,他已经是低电平了 ...

不会的,跟普通的按键检测一样,不过是在中断中进行的。除非你消抖时间过长。
回复 支持 反对

使用道具 举报

发表于 2016-11-1 16:36:25 | 显示全部楼层
fire 发表于 2016-9-22 21:48
不能同时使用的,按键也并不是同时按下的吧。在中断函数里面再通过读取IDR寄存器的值来判断是哪个io接的按 ...

火哥的意思是PB0和PC0都挂到中断线0上,然后在进入中断的时候再判断是哪一个按键?
可是只有一个端口能挂上去,假如是PC0挂上去了,PB0不管怎么按都不会进入中断啊,这怎么能判断到哪个按键有效
回复 支持 反对

使用道具 举报

发表于 2016-11-1 16:40:25 | 显示全部楼层
望着你发槑 发表于 2016-11-1 16:36
火哥的意思是PB0和PC0都挂到中断线0上,然后在进入中断的时候再判断是哪一个按键?
可是只有一个端口能 ...

要么你硬件设计的有错,要么程序写的有错,肯定是可以同时挂的。
回复 支持 反对

使用道具 举报

发表于 2016-11-1 17:18:02 | 显示全部楼层
fire 发表于 2016-11-1 16:40
要么你硬件设计的有错,要么程序写的有错,肯定是可以同时挂的。

那楼主的结论岂不是错了。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-3 17:12:14 | 显示全部楼层
望着你发槑 发表于 2016-11-1 17:18
那楼主的结论岂不是错了。。。。

我之前测试平衡车的两个同一条中断线的按键,配置外部中断的IO口只能配置一个,也就是说只有一个IO口可以正常进入中断,另外一个按键无效(不能进入中断),因此无法在进入中断后再判断具体是哪个IO口引起的中断。
回复 支持 反对

使用道具 举报

发表于 2016-11-4 19:16:49 | 显示全部楼层
牧梦苍穹 发表于 2016-11-3 17:12
我之前测试平衡车的两个同一条中断线的按键,配置外部中断的IO口只能配置一个,也就是说只有一个IO口可以 ...

我写程序的时候也不能同时挂。。。。。
火哥@fire 请教一下怎么同时挂啊
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 22:08 , Processed in 0.030872 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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