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