藍(lán)牙芯片nRF5283的按鍵實(shí)現(xiàn)

開發(fā)板默認(rèn)的有4個(gè)button,實(shí)際使用中,有可能只設(shè)置一個(gè)button,button的行為定義為:短按休眠和喚醒,長按關(guān)機(jī)。對應(yīng)的nRF5283 SDK中的 BSP_EVENT_SLEEP和BSP_EVENT_SYSOFF。

1. 修改BUTTONS_NUMBER及pin腳

#define BUTTONS_NUMBER 1

#define BUTTON_START   23
#define BUTTON_1       23
#define BUTTON_STOP    23
#define BUTTON_PULL    NRF_GPIO_PIN_PULLUP

2. 應(yīng)用中注釋掉默認(rèn)的bsp_btn_ble_init

默認(rèn)的buttons_leds_init中注釋掉bsp_btn_ble_init,該模塊注冊了過多的event事件,或者修改自己所需要的,比如按鍵斷開鏈接等。

static void buttons_leds_init(bool * p_erase_bonds)
{
    bsp_event_t startup_event;

    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
    APP_ERROR_CHECK(err_code);

   // err_code = bsp_btn_ble_init(NULL, &startup_event);
   // APP_ERROR_CHECK(err_code);

    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
}

注釋掉bsp_btn_ble.c中NRF_SDH_BLE_OBSERVER,否則長按會(huì)配置的斷開鏈接?;蛘咴趕dk_config.h中取消該observer的配置。

//NRF_SDH_BLE_OBSERVER(m_ble_observer, BSP_BTN_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);

3. 修改bsp.c的bsp_init中事件注冊函數(shù)

將默認(rèn)的BSP_EVENT_DEFAULT注冊為期望的BSP_EVENT_SLEEP和BSP_EVENT_SYSOFF。

        for (num = 0; ((num < BUTTONS_NUMBER) && (err_code == NRF_SUCCESS)); num++)
        {
            err_code = bsp_event_to_button_action_assign(num, BSP_BUTTON_ACTION_PUSH, BSP_EVENT_DEFAULT);
        }

改為

        for (num = 0; ((num < BUTTONS_NUMBER) && (err_code == NRF_SUCCESS)); num++)
        {
            err_code = bsp_event_to_button_action_assign(num, BSP_BUTTON_ACTION_PUSH, BSP_EVENT_SLEEP);
            err_code = bsp_event_to_button_action_assign(num, BSP_BUTTON_ACTION_LONG_PUSH , BSP_EVENT_SYSOFF);
        }

4. bsp_event_handler中增加事件響應(yīng)

在BSP_EVENT_SLEEP和BSP_EVENT_SYSOFF響應(yīng)對應(yīng)的事件

void bsp_event_handler(bsp_event_t event)
{
    uint32_t err_code;
    switch (event)
    {
        case BSP_EVENT_SLEEP:
            sleep_mode_enter();
            break;
    case BSP_EVENT_SYSOFF:                       /**< The device should enter system off mode (without wakeup). */
        break;
        default:
            break;
    }
}

5. 修改長按時(shí)間

#define BSP_LONG_PUSH_TIMEOUT_MS (1000) /**< The time to hold for a long push (in milliseconds). */

至此,從長按時(shí)間,到事件的注冊,最終事件響應(yīng)完成,效果如下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容