NRF52832----按鍵使用

1、SDK下”buttons_init”

稍微修改了一下便於理解

static void buttons_init(void)
{
    ret_code_t err_code;
	
    //這裏聲明一個按鍵配置列表,配置了按鍵對應的引腳號,上下拉,回調函數入口
    static app_button_cfg_t buttons[] =
    {
        {LEDBUTTON_BUTTON, false, BUTTON_PULL, button_event_handler}
    };

    //初始化按鍵列表的按鍵,並設定按鍵檢測的時間間隔爲50ms
    err_code = app_button_init(buttons, ARRAY_SIZE(buttons),APP_TIMER_TICKS(50));
    APP_ERROR_CHECK(err_code);

    app_button_enable();  //使能按鍵,不使能按鍵不會生效
}

記得在“sdk_config.h”裏面使能這個,不然編譯會出錯

成功初始化後,按下按鍵就會觸發回調函數了

static void button_event_handler(uint8_t pin_no, uint8_t button_action)
{
    ret_code_t err_code;

    switch (pin_no)
    {
        case LEDBUTTON_BUTTON:
					  
            NRF_LOG_INFO("button:%d",button_action);//將當前按鍵的狀態打印
            //跟藍牙消息有關,後面研究
            err_code = ble_lbs_on_button_change(m_conn_handle, &m_lbs, button_action);

            if (err_code != NRF_SUCCESS &&
            err_code != BLE_ERROR_INVALID_CONN_HANDLE &&
            err_code != NRF_ERROR_INVALID_STATE &&
            err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING)
            {
                APP_ERROR_CHECK(err_code);
            }

            break;

        default:
            APP_ERROR_HANDLER(pin_no);

            break;
        }
}

 

2、BSP相關的按鍵使用

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

    //這裏初始化了按鍵以及LED,並設定了回調函數入口
    //這個函數會調用app_button_init初始化按鍵IO,分配按鍵觸發的事件爲默認事件
    err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
    APP_ERROR_CHECK(err_code);

    //這個函數主要分配按鍵觸發的事件
    //我們可以在這裏面的"advertising_buttons_configure"添加按鍵觸發的事件
    err_code = bsp_btn_ble_init(NULL, &startup_event);
    APP_ERROR_CHECK(err_code);

    //喚醒綁定按鍵被按下,會返回1到p_erase_bonds,否則返回0
    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
}
static uint32_t advertising_buttons_configure()
{
    uint32_t err_code;

    err_code = bsp_event_to_button_action_assign(BTN_ID_DISCONNECT,
                                                 BTN_ACTION_DISCONNECT,
                                                 BSP_EVENT_DEFAULT);
    RETURN_ON_ERROR_NOT_INVALID_PARAM(err_code);

    err_code = bsp_event_to_button_action_assign(BTN_ID_WHITELIST_OFF,
                                                 BTN_ACTION_WHITELIST_OFF,
                                                 BSP_EVENT_WHITELIST_OFF);
    RETURN_ON_ERROR_NOT_INVALID_PARAM(err_code);

    err_code = bsp_event_to_button_action_assign(BTN_ID_SLEEP,
                                                 BTN_ACTION_SLEEP,
                                                 BSP_EVENT_SLEEP);
	
    //這裏的按鍵標號爲3,代表第4個按鍵
    err_code = bsp_event_to_button_action_assign(3,
		                                 BSP_BUTTON_ACTION_PUSH,
		                                 BSP_EVENT_KEY_3);
	
    RETURN_ON_ERROR_NOT_INVALID_PARAM(err_code);

    return NRF_SUCCESS;
}

 

上面的按鍵標號是3,因爲事件其實是記錄在

static bsp_button_event_cfg_t m_events_list[BUTTONS_NUMBER] = {{BSP_EVENT_NOTHING, BSP_EVENT_NOTHING}};

這個事件列表裏面的,3代表列表的第4個元素。

而m_events_list又在按鍵初始化列表的默認回調函數中被使用

“static void bsp_button_event_handler(uint8_t pin_no, uint8_t button_action)”

在這個函數裏面有一個語句:

“ button = bsp_board_pin_to_button_idx(pin_no);”

在這裏,我們輸入形參“pin_no”==“BSP_BUTTON_3”,BSP_BUTTON_3爲16,16號引腳它會自動尋找16號引腳在按鍵初始化列表“BUTTONS_LIST”中的位號並返回,(這裏應該爲第3位)所以,當我們按下“BSP_BUTTON_3”這個按鍵後,會在“m_events_list”列表的第3個元素。產生綁定的“BSP_EVENT_KEY_3”消息,這個消息會出現在我們設定的回調函數:

err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);

 

注意,使用這個功能,需要添加兩個源文件“bsp.c”“bsp_btn_ble.c”

路徑在“nRF5_SDK_15.0.0_a53641a\components\libraries\bsp”

然後按鍵按下就能觸發事件了


static void bsp_event_handler(bsp_event_t event)
{
    ret_code_t err_code;

    switch (event)
    {
        case BSP_EVENT_SLEEP:

            break; // BSP_EVENT_SLEEP

        case BSP_EVENT_DISCONNECT:
           
            break; // BSP_EVENT_DISCONNECT

        case BSP_EVENT_WHITELIST_OFF:
  
            break; // BSP_EVENT_KEY_0

        case BSP_EVENT_KEY_3:
            nrf_gpio_pin_toggle(LED_4);
            break;	

        default:
            break;
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章