0

我有按钮中断:

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

    }

有没有可能检查这个?

4

3 回答 3

5

对的,这是可能的。您必须将EXTI触发方法设置为EXTI_Trigger_Rising_Falling。所以STM32ISR在上升沿和下降沿时进入。ISR你可以控制GPIO引脚。如果设置了GPIO引脚,它必须是上升沿,否则它必须是下降沿 。

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

}

注意:以上行为正确,下拉连接到按钮。随着上拉,上升和下降将反转。

于 2014-10-10T19:57:50.127 回答
1

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

于 2019-04-18T02:20:12.427 回答
0

1.) EXTI 设置为 EXTI_Trigger_Rising_Falling。

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 */
        }
    }
}

或者

    if((GPIOE -> IDR & GPIO_PIN_4)){ //IF STATUS PIN is HIGH
        /* do something */
    }
    if(!(GPIOE -> IDR & GPIO_PIN_4)){ //IF STATUS PIN is LOW
        /* do something */
    }
于 2020-08-26T13:40:38.673 回答