2017-12-21 17 views

Antwort

0

Edit: Wie suggested by PeterJ_01, ein Timer-Interrupt verwendet, ist die eleganteste Art und Weise. Verwenden Sie den GPIO-Interrupt nicht für Schaltflächen!

Wenn Sie die Hardware Abstraction Layer (HAL) Bibliothek verwenden, können Sie so etwas wie dies in Ihrem GPIO Interrupt tun:

static int timestamp_pressed = -1; // -1 means not pressed 

if (timestamp_pressed == -1) { 
    // user just pressed the button 
    timestamp_pressed = HAL_GetTick(); // milliseconds since startup 
} else if (HAL_GetTick() - timestamp_pressed > 2000) { 
    // 2000 milliseconds = 2 seconds are over 
    // << your code 

    timestamp_pressed = -1; 
} 

Wenn Sie nicht HAL verwenden und wollen keinen regelmäßigen Timer-Interrupt verwenden (von TIM1, TIM2, TIM3, ...) können Sie den SysTick-Timer verwenden (mit oder ohne Interrupt). Es gibt viele Informationen darüber im Internet;)

+1

mit EXTI-Interrupts für die Tasten ist der große Fehler und sollte vermieden werden. –

+0

Warum ist das so? Wegen Kontaktprellen? (Wenn ja, könnte das nicht in ähnlicher Weise gelöst werden, wie ich es vorgeschlagen habe - oder ist das ein schlechter Stil?) – MemAllox

+0

, weil Sie die Programmausführung im Interrupt für die Zeit des Entprellens blockieren müssen. Timer-Interrupts sollten dafür verwendet werden. –