Как правильно реализовать комбинации кнопок с STM32? - PullRequest
0 голосов
/ 15 апреля 2019

Я хочу связать некоторые тактильные кнопки с STM32.Затем, основываясь на комбинации нажатий кнопок в течение определенного периода времени, мне нужно выполнить разные функции.

Я знаю, что использование HAL_Delays остановит программу, и я не хочу этого делать.Я полагаю, таймеры - это путь.В таком случае, что я должен использовать в качестве периода времени.И я должен опросить счетчик таймера?Какой стандартный и безошибочный способ сделать это?

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Существует несколько возможностей, но простой способ - зафиксировать время события нажатия кнопки и сравнить его с текущим временем.

Аппаратно-интенсивный метод состоит в подключении каждой кнопки ктаймер захвата входа.Время нажатия кнопки будет зафиксировано, и время ее удержания будет текущим значением таймера минус время захвата.Затем ваше приложение может определить для каждой кнопки, которая находится в нерабочем состоянии, как долго это было.

Однако для этого метода требуется по одной единице захвата таймера для каждой кнопки.Менее дорогостоящее решение состоит в том, чтобы подключить каждую кнопку к входу GPIO EXTI и для каждой кнопки зафиксировать время нажатия кнопки на прерывании при нажатии кнопки.

В любом случае обработка захваченного времени идентична.

Псевдокод:

int downTime( int button_id ) 
{
    int down_time = 0 ;

    // If the button is down, report how long it has been down
    if( buttonDown( button_id ) )
    {
        down_time = buttonTimerNow( button_id ) - buttonTimerCapture( button_id ) ;
    }

    return down_time ;
}

bool pressed( int button_id )
{
    // The button is pressed, if it has been down for 
    // longer than the switch bounce time.
    return downTime( button_id ) > DEBOUNCE_TIME ;
}

bool combinationPressed()
{
    // Test for the required combination of currently 
    // simultaneously pressed buttons.
    return pressed( BUTTON_A ) && pressed( BUTTON_B ) ;
}
0 голосов
/ 17 апреля 2019

используйте периодическое прерывание, как здесь: https://www.diymat.co.uk/arm-three-function-click-double-and-long-click-button-library-timer-interrupt-driven/

...