Events STM32上升和下降按钮中断检测

Events STM32上升和下降按钮中断检测,events,stm32,interruptions,Events,Stm32,Interruptions,我有一个按钮中断: void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET){ if (/* BUTTON IS RELEASED */) { /* do something */ } if (/* BUTTON IS PRESSED */) {

我有一个按钮中断:

    void EXTI0_IRQHandler(void)
    {
        if (EXTI_GetITStatus(EXTI_Line0) != RESET){

            if (/* BUTTON IS RELEASED */) {
                /* do something */          
            }
            if (/* BUTTON IS PRESSED */) {
                /* do something else */
            }
        EXTI_ClearITPendingBit(EXTI_Line0);
        }

    }

有可能检查这个吗?

是的,有可能。您必须将
EXTI
触发方法设置为
EXTI\u Trigger\u risting\u fall
。因此,STM32在上升和下降边缘时输入
ISR
。在
ISR
中,您可以控制GPIO引脚。如果设置了GPIO Pın,则必须是上升沿,否则必须是下降沿

void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET){

        if (PIN==1) {//Rising so pressed
            /* do something */          
        }
        if (PIN==0) {Falling so released
            /* do something else */
        }
    EXTI_ClearITPendingBit(EXTI_Line0);
    }

}

注意:当下拉按钮连接到按钮时,上述操作正常。向上拉时,上升和下降将颠倒。

是的,这是可能的。您必须将
EXTI
触发方法设置为
EXTI\u Trigger\u risting\u fall
。因此,STM32在上升和下降边缘时输入
ISR
。在
ISR
中,您可以控制GPIO引脚。如果设置了GPIO Pın,则必须是上升沿,否则必须是下降沿

void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET){

        if (PIN==1) {//Rising so pressed
            /* do something */          
        }
        if (PIN==0) {Falling so released
            /* do something else */
        }
    EXTI_ClearITPendingBit(EXTI_Line0);
    }

}

注意:当下拉按钮连接到按钮时,上述操作正常。向上拉时,上升和下降将颠倒。

是。对于手动按下的按钮检测,您的代码应该可以工作。
对于某些关键信号检测,边缘和检查之间的间隔可能有意义。

是。对于手动按下的按钮检测,您的代码应该可以工作。 对于某些关键信号检测,边缘和检查之间的间隔可能有意义。

1。)EXTI设置为EXTI\u触发器\u上升\u下降

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ //interrupt handler
    if(GPIO_Pin == GPIO_PIN_4){ //check interrupt for specific pin              
        if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)){ //check pin state 
            /* do something */
        }
        
        if(!HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)){
            /* do something */
        }
    }
}

1.)EXTI设置为EXTI_触发器_上升_下降

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ //interrupt handler
    if(GPIO_Pin == GPIO_PIN_4){ //check interrupt for specific pin              
        if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)){ //check pin state 
            /* do something */
        }
        
        if(!HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)){
            /* do something */
        }
    }
}


“检查这个”是什么意思?此外,您应该按照STM32 GPIO/EXTI示例获取帮助,并填写您正在使用的确切代码。如果可以,请同时指定您的平台(处理器、评估板、您放置/焊接的任何扎带/连接等)。在99%的情况下,即没有硬件去抖动的情况下,它将无法工作。您所说的“检查”是什么意思?此外,您应该按照STM32 GPIO/EXTI示例获取帮助,并填写您正在使用的确切代码。如果可以,还请指定您的平台(处理器、评估板、您放置/焊接的任何扎带/连接等)。在99%的情况下,即没有硬件去抖动的情况下,它将无法工作。这并不能提供问题的答案。一旦你有足够的钱,你将能够;相反,这并不能回答这个问题。一旦你有足够的钱,你将能够;相反,这不太可能奏效。按钮不应以这种方式处理。这个问题已经解决了。除非实施了额外的去抖动电路,否则按钮不起作用。我完全实现了这个处理程序并对其进行了测试,来到这里寻求改进,因为它不起作用。它不太可能起作用。按钮不应以这种方式处理。这个问题已经解决了。除非实施了额外的去抖动电路,否则按钮不起作用。我完全实现了这个处理程序并对其进行了测试,来到这里寻求改进,因为它不起作用。