打印
[STM32F1]

STM32F1短路断路针脚实现外部中断,触发不稳定

[复制链接]
1716|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lando|  楼主 | 2020-3-16 10:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因为产品需要,要短路2个针脚,一个针脚设置为推挽输出,50MZ。一个针脚设置为浮空输入,并设置为捕捉上升沿和下降沿的外部中断位。然后用杜邦线将两个针脚插一起。这个时候应该是触发上升沿,然后拔掉一个针脚,应该是触发下降沿的。结果非常不好用。有时拔掉以后,也不触发下降沿。有时插上不触发上升沿,有时杜邦线活动一下,就不断的进中断。已经加了软件消抖。
想问一下,我的代码有问题吗?如果没问题,那我是不是要加电容解决?加多少,怎么加合适?如果不建议这种方式,那怎么做能判断一个线路是通路还是短路呢?
请大神帮忙!!!
#define LOCK_EXIT_GPIO_CLK                                         RCC_APB2Periph_GPIOA
#define LOCK_EXIT_GPIO_PORT                                         GPIOA
#define LOCK_EXIT_GPIO_PIN                                         GPIO_Pin_4
#define LOCK_EXIT_GPIO_PORTSOURCE          GPIO_PortSourceGPIOA
#define LOCK_EXIT_GPIO_PINSOURCE          GPIO_PinSource4
#define LOCK_EXIT_LINE                                                  EXTI_Line4
#define LOCK_EXIT_IRQN                                                        EXTI4_IRQn
#define LOCK_EXIT_IRQHANDLER                                EXTI4_IRQHandler

#define LOCK_STA GPIO_ReadInputDataBit(LOCK_EXIT_GPIO_PORT, LOCK_EXIT_GPIO_PIN)

#define LOCK_OUT_GPIO_CLK                                         RCC_APB2Periph_GPIOA
#define LOCK_OUT_GPIO_PORT                                 GPIOA
#define LOCK_OUT_GPIO_PIN                                         GPIO_Pin_5

lock_gpio.GPIO_Pin = LOCK_EXIT_GPIO_PIN;
        lock_gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(LOCK_EXIT_GPIO_PORT, &lock_gpio);
      
        lock_gpio.GPIO_Pin = LOCK_OUT_GPIO_PIN;   
        lock_gpio.GPIO_Mode = GPIO_Mode_Out_PP;      
        lock_gpio.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(LOCK_OUT_GPIO_PORT, &lock_gpio);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
      
        GPIO_EXTILineConfig(LOCK_EXIT_GPIO_PORTSOURCE, LOCK_EXIT_GPIO_PINSOURCE);
        lock_exti.EXTI_Line = LOCK_EXIT_LINE;
        lock_exti.EXTI_Mode = EXTI_Mode_Interrupt;
        lock_exti.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
        lock_exti.EXTI_LineCmd = ENABLE;
      
        EXTI_Init(&lock_exti);
      
        GPIO_SetBits(LOCK_OUT_GPIO_PORT, LOCK_OUT_GPIO_PIN);

char lockStatus;
char isUnLock;
void LOCK_EXIT_IRQHANDLER(void)
{
         if(EXTI_GetITStatus(LOCK_EXIT_LINE) != RESET){
                        
                 if(LOCK_STA != lockStatus){
                                delay_ms(10);
                         if(LOCK_STA != lockStatus){
                                if(!isUnLock){
                                        lockStatus = LOCK_STA;
                                        isUnLock = 1;
                                 }
                         }
                 }
         }
         delay_ms(100);
         EXTI_ClearITPendingBit(LOCK_EXIT_LINE);
}

使用特权

评论回复
评论
lando 2020-3-19 11:32 回复TA
@xch :是啊 
xch 2020-3-17 18:09 回复TA
针脚 = 管脚? 
来自 2楼
一事无成就是我| | 2020-3-18 21:53 | 只看该作者
大致明白了你的意思,这个功能可以实现,去年我有个东西就是那么做的
1:两个管脚不能直接连,用个1~5K的电阻,当然你可以直接杜邦线连,不过你就要多烧香估计可行,输出用上拉,输入用下拉,80%的几率是高(请原谅我不厚道的笑)
2:检测到H马上翻转入下降检测,不需要电容,用“滴答”1mS为基准延时,50Mhz不现实,会成神经病的

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
lando + 2 赞一个!
板凳
香水城| | 2020-3-16 11:31 | 只看该作者
对你这个测法很好奇。

什么叫插上上升沿,拔下下降沿? 你那个配置为输入的管脚没接外部电路的话,电平就是不定的。

使用特权

评论回复
地板
lando|  楼主 | 2020-3-16 14:21 | 只看该作者
香水城 发表于 2020-3-16 11:31
对你这个测法很好奇。

什么叫插上上升沿,拔下下降沿? 你那个配置为输入的管脚没接外部电路的话,电平就 ...

没接外部电路,难道不能使用stm32的针脚供电,必须由外部供电?

使用特权

评论回复
5
zchong| | 2020-3-16 19:28 | 只看该作者
你要测一个50MHz的信号?还是50Hz,还是电平,慢慢来,表达清楚。

使用特权

评论回复
6
lando|  楼主 | 2020-3-16 19:46 | 只看该作者
zchong 发表于 2020-3-16 19:28
你要测一个50MHz的信号?还是50Hz,还是电平,慢慢来,表达清楚。

你好,我是想将一个输入针脚与一个输出针脚相接,输入针脚有外部中断,这样当我插拔其中任意一个针脚时,就会捕捉上升沿或者下降沿。

使用特权

评论回复
7
又东风| | 2020-3-16 22:20 | 只看该作者
看你实时性不高,就直接用一个定时器计时,每10ms时间到了,在中断外面,去读取IO状态,然后通过两次读取获得状态,不需要外部中断。在中断中加入延时,如果你的延时是死等延时,系统实时性降低,且你逻辑有问题,假设插上上锁,拔掉解锁。当你上锁时,因解锁进入中断,在10ms延时时因抖动进入上锁状态,然后直接退出第二条判断语句,然后直接到100ms延时,延时时间时状态稳定为解锁状态,然后清中断标志位,此时退出中断后,无法再进中断,且标志位也未更新,达不到效果。

使用特权

评论回复
8
aerwa| | 2020-3-17 07:10 | 只看该作者
我觉得你应该分开调试,单独输入中断脚插拔是否有问题。你这样和输出连在一起测有点混淆,假如输出一直输出低怎么测试上升元。同时硬件上要保证满足中断的工作条件,可以用示波器观察状态。是不是移动电源上的负载插拔检测?

使用特权

评论回复
9
gx_huang| | 2020-3-17 07:25 | 只看该作者
如果你连简单的浮空输入是什么意思都不懂,得学习一下基础的电路知识了。否则,就不要做MCU底层驱动编程了。

使用特权

评论回复
10
梦幻泡影| | 2020-3-17 08:33 | 只看该作者
加一个RC电路吧,稳定点。不过你这逻辑我有点搞不明白,用单片机的IO去检测另一个IO,有点像脱裤子放屁似的,能用软件搞定的事就不要去动硬件了

使用特权

评论回复
评论
icecut 2020-3-17 11:47 回复TA
它在防止带电**. 
11
hufuju| | 2020-3-17 08:52 | 只看该作者
手动按钮或插接件的地方都要加滤波电容,103--104,否则信号有抖动的。

使用特权

评论回复
12
hufuju| | 2020-3-17 09:02 | 只看该作者
  • void LOCK_EXIT_IRQHANDLER(void)    //这是中断函数吗
  • {
  •          if(EXTI_GetITStatus(LOCK_EXIT_LINE) != RESET){
  •                  if(LOCK_STA != lockStatus){
  •                                 delay_ms(10);    //延迟10ms
  •                          if(LOCK_STA != lockStatus){
  •                                 if(!isUnLock){
  •                                         lockStatus = LOCK_STA;
  •                                         isUnLock = 1;
  •                                  }
  •                          }
  •                  }
  •          }
  •          delay_ms(100);   //延迟100ms
  •          EXTI_ClearITPendingBit(LOCK_EXIT_LINE);
  • }
  • 如果上面的是中断函数,里面加这么久的延迟是不科学的,所以会出现异常现象

使用特权

评论回复
13
icecut| | 2020-3-17 11:47 | 只看该作者
用示波器看看不就明白了...我猜加上示波器就好了

使用特权

评论回复
14
lando|  楼主 | 2020-3-17 13:05 | 只看该作者
又东风 发表于 2020-3-16 22:20
看你实时性不高,就直接用一个定时器计时,每10ms时间到了,在中断外面,去读取IO状态,然后通过两次读取获 ...

确实,程序有问题,谢谢你了

使用特权

评论回复
15
lando|  楼主 | 2020-3-17 13:07 | 只看该作者
hufuju 发表于 2020-3-17 09:02
  • void LOCK_EXIT_IRQHANDLER(void)    //这是中断函数吗
  • {
  •          if(EXTI_GetITStatus(LOCK_EX ...

  • 正常中断里加延时多少以内最好呢,盼赐教!

    使用特权

    评论回复
    16
    光轮TreeOS| | 2020-3-17 13:59 | 只看该作者
    手动插拔抖动会很严重的。

    使用特权

    评论回复
    17
    WoodData| | 2020-3-17 14:55 | 只看该作者
    输入IO不要配置浮空输入!!

    使用特权

    评论回复
    18
    xch| | 2020-3-17 18:23 | 只看该作者
    本帖最后由 xch 于 2020-3-17 18:42 编辑

    可能翻转速度太快。脉冲高/低电平的宽度都必须大于 MCU IO总线时钟的周期。
    把50Mhz 输出改成1MHZ输出可能就行。

    使用特权

    评论回复
    19
    梦幻泡影| | 2020-3-18 09:16 | 只看该作者
    lando 发表于 2020-3-17 13:07
    正常中断里加延时多少以内最好呢,盼赐教!

    中断函数是用来获取状态,读数据的,不是用来搞事情的,如果要检测按键,最好用事件去处理,另外,外部电路是必须的

    使用特权

    评论回复
    20
    full_stack| | 2020-3-18 15:51 | 只看该作者
    推挽输出的管脚不变的话,为啥不直接用VCC于输入管脚测试

    使用特权

    评论回复
    21
    七颗咖啡豆| | 2020-3-18 17:14 | 只看该作者
    推完输出   没有上下拉
    浮空输入   建议加下拉电阻

    使用特权

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

    本版积分规则

    2

    主题

    15

    帖子

    1

    粉丝